-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathblog.html
21 lines (21 loc) · 26.4 KB
/
blog.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<!doctype html>
<html lang="en" dir="ltr" class="blog-wrapper blog-list-page plugin-blog plugin-id-default">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v2.4.1">
<title data-rh="true">Blog | Tech Blog</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://marksmurphy.github.io/blog"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" property="og:title" content="Blog | Tech Blog"><meta data-rh="true" name="description" content="Blog"><meta data-rh="true" property="og:description" content="Blog"><meta data-rh="true" name="docusaurus_tag" content="blog_posts_list"><meta data-rh="true" name="docsearch:docusaurus_tag" content="blog_posts_list"><link data-rh="true" rel="icon" href="/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://marksmurphy.github.io/blog"><link data-rh="true" rel="alternate" href="https://marksmurphy.github.io/blog" hreflang="en"><link data-rh="true" rel="alternate" href="https://marksmurphy.github.io/blog" hreflang="x-default"><link rel="alternate" type="application/rss+xml" href="/blog/rss.xml" title="Tech Blog RSS Feed">
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Tech Blog Atom Feed"><link rel="stylesheet" href="/assets/css/styles.603af9ce.css">
<link rel="preload" href="/assets/js/runtime~main.d8e15a5e.js" as="script">
<link rel="preload" href="/assets/js/main.cba81dbf.js" as="script">
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/"><div class="navbar__logo"><img src="/img/logos/transparent-grey-plain.png" alt="Logo" class="themedImage_ToTc themedImage--light_HNdA"><img src="/img/logos/transparent-grey-plain.png" alt="Logo" class="themedImage_ToTc themedImage--dark_i4oU"></div><b class="navbar__title text--truncate">Home</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/blog">Blog</a><a class="navbar__item navbar__link" href="/docs/category/npm-packages">NPM Packages</a></div><div class="navbar__items navbar__items--right"><a href="https://github.com/markSmurphy" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="Switch between dark and light mode (currently light mode)" aria-label="Switch between dark and light mode (currently light mode)" aria-live="polite"><svg viewBox="0 0 24 24" width="24" height="24" class="lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" class="darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg></button></div><div class="searchBox_ZlJk"></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0"><div class="container margin-vert--lg"><div class="row"><aside class="col col--3"><nav class="sidebar_re4s thin-scrollbar" aria-label="Blog recent posts navigation"><div class="sidebarItemTitle_pO2u margin-bottom--md">Recent posts</div><ul class="sidebarItemList_Yudw clean-list"><li class="sidebarItem__DBe"><a class="sidebarItemLink_mo7H" href="/blog/2022/10/05/Calculating-Availability-SLAs/Calculating-Availability-SLAs">Calculating Availability SLAs in Distributed Systems</a></li></ul></nav></aside><main class="col col--7" itemscope="" itemtype="http://schema.org/Blog"><article class="margin-bottom--xl" itemprop="blogPost" itemscope="" itemtype="http://schema.org/BlogPosting"><header><h2 class="title_f1Hy" itemprop="headline"><a itemprop="url" href="/blog/2022/10/05/Calculating-Availability-SLAs/Calculating-Availability-SLAs">Calculating Availability SLAs in Distributed Systems</a></h2><div class="container_mt6G margin-vert--md"><time datetime="2022-10-05T00:00:00.000Z" itemprop="datePublished">October 5, 2022</time> · <!-- -->7 min read</div><div class="margin-top--md margin-bottom--sm row"><div class="col col--6 authorCol_Hf19"><div class="avatar margin-bottom--sm"><div class="avatar__intro" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><div class="avatar__name"><a href="https://github.com/markSmurphy" target="_blank" rel="noopener noreferrer" itemprop="url"><span itemprop="name">Mark Murphy</span></a></div></div></div></div></div></header><div class="markdown" itemprop="articleBody"><h2 class="anchor anchorWithStickyNavbar_LWe7" id="complexity-in-multi-tiered-systems">Complexity in multi-tiered systems<a href="#complexity-in-multi-tiered-systems" class="hash-link" aria-label="Direct link to Complexity in multi-tiered systems" title="Direct link to Complexity in multi-tiered systems"></a></h2><p>Modern cloud-native solutions invariably employ micro-service architecture, resulting in highly distributed applications spanning multiple tiers.</p><p>The benefits of this approach are well documented and not in dispute, but it does add a certain complexity.</p><p>The complexity we're referring to here is <em>not</em> complexity of the code, nor complexity of the functionality of the solution; By <strong>complexity</strong> we mean the non-functional complexity that come hand-in-hand with multi-tiered micro-service solutions. As an end-to-end system becomes more complex, it also becomes, probabilistically, less available.</p><p>Consider the example topology below, and that each of these nine tiers will be underpinned by a given cloud service, and the service provider will publish it's availability <a href="https://en.wikipedia.org/wiki/Service-level_agreement" target="_blank" rel="noopener noreferrer">SLA</a> for each of those services; but when <em>our</em> end users expect an SLA statement about the guaranteed availability of <em>our</em> overall service, <strong>How do we calculate the availability SLA of a distributed system?</strong></p><p><a target="_blank" href="/assets/files/High_Availability_Example-020c6ae1bf55487555c18a193cc34f6a.png"><img loading="lazy" alt="Example Topology" src="/assets/images/High_Availability_Example-020c6ae1bf55487555c18a193cc34f6a.png" width="925" height="1020" class="img_ev3q"></a></p><p>To work this out for any conceivable topology, we must first understand the <strong>The relationship between complexity and availability</strong></p><hr><h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-relationship-between-complexity-and-availability">The Relationship Between Complexity and Availability<a href="#the-relationship-between-complexity-and-availability" class="hash-link" aria-label="Direct link to The Relationship Between Complexity and Availability" title="Direct link to The Relationship Between Complexity and Availability"></a></h2><p>To understand this better, let's start off with a simple topology and add complexity as we go:</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="single-tier">Single tier<a href="#single-tier" class="hash-link" aria-label="Direct link to Single tier" title="Direct link to Single tier"></a></h3><p><a target="_blank" href="/assets/files/High_Availability_Simple_Topology-6558a2046323d1505c75699067e0d10d.png"><img loading="lazy" alt="Simple Topology" src="/assets/images/High_Availability_Simple_Topology-6558a2046323d1505c75699067e0d10d.png" width="578" height="557" class="img_ev3q"></a></p><p>In the example above we have a client-side application which connects directly to a cloud hosted database, and the cloud provider's SLA states an availability of 99%.</p><p>If the database is down, then our whole system is down. So our system also, inherently, has an availability of <strong>99%</strong></p><div class="theme-admonition theme-admonition-caution alert alert--warning admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>caution</div><div class="admonitionContent_S0QG"><p>There are very good reasons why don't design <a href="https://en.wikipedia.org/w/index.php?title=Thick_client&redirect=yes" target="_blank" rel="noopener noreferrer">thick-client</a> applications anymore.</p><p>This example serves only as a baseline upon which to add complexity and examine how the system's availability evolves.</p></div></div><p>Let's make our system a little more realistic by changing it to be a browser based application and see how it changes our system's 99% Availability.</p><hr><h3 class="anchor anchorWithStickyNavbar_LWe7" id="two-tiers">Two tiers<a href="#two-tiers" class="hash-link" aria-label="Direct link to Two tiers" title="Direct link to Two tiers"></a></h3><p>If we add a web server between the client and the database we're introducing a new tier into our system.</p><p><a target="_blank" href="/assets/files/High_Availability_Web_app-3b1da924e17ff61bc1eb598460ce68ae.png"><img loading="lazy" alt="Web Application Topology" src="/assets/images/High_Availability_Web_app-3b1da924e17ff61bc1eb598460ce68ae.png" width="580" height="592" class="img_ev3q"></a></p><p>The client's browser uses <code>HTTPS</code> to communicate with the web server, and the application hosted on the web server connects to the database.</p><blockquote><p>For simplicity we're stating that the web server's availability is also 99%.</p></blockquote><p>If either of these two tiers are down, then our system is down (because each tier is useless by itself).</p><h4 class="anchor anchorWithStickyNavbar_LWe7" id="calculating-probability">Calculating Probability<a href="#calculating-probability" class="hash-link" aria-label="Direct link to Calculating Probability" title="Direct link to Calculating Probability"></a></h4><p>So we now have two tiers, each with 0.99 probability of being available at any given point time.</p><div class="theme-admonition theme-admonition-info alert alert--info admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_S0QG"><p>Probabilities are expressed as numbers between <strong>zero</strong> (no chance of happening) and <strong>one</strong> (a certainty).</p></div></div><p>Calculating our system's availability is a simple matter of multiplying each tier's probability of being available (being up).</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">0.99 * 0.99 = 0.98</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>So our revised system architecture has an availability <strong>98%</strong>. Notice that this is <em>lower</em> than the previous, more simplistic, example. If this is surprising to you. it can rationalised by considering that we'd expect the database to be down 1% of the time, but we'd also expect the web server to be down 1% of the time. These two separate downtimes combine for a total of 2% downtime.</p><div class="theme-admonition theme-admonition-tip alert alert--success admonition_LlT9"><div class="admonitionHeading_tbUL"><span class="admonitionIcon_kALy"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_S0QG"><p>The addition of additional tiers into a distributed application decreases it's expected availability.</p></div></div><hr><h3 class="anchor anchorWithStickyNavbar_LWe7" id="real-world-example">Real World Example<a href="#real-world-example" class="hash-link" aria-label="Direct link to Real World Example" title="Direct link to Real World Example"></a></h3><p>Let's return to our earlier example of a topology with nine tiers:</p><ul><li>Relational database</li><li>NoSQL database</li><li>DNS</li><li>Serverless compute</li><li>Web Servers</li><li>API Gateway</li><li>Load Balancer</li><li>Firewall</li><li>CDN</li></ul><p><a target="_blank" href="/assets/files/High_Availability_Example-020c6ae1bf55487555c18a193cc34f6a.png"><img loading="lazy" alt="Example Topology" src="/assets/images/High_Availability_Example-020c6ae1bf55487555c18a193cc34f6a.png" width="925" height="1020" class="img_ev3q"></a></p><p>Using our cloud service provider's SLA documentation, such as <a href="https://azure.microsoft.com/en-us/support/legal/sla/summary/" target="_blank" rel="noopener noreferrer">Azure's</a> or <a href="https://aws.amazon.com/legal/service-level-agreements/" target="_blank" rel="noopener noreferrer">AWS's</a>, we can find the Service Availability for each of our tiers and multiply them together to obtain our solution's availability.</p><div class="tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">Azure</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">AWS</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6">Azure Availability SLAs<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"> | Tier | Azure Service | Service Availability |</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> |---------------------|----------------------------|----------------------|</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> | Relational database | Azure SQL Database | 99.99% |</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> | NoSQL database | Azure CosmosDB | 99.99% |</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> | DNS | Azure Provided DNS | 100.00% |</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> | Serverless compute | Azure Functions | 99.95% |</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> | Web Servers | Azure Cloud Services | 99.95% |</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> | API Gateway | Azure API Management | 99.95% |</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> | Load Balancer | Azure Load Balancer | 99.99% |</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> | Firewall | Azure Firewall | 99.95% |</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> | CDN | Azure CDN | 99.90% |</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> 0.9999 * 0.9999 * 1.0000 * 0.9995 * 0.9995 * 0.9995 * 0.9999 * 0.9995 * 0.999 = 0.9967</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> End-to-end System's Availability SLA is 99.67%</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden="">AWS Availability SLAs<div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"> | Tier | AWS Service | Service Availability |</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> |---------------------|----------------------------|----------------------|</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> | Relational database | Amazon RDS | 99.95% |</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> | NoSQL database | AWS DynamoDB | 99.99% |</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> | DNS | Amazon Route 53 | 99.99% |</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> | Serverless compute | AWS Lambda | 99.95% |</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> | Web Servers | Amazon Lightsail (managed) | 99.95% |</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> | API Gateway | AWS API Gateway | 99.95% |</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> | Load Balancer | Elastic Load Balancer | 99.99% |</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> | Firewall | AWS Network Firewall | 99.90% |</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> | CDN | Amazon CloudFront | 99.90% |</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> 0.9995 * 0.9999 * 0.9999 * 0.9995 * 0.9995 * 0.9995 * 0.9999 * 0.9990 * 0.9990 = 0.9957</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> End-to-end System's Availability SLA is 99.57%</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div><hr><p>It's interesting to note the slight differences between providers. In this example, Azure offers a 0.1% higher availability SLA than AWS for these equivalent services, but there are caveats:</p><ul><li>Many services have multiple tiers, and different tiers offer different availability SLAs. For this example I've used the highest tier on offer, but ...</li><li>These services change and improve over time, so this example is just snapshot in time rather than evidence of superiority.</li><li>Service providers may not achieve their SLAs, and conversely may exceed them.</li><li>Different regions <em>will</em> have different uptime results. e.g. AWS's <code>us-east-1</code> region <em>usually</em> gets updates first, so you might expect solutions deployed there to be effected more by problematic updates.</li><li>In my experience, downtime normally results from problems with deployments of the solution, or escaped bugs, rather than the underlying cloud platform. So the lesson there is to avoid shooting yourself in the foot by having a like-live non-production environment and a robust QA process.</li></ul><h2 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion<a href="#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion"></a></h2><p>If you're going to offer your user-base an <strong>Availability SLA</strong>, then this methodology will allow you to calculate the composite availability for your solution. The key points are:</p><p>1 Identify each critical tier in your solution and the service that hosts them.
2 Our example is constrained to services offered be a single cloud provider, but you might have additional third party services to include too (CDN, oAuth provider, back-end SaaS service, etc).
3 Obtain the provider's availability SLA for each of these tiers/services as a value between zero and one (i.e. 0.995 = 99.5%).
4 Multiply all of these values together to obtain your solution's SLA.
5 Keep in mind that this figure represents the <em>highest</em> SLA you should offer for your solution because:</p><ul><li>For your solution to exceed this uptime objective you'll need your service providers to exceed their's, and you can't guarantee that.</li><li>There are other variables that can effect availability that aren't accounted for, such as failed deployments, bugs, misconfigurations, etc.</li><li>In other words, if you achieve a higher uptime it'll be by luck rather than by design, so don't quote anything higher.</li></ul></div></article><nav class="pagination-nav" aria-label="Blog list page navigation"></nav></main></div></div></div></div>
<script src="/assets/js/runtime~main.d8e15a5e.js"></script>
<script src="/assets/js/main.cba81dbf.js"></script>
</body>
</html>