Jekyll2023-04-10T12:33:26+00:00https://mithunshanbhag.github.io/feed.xmlmithun shanbhag’s blogmostly ranting and raving about tech stuffMithun ShanbhagMy playbook2023-02-28T00:00:00+00:002023-02-28T00:00:00+00:00https://mithunshanbhag.github.io/2023/02/28/my-playbook<p>Based on my life experiences, I’ve cobbled together this playbook that has helped me in my growth/development. This is mostly for my own reference, but I hope it helps you too (disclaimer: I make no guarantees).</p>
<p>Most of the things in this playbook aren’t my original ideas; they’re mostly things I’ve imbibed from various books, podcasts, TED talks, YouTube videos, documentaries, friends, mentors, co-workers, and what have you (I’ve tried to give credit where it’s due). But everything in this playbook has been tried, tested and proven to work <strong>for me</strong>. Again, your mileage may vary.</p>
<p>I intend for this to be a living document that I hope to update & tweak every now and then.</p>
<hr />
<h2 id="systems-over-goals">Systems over goals</h2>
<blockquote>
<p>“Systems are for people who care about winning repeatedly. Goals are for people who care about winning once.” - James Clear</p>
<p>“Losers have goals. Winners have systems.” - Scott Adams</p>
</blockquote>
<p>In my early 30s, I was super-obsessed with hitting goals & checking off bucket-list items: weight goals, marathon running goals, bench/squat/deadlift goals, countries & places to visit, list of books to read, salary goals, job title goals, career goals, restaurants to try out, net worth goals, hobbies to try out, you name it!</p>
<p>I would set goals, and then I would religiously track my progress towards those goals.</p>
<p>And it would ALWAYS end with me getting frustrated!</p>
<ul>
<li>Either because I failed to make progress towards those goals.</li>
<li>Or because I failed to achieve those goals.</li>
<li>But mostly because I lost track of why I had those goals in the first place.</li>
<li>Also, if a goal was achieved, my motivation to keep going would just drop off a cliff.</li>
</ul>
<p>Goals were temporary, they simply didn’t endure.</p>
<hr />
<blockquote>
<p>“Success doesn’t come from what you do occasionally, but from what you do consistently.” - Unknown wise person</p>
<p>“We don’t rise to the level of our expectations, we fall to the level of our training.” - Archilochus</p>
<p>“You do not rise to the level of your goals. You fall to the level of your systems.” - James Clear</p>
<p>“The more you sweat in practice, the less you bleed in battle.” - Ancient proverb</p>
</blockquote>
<p><a href="https://www.amazon.in/How-Fail-Almost-Everything-Still/dp/0241003709">Scott Adams’ advice on ‘goals vs systems’</a> was an eye-opener for me. Goals are just a means to an end. They’re not the end in themselves.</p>
<p>Instead of creating goals, we need to create systems: something we execute repeatedly, over and over again. The critical word here is ‘repeatedly’; the benefits of a system compound only over a long run. There are almost no visible short-term gains, and there almost certainly will be pains in the near term.</p>
<p>For a system to endure, it needs to be consistently executed. The more predictable and boring a system is, the better. The more automated a system is, the better. We have to take will-power out of the equation (cause we only have a very finite supply of it).</p>
<p>With systems, we’re creating the guardrails that prevents our lives from falling off the cliff, or into a ditch.</p>
<blockquote>
<p>Aside: The words ‘systems’, ‘habits’, ‘routines’, ‘practices’, ‘rituals, ‘frameworks’, ‘trainings’ etc. are all synonyms for me. I use them interchangeably.</p>
</blockquote>
<hr />
<p>I’m not going to regurgitate what Scott Adams has already said in his book, but I’ll give a few examples of systems that have worked for me:</p>
<p>Financial systems: Someday, I’ll do a deep-dive on these, but for now, I’ll just briefly mention them: diversifying income streams, regular SIP investing, creating an emergency fund, creating a succession plan (will), getting insured (health & term/life), and saving on taxes.</p>
<p>Productivity systems: Our productivity is a mostly function of two things: our ability to pick the right things to do, and our ability to getting those things done fast. Once you’ve identified the right problems to tackle, then it’s all about lowering your “Mean Time To Resolution (MTTR)”, getting things done at lightning speed. Some systems that apply here: <a href="#taking-small-bets">taking small bets</a>, <a href="#letting-simplicity-win">letting simplicity win</a>, <a href="#conquering-fear">conquering fear</a>, <a href="#maximizing-energy">maximizing energy</a>, <a href="#maximizing-focus">maximizing focus</a>, <a href="#managing-your-environments">managing your environments</a>, <a href="#being-irreplaceable">being irreplaceable</a>, <a href="#being-uncomfortable">being uncomfortable</a> and <a href="#applying-leverage">applying leverage</a>.</p>
<blockquote>
<p>Aside: Yes, some of these systems may seem a bit “out there” (for lack of a better word). I’ll expound more on them in the coming sections. Stick with me, it’s well worth it. Read on.</p>
</blockquote>
<hr />
<h2 id="conquering-fear">Conquering fear</h2>
<blockquote>
<p>“Life shrinks or expands in proportion to one’s courage.” - Anais Nin</p>
</blockquote>
<p>What we loosely term as <strong>fear</strong> is generally a brain cocktail blended from multiple ingredients: anxiety, shame, guilt, humiliation, embarrassment, regret, uncertainty, helplessness, inexperience, inhibitions, unfamiliarity, vulnerability, apprehension, despair, ego, unhappiness, insecurities, laziness, inertia, mistrust, and many more. Yes, and fear itself.</p>
<blockquote>
<p>Aside: I highly recommend the books by Brené Brown and Chip Conley on many of these fascinating topics.</p>
</blockquote>
<p>But know that there is no workaround, we have to take these fears head-on: we have to acknowledge them, define them, face them, and ultimately take action to conquer them. I can attribute most of my growth to doing things that INITIALLY and IRRATIONALLY scared me: <@TODO: Examples of fear></p>
<hr />
<p>Two things that have helped me tremendously in dealing with my fears:</p>
<ol>
<li>
<p><a href="https://youtu.be/5J6jAC6XxAI">Tim Ferris’ fear-setting exercise</a> has been particularly useful in creating a process.</p>
<ul>
<li>First I acknowledge and write down my fears.</li>
<li>Then I write down the worst-case scenarios for each fear.</li>
<li>Then I write down what I’ll do should that worst case scenario ever materialize.</li>
</ul>
<p>As an example, I have a (possibly irrational) paranoia about losing my phone. So I did a simple fear-setting exercise, documenting the worst case outcomes, and the steps that I can take to prevent/mitigate them (<a href="/2023/02/25/preparing-for-device-loss.html">LINK</a>).</p>
</li>
<li>
<p><a href="https://youtu.be/NqVoOC2azZI">Jeff Bezos recommends having a bias for action</a>. Take SOME action. ANY action. Basically, just put something into motion.</p>
</li>
</ol>
<hr />
<blockquote>
<p>“We suffer more in imagination than in reality.” - Seneca</p>
<p>“I am an old man and have known a great many troubles, but most of them never happened.” - Mark Twain</p>
</blockquote>
<p>When dealing with fears, I take solace in these two facts:</p>
<ol>
<li>
<p><em>Almost EVERYTHING seems scary the first time around</em>: Driving, swimming, public speaking, asking someone out, hiring someone, purchasing a home, yada yada. Once I take some action, I soon realize that my fears aren’t as bad as I thought they’d be.</p>
</li>
<li>
<p><em>Most fears are just imaginary/irrational</em>: As soon as I take some action, I realize that:</p>
<ul>
<li>the worst-case scenario isn’t as bad as I thought it’d be. or</li>
<li>the probability of anything bad happening is extremely low. or</li>
<li>should anything bad happen I can handle/mitigate it. or</li>
<li>should anything bad happen I can recover from it. or</li>
<li>I can prevent anything bad from happening in the first place.</li>
</ul>
</li>
</ol>
<p>The more we face our fears, the more it shrinks.</p>
<p>Crucially, conquering our fears lowers our barrier to taking risks/actions. More on that later.</p>
<hr />
<h2 id="letting-simplicity-win">Letting simplicity win</h2>
<blockquote>
<p>“Simplicity is the ultimate sophistication.” - Leonardo da Vinci</p>
<p>“Great leaders are almost always great simplifiers, who can cut through argument, debate, and doubt to offer a solution everybody can understand.” - Colin Powell</p>
<p>“Simplicity is the keynote of all true elegance.” - Coco Chanel</p>
</blockquote>
<p>The easiest way to ensure that a “system” endures is to keep it simple. Super, brain-dead simple. The simpler it is, the easier it is to follow that system.</p>
<p>In Scott Adams’ book, he dichotomizes people as either simplifiers or as optimizers. And he argues that we’d be better off if we stick with (or at least start with) the simplest solutions. I wholeheartedly agree. As a recovering over-optimizer, I’m now firmly in the simplification camp. An optimized solution will almost certainly have a higher TCO. Yet it is not guaranteed to be better. In fact, 99% of the times, simplification will beat optimization. But unfortunately, as human beings, our evolved brains are wired to seek out optimizations/efficiencies, which makes us veer towards the complex. But we HAVE TO resist that urge and let simplicity win.</p>
<p>Why choose simple over optimal? Because choosing the simplest path makes it easier to get started, keep the momentum going, and ultimately get things done faster. Since there is less cognitive load involved, decisions get made faster. We don’t have to tap into our reserves of will-power, <a href="#maximizing-energy">energy</a> and <a href="#maximizing-focus">focus</a> either. At work, principles like lean startup, minimum viable product, and the KISS principle are all about starting simple, iterating, and then optimizing later if necessary. Similar strategies can be applied to our personal lives as well.</p>
<p>Keeping things simple is especially important when we’re working in a team/organization. The simpler the system, the easier it is to communicate (less room for misinterpretation, ambiguity), the easier it is to onboard new team members, the easier it is to iterate/maintain/improve/automate.</p>
<p>Quick tip: If we’re dealing with something that has a high probability of failure anyways, we might as well stick with whatever is simpler.</p>
<hr />
<blockquote>
<p>“That’s been one of my mantras – focus and simplicity. Simple can be harder than complex.” - Steve Jobs</p>
</blockquote>
<p>I now religiously pursue the simplest options in my personal & professional life. It may come at a higher monetary cost; I’m OK with that. It will likely be less efficient; I’m OK with that too. But simple will endure, and that’s what matters the most to me. Some examples where I have super-simplified my life via elimination, delegation or automation:</p>
<ol>
<li>
<p>Automation: SIP investing, bill payments, recurring subscriptions.</p>
</li>
<li>
<p>Delegation: I hire a CA to handle my complex company-related paperwork (taxes, GST, compliances, etc). I could probably do these myself, but I’d rather spend my time on things that I’m good at. Also, I’d rather not risk messing up my taxes, or missing compliance-related deadlines! 😄</p>
</li>
<li>
<p>Elimination: Simplicity and minimalism are recurring themes in my life. The more I simplify my life, and eliminate non-essential excesses, the more I’m able to focus on the things that really matter to me. Some baggage that I’ve jettisoned from my life:</p>
<ul>
<li>Caffeine, sugar, alcohol, tobacco, drugs, junk food, processed food, fast food, soda, soft drinks, anything fried, anything with refined flour. Consequently, I eliminate all the side effects & health risks that come from consuming these.</li>
<li>I’m trying to eliminate junk food for my brain: twitter, reddit, youtube, instagram, screen time, etc. Not 100% successful yet, but I’m getting there.</li>
<li>I don’t see any point delving into complex investment instruments (F&O, commodities, REITs, AIFs, T-Bills, G-Secs et al). I’ve followed the whole “active vs passive” investing debate, and data shows that passive investing in index funds will win out over a 25+ year horizon. So I just stick to the basic index funds (Bogleheads FTW!).</li>
<li>I just use Uber/Ola for my commuting needs. I never liked dealing with the baggage that came with owning a car: loan EMIs, registration, insurance, repairs, servicing, parking spots, gas, etc. I’m OK with paying a premium for the convenience of not having to deal with all that.</li>
<li>My wardrobe is almost entirely made up of black t-shirt and jeans. Seems a bit excessive, but I have zero cognitive overload while answering the question “what should I wear today?”.</li>
</ul>
</li>
</ol>
<hr />
<blockquote>
<p>“Everything should be made as simple as possible, but not simpler.” - Albert Einstein</p>
</blockquote>
<p>All said and done, there is definitely a time & place, when you may have to opt for complexity. This usually comes in the later stages AFTER you’ve nailed the simple, and have outgrown it. At this point, you’ll also have a better understanding of the shortcoming/drawbacks of the simple, and the tradeoffs involved in switching from simple to complex.</p>
<hr />
<h2 id="maximizing-energy">Maximizing energy</h2>
<blockquote>
<p>“Energy and persistence conquer all things.” - Benjamin Franklin</p>
</blockquote>
<p>If my energy levels are high, I can pretty much bulldoze through any todo list. Maximizing my energy levels is a super-simple process; in fact, I’ll let ChatGPT summarize the steps for me 😃</p>
<ol>
<li>
<p>Get enough sleep: One of the most important things we can do to boost our energy levels is to get enough sleep. Aiming for 7-8 hours of sleep per night helps our body recharge and feel refreshed. Deep restorative sleep supercharges our batteries.</p>
</li>
<li>
<p>Exercise regularly: Exercise is another key factor in maximizing our energy levels. Regular exercise can help improve our mood, boost our energy, and increase our overall fitness levels.</p>
</li>
<li>
<p>Eat a healthy diet: Eating a balanced diet rich in whole foods, including fruits, vegetables, lean proteins, and healthy fats, can help provide our body with the nutrients it needs to function at its best. Just eliminate caffeine, alcohol, and other artificial stimulants.</p>
</li>
<li>
<p>Stay hydrated: Dehydration can cause fatigue, so be sure to drink plenty of water throughout the day to stay hydrated.</p>
</li>
<li>
<p>Get enough sunlight: Getting enough sunlight can help boost our energy levels and improve our mood. Try to get outside for at least 15 minutes each day to soak up some sun.</p>
</li>
<li>
<p>Posture: Our posture can have a big impact on our energy levels (<a href="https://youtu.be/Ks-_Mh1QhMc">check out Amy Cuddy’s TED talk</a>). For example, slouching can make us feel more tired and sluggish, while sitting up straight can help us feel more alert and energized. I’ve found a standing desk to be immensely helpful.</p>
</li>
<li>
<p>Environmental factors: Our environment can have a big impact on our energy levels. For example, if we work in a dimly lit, stuffy office with poor air quality, we may feel more sluggish and tired than if we worked in a bright, airy space with good ventilation. Similarly, exposure to natural light can help regulate our body’s sleep-wake cycle and boost energy levels during the day.</p>
</li>
<li>
<p>Social associations: The people we surround ourself with can also affect our energy levels. If we spend time with people who are negative, critical, or draining, we may find that our energy depleted after spending time with them. Conversely, spending time with positive, supportive, and uplifting people can boost our energy and improve our mood.</p>
</li>
</ol>
<hr />
<h2 id="maximizing-focus">Maximizing focus</h2>
<p>Coming soon! Stay tuned!</p>
<hr />
<h2 id="being-irreplaceable">Being irreplaceable</h2>
<p>Coming soon! Stay tuned!</p>
<hr />
<h2 id="managing-your-environments">Managing your environments</h2>
<p>Coming soon! Stay tuned!</p>
<hr />
<h2 id="applying-leverage">Applying leverage</h2>
<p>Coming soon! Stay tuned!</p>
<hr />
<h2 id="being-uncomfortable">Being uncomfortable</h2>
<p>Coming soon! Stay tuned!</p>
<hr />
<h2 id="taking-small-bets">Taking small bets</h2>
<p>Coming soon! Stay tuned!</p>
<hr />
<h2 id="some-recommended-reading--listening">Some recommended reading & listening</h2>
<p>A few books, blogs & podcasts have made a profound impact on my life. Here they are, in no particular order:</p>
<ul>
<li><a href="https://www.amazon.in/How-Fail-Almost-Everything-Still/dp/0241003709">Scott Adams: How to fail at almost everything and still win big</a></li>
<li><a href="https://blog.samaltman.com/how-to-be-successful">Sam Altman: How to be successful</a></li>
<li><a href="https://www.navalmanack.com/">Naval Ravikant: Almanac of Naval Ravikant</a></li>
<li><a href="https://tim.blog/podcast/">The Tim Ferris Show</a></li>
<li><a href="https://www.amazon.in/How-Win-Friends-Influence-People/dp/0091906350">Dale Carnegie: How to win friends and influence people</a></li>
<li><a href="https://www.amazon.in/Emotional-Equations-Creating-Happiness-Business/dp/1451607261">Chip Conley: Emotional equations</a></li>
<li><a href="https://www.amazon.in/Gifts-Imperfection-Think-Supposed-Embrace/dp/159285849X">Brené Brown: The gifts of imperfection</a></li>
<li><a href="https://www.amazon.in/Atomic-Habits-James-Clear/dp/1847941834">James Clear: Atomic habits</a></li>
<li><a href="https://www.amazon.in/Deep-Work-Focused-Success-Distracted/dp/0349413681">Cal Newport: Deep Work</a></li>
<li><a href="https://www.amazon.in/How-Will-Measure-Your-Life/dp/0062102419">Clayton Christensen: How will you measure your life?</a></li>
<li><a href="https://www.amazon.in/Triggers-Creating-Behavior-Lasts-Becoming-Person/dp/0553550934">Marshall Goldsmith: Triggers</a></li>
<li><a href="https://www.amazon.in/Never-Split-Difference-Negotiating-Depended/dp/0062407805">Chris Voss: Never split the difference</a></li>
</ul>Mithun ShanbhagBased on my life experiences, I’ve cobbled together this playbook that has helped me in my growth/development. This is mostly for my own reference, but I hope it helps you too (disclaimer: I make no guarantees).Preparing for device loss2023-02-25T00:00:00+00:002023-02-25T00:00:00+00:00https://mithunshanbhag.github.io/2023/02/25/preparing-for-device-loss<p><img src="../../../images/mobile-fire.gif" alt="device on fire" /></p>
<p>Do y’all have a disaster recovery drill if your devices get lost, stolen, or damaged?</p>
<p>How to prevent misuse if stolen?</p>
<p>Any checklists, best practices for these kinds of scenarios?</p>
<p>Here are some precautions I take:</p>
<ol>
<li>
<p>Enable <a href="https://www.google.com/android/find/">android’s find-my-device</a> for all devices (enables remote wipe).</p>
</li>
<li>
<p>Enable <a href="https://support.google.com/android/answer/2819582?hl=en">android’s google-drive-backup</a> (enables restoration to another device).</p>
</li>
<li>
<p>Enable whatsapp’s google-drive-backup.</p>
</li>
<li>
<p>Explicit screen lock for Whatsapp, payment/finance apps.</p>
</li>
<li>
<p>Note down serial#, IMEI# etc (<a href="http://ceir.gov.in/Home/index.jsp">helps block device if stolen</a>).</p>
</li>
<li>
<p>2FA/MFA on all apps (tokens stored with a password manager).</p>
</li>
<li>
<p>Switch from physical SIMs to eSIMs.</p>
</li>
<li>
<p>Devices can only be unlocked with strong passwords or biometrics. No patterns. No numeric PINS.</p>
</li>
</ol>
<p>Comments? thoughts? suggestions?</p>Mithun ShanbhagMy favorite announcements from MSBuild20202020-05-20T00:00:00+00:002020-05-20T00:00:00+00:00https://mithunshanbhag.github.io/2020/05/20/msbuild2020-announcements<p>I had so much fun viewing the <a href="https://mybuild.microsoft.com/">MSBuild 2020 Virtual Conference</a>. Tons of amazing new products & features were announced over three days; here are a few that I’m personally excited about (ordered alphabetically):</p>
<h2 id="azure-cosmosdb">Azure CosmosDB</h2>
<h4 id="jupyter-notebook-support">Jupyter notebook support</h4>
<p>Jupyter notebooks can now be <a href="https://docs.microsoft.com/en-us/azure/cosmos-db/enable-notebooks">enabled on CosmosDB</a> for facilitating <a href="https://docs.microsoft.com/en-us/azure/cosmos-db/use-python-notebook-features-and-commands">analysis & visualization of the stored data</a>.</p>
<p><img src="https://assets.cloudskew.com/assets/blog/images/32-cosmosdb-jupyter-notebooks.png" alt="cosmosdb jupyter notebook support" /></p>
<h4 id="customer-managed-encryption-keys">Customer-managed encryption keys</h4>
<p>CosmosDB now supports encrypting its data at rest with <a href="https://docs.microsoft.com/en-us/azure/cosmos-db/how-to-setup-cmk">customer-managed keys</a>.</p>
<p><img src="https://assets.cloudskew.com/assets/blog/images/33-cosmosdb-cmk.png" alt="customer managed keys" /></p>
<h4 id="autoscaled-provisioned-throughput">Autoscaled provisioned throughput</h4>
<p>CosmosDB has introduced <a href="https://docs.microsoft.com/en-us/azure/cosmos-db/provision-throughput-autoscale">autoscaled provisioned throughput</a> for workloads that have variable or unpredictable traffic. To enable AutoScale, you specify the max allowable throughput <code class="language-plaintext highlighter-rouge">Tmax</code>. Then, depending on the load, CosmosDB will then scale the throughput between <code class="language-plaintext highlighter-rouge">0.1 x Tmax</code> and <code class="language-plaintext highlighter-rouge">Tmax</code>.</p>
<h4 id="serverless-sku">Serverless SKU</h4>
<p>CosmosDB will also introduce a new Serverless SKU in the coming months. This will be ideal for apps dealing with intermittent traffic spikes/bursts.</p>
<h4 id="free-tier">Free tier</h4>
<p>And in case you still haven’t heard, CosmosDB recently introduced a free tier!</p>
<hr />
<h2 id="azure-devops">Azure DevOps</h2>
<h4 id="multi-stage-yaml-cd-pipelines">Multi-stage YAML CD pipelines</h4>
<p>In addition to CI, the multi-stage YAML pipelines now also support CD. You can now use <a href="https://docs.microsoft.com/en-us/azure/devops/pipelines/process/deployment-jobs?view=azure-devops">deployment jobs</a> to target your deployments at specific <a href="https://docs.microsoft.com/en-us/azure/devops/pipelines/process/environments?view=azure-devops">environments</a> (dev, test, staging, production etc).</p>
<p><img src="https://assets.cloudskew.com/assets/blog/images/28-multistage-cd-pipeline.png" alt="multi-stage yaml cd pipeline" /></p>
<p>By using environments it is also possible to define the <a href="https://docs.microsoft.com/en-us/azure/devops/pipelines/process/approvals?view=azure-devops&tabs=check-pass">checks & approvals</a> that need to be fulfilled for the deployment to start.</p>
<p><em><a href="https://devblogs.microsoft.com/devops/azure-devops-roadmap-update-for-2020-q2/">Read the full details</a></em>.</p>
<hr />
<h2 id="azure-event-grid">Azure Event Grid</h2>
<h4 id="partner-topics">Partner topics</h4>
<p>If you’re using Auth0 as your identity provider, you can hook up its log stream to Azure event grid as a <a href="https://azure.microsoft.com/en-in/updates/azure-event-grid-partner-topics-are-now-in-preview/">partner (3rd party) topic</a>. More partners will be unveiled in the coming months.</p>
<p><img src="https://assets.cloudskew.com/assets/blog/images/30-event-grid-partner-topics.png" alt="event grid partner topic" /></p>
<h4 id="app-service-events">App Service events</h4>
<p>Also you can now subscribe to multiple <a href="https://azure.microsoft.com/en-in/updates/app-service-is-now-an-events-publisher-on-azure-event-grid-in-preview/">App Service events via an event grid subscription</a>. This is great for customized health checks.</p>
<p><img src="https://assets.cloudskew.com/assets/blog/images/31-app-service-events.png" alt="app service events" /></p>
<h4 id="managed-identity-support">Managed Identity support</h4>
<p>Finally, Event Grid topics & domains <a href="https://azure.microsoft.com/en-in/updates/azure-event-grid-support-for-system-assigned-managed-identities-is-now-in-preview/">now support system assigned managed identity</a>.</p>
<hr />
<h2 id="azure-monitor">Azure Monitor</h2>
<p>The Azure Monitor team had way too many awesome announcements! Below are some of the ones that caught my eye.</p>
<h4 id="app-insights-now-integrated-with-log-workspaces">App Insights now integrated with Log Workspaces</h4>
<p>You can now <a href="https://docs.microsoft.com/en-us/azure/azure-monitor/app/create-workspace-resource">direct your application insights logs to a Log Analytics Workspace</a>. This helps unify all the APM and infra logs in one centralized location.</p>
<p><img src="https://assets.cloudskew.com/assets/blog/images/34-appinsights-logworkspace.png" alt="application insights log workspaces" /></p>
<h4 id="insights-for-multiple-azure-resources">Insights for multiple Azure resources</h4>
<p>Insights for <a href="https://docs.microsoft.com/en-us/azure/azure-monitor/insights/storage-insights-overview">Storage</a> and <a href="https://docs.microsoft.com/en-us/azure/azure-monitor/insights/cosmosdb-insights-overview">CosmosDB</a> is now GA. Support for <a href="https://docs.microsoft.com/en-us/azure/azure-monitor/insights/key-vaults-insights-overview">Key Vault</a> and <a href="https://docs.microsoft.com/en-us/azure/azure-monitor/insights/redis-cache-insights-overview">Azure cache for Redis</a> is now in preview.</p>
<h4 id="customer-managed-encryption-keys-1">Customer-managed encryption keys</h4>
<p>You can now <a href="https://docs.microsoft.com/en-us/azure/azure-monitor/platform/customer-managed-keys">encrypt your Log Analysis Workspace data with your own keys</a>. Includes support for key revocation & rotation.</p>
<h4 id="change-analysis-support">Change analysis support</h4>
<p>This feature helps you <a href="https://docs.microsoft.com/en-us/azure/azure-monitor/app/change-analysis">diff configuration changes to Azure resources</a> over a selected time range. Great for detecting drifts.</p>
<hr />
<h2 id="azure-functions">Azure Functions</h2>
<h4 id="official-powershell-module">Official PowerShell module</h4>
<p>There’s now an official PowerShell module <code class="language-plaintext highlighter-rouge">AZ.Functions</code> to manage Azure Functions. You can <a href="https://www.powershellgallery.com/packages/Az.Functions/1.0.0">download it from the PowerShell gallery</a> or just run <code class="language-plaintext highlighter-rouge">Install-Module -Name Az.Functions</code> in a PS console.</p>
<hr />
<h2 id="azure-private-link">Azure Private Link</h2>
<h4 id="support-for-multiple-services">Support for multiple services</h4>
<p>Azure Private Link is <a href="https://azure.microsoft.com/en-us/updates/azure-private-link-is-now-available-for-multiple-new-azure-services/">now available for multiple Azure services</a> like Event Hubs, Service Bus, Container Registry, Event Grid and Cognitive Search.</p>
<hr />
<h2 id="azure-service-bus">Azure Service Bus</h2>
<h4 id="service-bus-explorer-in-portal">Service Bus Explorer in portal</h4>
<p>A Service Bus Explorer is now built into the Azure Portal itself. You can use it to send, receive and peek messages on your service bus. You no longer have to download and install the <a href="https://github.com/paolosalvatori/ServiceBusExplorer">standalone tool</a>.</p>
<p><img src="https://assets.cloudskew.com/assets/blog/images/29-service-bus-explorer.png" alt="service bus explorer" /></p>
<h4 id="large-message-support">Large message support</h4>
<p>Additionally, support for large messages (up to 100 MB) has been announced.</p>
<hr />
<h2 id="codespaces">CodeSpaces</h2>
<h4 id="vs-codespaces">VS CodeSpaces</h4>
<p>I’ve been using <a href="https://docs.microsoft.com/en-us/visualstudio/online/overview/what-is-vsonline">VS CodeSpaces</a> for a while now as my dev machine in the cloud. You can access your VS CodeSpace environments via <a href="https://code.visualstudio.com/docs/remote/codespaces">VSCode (remote extension)</a>, Visual Studio 2019 or via the <a href="https://online.visualstudio.com/">Cloud-based IDE</a>.</p>
<p>Using a <a href="https://docs.microsoft.com/en-us/visualstudio/online/reference/configuring#codespaces-configuration-sample">devcontainer.json file</a> it is possible to configure your CodeSpace (e.g. port forwarding). Using <a href="https://docs.microsoft.com/en-us/visualstudio/online/reference/personalizing">dotfiles</a>, the CodeSpace can be personalized on a per-user basis. And if you really want to, you can even <a href="https://docs.microsoft.com/en-us/visualstudio/online/how-to/self-hosting-vscode">register your machine</a> as a CodeSpace environment (for remote access).</p>
<p>Initially branded as VS Online, the product was then renamed to VS CodeSpaces. Currently it is in private preview.</p>
<h4 id="github-codespaces">Github CodeSpaces</h4>
<p><a href="https://github.com/features/codespaces/">Github CodeSpaces</a> (which uses VS CodeSpaces underneath the covers) allows you to spin up a dev environment on the fly directly from a github project.</p>
<p><em>Read the full details <a href="https://devblogs.microsoft.com/visualstudio/introducing-visual-studio-codespaces/">here</a> and <a href="https://devblogs.microsoft.com/visualstudio/expanding-visual-studio-2019-support-for-visual-studio-codespaces/">here</a></em>.</p>
<hr />
<h2 id="windows-powertoys">Windows PowerToys</h2>
<h4 id="new-utilities-added">New utilities added</h4>
<p>In addition to the previously available <a href="https://github.com/microsoft/PowerToys/tree/master/src/modules/fancyzones">FancyZones</a> and <a href="https://github.com/microsoft/PowerToys/tree/master/src/modules/shortcut_guide">Keyboard Shortcut Guide</a>, Windows PowerToys now has a bunch of new utilities baked-in:</p>
<ul>
<li><a href="https://github.com/microsoft/PowerToys/tree/master/src/modules/powerrename">PowerRename</a>: Windows Shell Extension for advanced bulk renaming using search and replace or regular expressions.</li>
<li><a href="https://github.com/microsoft/PowerToys/tree/master/src/modules/previewpane">File Explorer Preview Panes Add-On</a>: For previewing markdown & svg files!</li>
<li><a href="https://github.com/microsoft/PowerToys/tree/master/src/modules/keyboardmanager">Keyboard Manager</a>: Utility for remapping keyboard keys & shortcuts.</li>
<li><a href="https://github.com/microsoft/PowerToys/tree/master/src/modules/imageresizer">Image Resizer</a>: File Explorer extension for bulk image resizing.</li>
<li><a href="https://github.com/microsoft/PowerToys/tree/master/src/modules/launcher">Launcher</a>: Press <code class="language-plaintext highlighter-rouge">ALT + SPACE</code> to bring up the “Mac spotlight” styled app launcher.</li>
</ul>
<p><img src="https://assets.cloudskew.com/assets/blog/images/27-powertoys-launcher.png" alt="windows powertoys launcher" /></p>
<hr />
<h2 id="windows-terminal">Windows Terminal</h2>
<h4 id="10-release">1.0 release</h4>
<p>Windows Terminal steps out of preview mode and into it’s official (v1.0) release.</p>
<p><em><a href="https://devblogs.microsoft.com/commandline/windows-terminal-1-0/">Read the full details</a></em>.</p>
<hr />
<h2 id="winget">WinGet</h2>
<h4 id="new-package-manager-for-windows">New package manager for Windows</h4>
<p>Windows has a new “apt-get” styled package manager: <a href="https://devblogs.microsoft.com/commandline/windows-package-manager-preview/">WinGet</a> <em>(currently in preview)</em></p>
<p><img src="https://assets.cloudskew.com/assets/blog/images/26-winget1.png" alt="winget" /></p>
<p><em><a href="https://devblogs.microsoft.com/commandline/windows-package-manager-preview/">Read the full details</a></em>.</p>
<hr />
<h2 id="vscode">VSCode</h2>
<h4 id="settings-sync">Settings sync</h4>
<p>VSCode Settings Sync will link your VSCode preferences/settings with your Microsoft or Github account. You can now sync your VSCode settings across multiple machines just by signing into VSCode. Works even on VS CodeSpaces’ browser IDE.</p>
<p>Currently this feature is in preview and available on VSCode Insider builds.</p>
<p><em><a href="https://code.visualstudio.com/docs/editor/settings-sync">Read the full details</a></em>.</p>
<hr />
<h2 id="wsl2">WSL2</h2>
<h4 id="gui-apps">GUI apps</h4>
<p>In addition to command line apps, you can now look forward to running GUI apps on WSL2 in the coming months! Underneath the covers there is a built-in Wayland display server on Linux talking to a RDP client on Windows.</p>
<p><em><a href="https://devblogs.microsoft.com/commandline/the-windows-subsystem-for-linux-build-2020-summary/">Read the full details</a>.</em></p>
<hr />
<p>I still haven’t caught up with all the updates from the C# and .Net teams (I should perhaps do another separate post for that when I’m done).</p>
<p><em>That’s all for today folks! Comments? Suggestions? Thoughts? Would love to hear from you, please leave a comment below or <a href="https://twitter.com/MithunShanbhag">send me a tweet</a>.</em></p>Mithun ShanbhagI had so much fun viewing the MSBuild 2020 Virtual Conference. Tons of amazing new products & features were announced over three days; here are a few that I’m personally excited about (ordered alphabetically):How I built cloudskew.com2020-05-19T00:00:00+00:002020-05-19T00:00:00+00:00https://mithunshanbhag.github.io/2020/05/19/cloudskew-architecture<p>I wrote about how I built <a href="https://www.cloudskew.com">cloudskew.com</a> using Angular and AspNetCore on top of various Azure services. Read all about it <a href="https://www.cloudskew.com/about/cloudskew-architecture.html">here</a>.</p>Mithun ShanbhagI wrote about how I built cloudskew.com using Angular and AspNetCore on top of various Azure services. Read all about it here.Awesome Azure DevOps Resources2019-11-14T00:00:00+00:002019-11-14T00:00:00+00:00https://mithunshanbhag.github.io/2019/11/14/awesome-azure-devops-resources<p>My curated list of awesome resources related to azure devops (this will be a living document that I’ll be updating frequently).</p>
<ul>
<li>azure architectures, designs & best practices
<ul>
<li><a href="https://azure.microsoft.com/en-in/solutions/architecture/?product=azure-devops">azure devops solutions architecture</a></li>
</ul>
</li>
<li>azure devops
<ul>
<li>azure boards: <a href="https://docs.microsoft.com/en-us/azure/devops/boards">docs</a></li>
<li>azure repos: <a href="https://docs.microsoft.com/en-us/azure/devops/repos">docs</a>
<ul>
<li><a href="https://docs.microsoft.com/en-us/azure/devops/repos/git/auth-overview">auth overview</a></li>
<li><a href="https://docs.microsoft.com/en-us/azure/devops/repos/git/branch-policies">branch policies</a></li>
<li><a href="https://docs.microsoft.com/en-us/azure/devops/repos/git/set-up-credential-managers">credentials manager</a></li>
<li><a href="https://docs.microsoft.com/en-us/azure/devops/repos/git/pull-request-templates">pr templates</a></li>
</ul>
</li>
<li>azure pipelines: <a href="https://docs.microsoft.com/en-us/azure/devops/pipelines">docs</a>
<ul>
<li><a href="https://docs.microsoft.com/en-us/azure/devops/pipelines/process/expressions">expressions</a></li>
<li><a href="https://docs.microsoft.com/en-us/azure/devops/pipelines/agents/hosted">hosted agents</a></li>
<li><a href="https://docs.microsoft.com/en-us/azure/devops/pipelines/build/variables">predefined variables</a></li>
<li><a href="https://docs.microsoft.com/en-us/azure/devops/pipelines/library/service-endpoints">service connections</a></li>
<li><a href="https://github.com/microsoft/azure-pipelines-tasks">tasks github</a></li>
<li><a href="https://docs.microsoft.com/en-us/azure/devops/pipelines/tasks">tasks reference</a></li>
<li><a href="https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema">yaml schema</a></li>
</ul>
</li>
<li>azure artifacts: <a href="https://docs.microsoft.com/en-us/azure/devops/artifacts">docs</a></li>
<li>azure test plans: <a href="https://docs.microsoft.com/en-us/azure/devops/test">docs</a></li>
</ul>
</li>
<li>azure devops apis, sdks & tools
<ul>
<li>azure devops cli (extensions for azure cli): <a href="https://marketplace.visualstudio.com/items?itemName=ms-vsts.cli">link</a> | <a href="https://github.com/Azure/azure-devops-cli-extension">github</a></li>
<li>azure devops extensibility (developing marketplace extensions & tasks): <a href="https://docs.microsoft.com/en-us/azure/devops/marketplace-extensibility/">link</a></li>
<li>azure devops rest apis: <a href="https://docs.microsoft.com/en-us/rest/api/azure/devops">link</a> | <a href="https://docs.microsoft.com/en-us/rest/api/?view=Azure%20DevOps">alternate link</a></li>
<li>marketplace extensions for azure devops: <a href="https://marketplace.visualstudio.com/azuredevops">link</a></li>
<li>marketplace extensions for vscode: <a href="https://marketplace.visualstudio.com/search?term=azure&target=VSCode&category=All%20categories&sortBy=Relevance">link</a></li>
</ul>
</li>
<li>misc resources
<ul>
<li>azure devops billing: <a href="https://docs.microsoft.com/en-us/azure/devops/organizations/billing">docs</a></li>
<li>azure devops code samples: <a href="https://github.com/microsoft/devops-project-samples">github</a> | <a href="https://github.com/microsoft/azure-devops-dotnet-samples">more dotnet samples on github</a></li>
<li>azure devops demo generator: <a href="https://azuredevopsdemogenerator.azurewebsites.net/">link</a></li>
<li>azure devops limits & quotas: <a href="https://docs.microsoft.com/en-us/azure/devops/integrate/concepts/rate-limits">docs</a></li>
<li>azure devops SLA: <a href="https://azure.microsoft.com/en-us/support/legal/sla/azure-devops/v2_0/">docs</a></li>
<li>azure devops product updates (release notes): <a href="https://docs.microsoft.com/en-in/azure/devops/release-notes/">link</a></li>
</ul>
</li>
<li>azure devops support
<ul>
<li><a href="https://developercommunity.visualstudio.com/spaces/21/visual-studio-team-services.html?type=problem">azure devops bugs</a></li>
<li><a href="https://developercommunity.visualstudio.com/spaces/21/visual-studio-team-services.html?type=idea">azure devops feature requests</a></li>
<li><a href="https://azure.microsoft.com/en-in/pricing/details/devops/azure-devops-services/">azure devops pricing</a></li>
<li><a href="https://status.dev.azure.com/">azure devops status</a> | <a href="https://azure.microsoft.com/en-us/status/">azure status</a></li>
<li><a href="https://twitter.com/AzureDevOps">twitter: @azuredevops</a></li>
<li>(unofficial) <a href="https://www.reddit.com/r/azuredevops/">reddit: /r/azuredevops</a></li>
</ul>
</li>
<li>videos
<ul>
<li><a href="https://www.youtube.com/channel/UC-ikyViYMM69joIAv7dlMsA">azure devops (youtube channel)</a></li>
</ul>
</li>
<li>blogs
<ul>
<li><a href="https://devblogs.microsoft.com/devops/">azure devops blog</a></li>
</ul>
</li>
<li>podcasts
<ul>
<li>(unofficial) <a href="http://azuredevopspodcast.clear-measure.com/">azure devops podcast</a></li>
</ul>
</li>
<li>
<p>misc third-party tools</p>
</li>
<li>new to azure devops?
<ul>
<li><a href="https://azuredevopsdemogenerator.azurewebsites.net/">azure devops demo generator</a></li>
<li><a href="https://docs.microsoft.com/en-us/azure/devops/project/navigation/glossary">azure devops glossary</a></li>
<li><a href="https://www.azuredevopslabs.com/">azure devops labs</a> | <a href="https://github.com/Microsoft/azuredevopslabs">github</a></li>
<li><a href="https://docs.microsoft.com/en-us/learn/browse/?products=azure-devops">microsoft learn</a> | <a href="https://github.com/search?q=org%3AMicrosoftDocs+mslearn&type=repositories">github</a></li>
</ul>
</li>
</ul>
<p><em>Know of any more awesome resources related to azure devops that are worth sharing? Would love to hear from you, please leave a comment below or <a href="https://twitter.com/MithunShanbhag">send me a tweet</a>.</em></p>Mithun ShanbhagMy curated list of awesome resources related to azure devops (this will be a living document that I’ll be updating frequently).Speaking Engagements2019-06-19T00:00:00+00:002019-06-19T00:00:00+00:00https://mithunshanbhag.github.io/2019/06/19/speaking-engagements<p>I often speak at meetup groups and tech conferences targeted at software developers and devops engineers. Just like my blog posts, my talks are mostly centered on open-source, cross-platform technologies driven by Microsoft <em>(.net core, asp.net core, azure cloud, powershell core, typescript etc)</em>.</p>
<p>Slides from my talks are <a href="https://www.slideshare.net/mithunshanbhag/presentations">uploaded on slideshare</a>.</p>
<h2 id="upcoming-talks">Upcoming Talks</h2>
<ul>
<li>TBD</li>
</ul>
<h2 id="previous-talks">Previous Talks</h2>
<ul>
<li>Azure Happy Hours: Data Stores On Azure
<ul>
<li><em><a href="https://www.youtube.com/watch?v=uK0kbAfG3fo">Video</a></em></li>
<li><em><a href="https://www.meetup.com/Microsoft-Reactor-Bangalore/events/271748075/">Jul 24, 2020</a> | <a href="https://www.meetup.com/Microsoft-Reactor-Bangalore/">Microsoft Reactor Bangalore (online event)</a></em></li>
</ul>
</li>
<li>Lightning Talk: My experience building CloudSkew (browser-based, real-time, online diagram editor)
<ul>
<li><em><a href="https://youtu.be/_dZwMidN9wY?t=13741">Video (skip to 3:49:00 for my presentation)</a></em></li>
<li><em>June 17, 2020 | <a href="https://ccdays.konfhub.com/">Cloud Community Days (online event)</a></em></li>
</ul>
</li>
<li>Architecture Deep-Dive: CloudSkew.com
<ul>
<li><em><a href="https://www.slideshare.net/mithunshanbhag/cloudskew-architecture">Slides</a> | <a href="https://youtu.be/aZyPlXiXsqY">Video1</a>| <a href="https://youtu.be/b0FMTwO0olc">Video2</a></em></li>
<li><em><a href="https://www.meetup.com/AzureDublin/events/271842024/">Jul 14, 2020</a> | <a href="https://www.youtube.com/channel/UCHZeZzSlTtmfgPozIq8J2Kw">Cloud Lunch and Learn (online event)</a></em></li>
<li><em><a href="https://www.meetup.com/BDotNetUG/events/268474571/">Feb 22, 2020</a> | <a href="https://www.meetup.com/BDotNetUG">Bangalore Dotnet (BDotnet)</a> meetup group</em></li>
<li><em><a href="https://www.meetup.com/SoftwareArchitectsBangalore/events/267425357/">Feb 8, 2020</a> | <a href="https://www.meetup.com/SoftwareArchitectsBangalore/">Software Architects Bangalore</a> meetup group</em></li>
</ul>
</li>
<li>WorkShop: Azure DevOps for DotNetCore Developers
<ul>
<li><em><a href="https://www.slideshare.net/mithunshanbhag/azure-pipelines">Slides</a> | <a href="https://dev.azure.com/mithunshanbhag/workshop-node/_wiki/wikis/workshop%20wiki/1/README">Wiki</a> | Code Samples (<a href="https://dev.azure.com/mithunshanbhag/workshop-node/_git/workshop-blazorwasm">Blazor</a> | <a href="https://dev.azure.com/mithunshanbhag/workshop-node/_git/workshop-dotnetcore">Asp.Net Core</a> | <a href="https://dev.azure.com/mithunshanbhag/workshop-node/_git/workshop-dotnetcoredocker">Asp.Net Core on Docker</a>)</em></li>
<li><em><a href="https://www.meetup.com/CloudOps-Meetup-Bangalore/events/267080729/">Dec 14, 2019</a> | <a href="https://www.microsoftevents.com/profile/form/index.cfm?PKformID=0x8183225abcd">Microsoft Event</a></em></li>
</ul>
</li>
<li>WorkShop: Azure DevOps for NodeJS Developers
<ul>
<li><em><a href="https://www.slideshare.net/mithunshanbhag/azure-pipelines">Slides</a> | <a href="https://dev.azure.com/mithunshanbhag/workshop-node/_wiki/wikis/workshop%20wiki/1/README">Wiki</a> | Code Samples (<a href="https://dev.azure.com/mithunshanbhag/workshop-node/_git/workshop-angular">Angular</a> | <a href="https://dev.azure.com/mithunshanbhag/_git/workshop-node">NodeJS</a>)</em></li>
<li><em><a href="https://www.meetup.com/CloudOps-Meetup-Bangalore/events/266428816/">Nov 23, 2019</a> | <a href="https://www.microsoftevents.com/profile/form/index.cfm?PKformID=0x8163959abcd&ls=Website&lsd=AzureWebsite">Microsoft Event</a></em></li>
</ul>
</li>
<li>Terraform on Azure
<ul>
<li><em><a href="https://youtu.be/oHMei2-CUkY">Video1</a> | <a href="https://youtu.be/ibuHDIwrry8">Video2</a> | <a href="https://www.slideshare.net/mithunshanbhag/terraform-on-azure-166063069">Slides</a> | <a href="https://github.com/mithunshanbhag/meetup-azureblr-08242019/">Code Samples</a></em></li>
<li><em>Dec 8, 2019 | <a href="https://azureadventcalendar.com/">Azure Advent Calendar (online event)</a></em></li>
<li><em><a href="https://www.meetup.com/CloudOps-Meetup-Bangalore/events/266384457/">Dec 7, 2019</a> | <a href="https://www.meetup.com/CloudOps-Meetup-Bangalore">Azure Developers Day at EY (Cloud Computing & DevOps Meetup Bangalore)</a></em></li>
<li><em><a href="https://www.meetup.com/Microsoft-Azure-Bangalore/events/263353117/">Aug 24, 2019</a> | <a href="https://www.meetup.com/Microsoft-Azure-Bangalore/">Microsoft Azure Bangalore</a> meetup group</em></li>
</ul>
</li>
<li>Identity, AuthN & AuthZ with OpenID Connect & OAuth2
<ul>
<li><em><a href="https://youtu.be/ejinvJkBuHI">Video</a> | <a href="https://www.slideshare.net/mithunshanbhag/identity-authentication-and-authorization-162881351">Slides</a> | <a href="https://github.com/mithunshanbhag/meetup-dotnetblr-08102019">Code Samples</a></em></li>
<li><em><a href="https://www.meetup.com/DotNetBLR/events/262410498/">Aug 10, 2019</a> | <a href="https://www.meetup.com/DotNetBLR/">Dotnet Bangalore</a> meetup group</em></li>
</ul>
</li>
<li>Design Patterns for Data Management & Consistency
<ul>
<li><em><a href="https://youtu.be/_nozzpKXeQ4">Video</a> | <a href="https://www.slideshare.net/mithunshanbhag/design-patterns-for-data-management-and-consistency">Slides</a></em></li>
<li><em><a href="https://www.meetup.com/SoftwareArchitectsBangalore/events/261222082/">Jul 13, 2019</a> | <a href="https://www.meetup.com/SoftwareArchitectsBangalore/">Software Architects Bangalore</a> meetup group</em></li>
</ul>
</li>
<li>Internals of WSL (Windows Subsystem for Linux)
<ul>
<li><em><a href="https://youtu.be/I0b5Bef_NtI">Video</a> | <a href="https://www.slideshare.net/mithunshanbhag/wsl-windows-subsytem-for-linux">Slides</a></em></li>
<li><em><a href="https://www.meetup.com/DotNetBLR/events/264545071">Nov 9, 2019</a> | <a href="https://www.meetup.com/DotNetBLR/">Dotnet Bangalore</a> meetup group</em></li>
<li><em><a href="https://www.meetup.com/BangaloreITProUG/events/261867126/">Jun 29, 2019</a> | <a href="https://www.meetup.com/BangaloreITProUG/">Bangalore IT Pro</a> meetup group</em></li>
</ul>
</li>
<li>High Availability Architectures in Azure
<ul>
<li><em><a href="https://youtu.be/fVrOYv5pJag">Video</a> | <a href="https://www.slideshare.net/mithunshanbhag/high-availability-architectures-in-azure-144951319">Slides</a></em></li>
<li><em><a href="https://www.meetup.com/DotNetBLR/events/260241178/">May 11, 2019</a> | <a href="https://www.meetup.com/DotNetBLR/">Dotnet Bangalore</a> meetup group</em></li>
</ul>
</li>
<li>Introduction to Git and Github
<ul>
<li><em><a href="https://youtu.be/rsWsKJSGMAE">Video</a> | <a href="https://www.slideshare.net/mithunshanbhag/crash-course-in-git-and-github">Slides</a> | <a href="https://github.com/skewcode/webinars/tree/master/10-introduction-to-git-and-github/cheatsheet">CheatSheet</a></em></li>
<li><em>Oct 22, 2017 | <a href="https://www.youtube.com/skewcode">Youtube live webinar for SkewCode</a></em></li>
</ul>
</li>
<li>Introduction to SQL
<ul>
<li><em><a href="https://youtu.be/FvJL1Xj5-9w">Video</a> | <a href="https://www.slideshare.net/mithunshanbhag/crash-course-in-sql">Slides</a></em></li>
<li><em>Jun 9, 2017 | <a href="https://www.youtube.com/skewcode">Youtube live webinar for SkewCode</a></em></li>
</ul>
</li>
<li>Creating User-Mode Debuggers for Windows
<ul>
<li><em><a href="https://www.slideshare.net/mithunshanbhag/creating-usermode-debuggers-for-windows">Slides</a></em></li>
<li><em>Circa 2004 | Syracuse University</em></li>
</ul>
</li>
</ul>
<!-- markdownlint-disable-next-line MD033 -->
<p><br />
<em>Please do get in touch if you’d like me to speak at your meetup group or tech conference. You can leave a comment below or <a href="https://twitter.com/MithunShanbhag">DM me on twitter</a>.</em></p>Mithun ShanbhagI often speak at meetup groups and tech conferences targeted at software developers and devops engineers. Just like my blog posts, my talks are mostly centered on open-source, cross-platform technologies driven by Microsoft (.net core, asp.net core, azure cloud, powershell core, typescript etc).High Availability in Azure: Availability Zones2019-03-31T00:00:00+00:002019-03-31T00:00:00+00:00https://mithunshanbhag.github.io/2019/03/31/high-availability-azure-4-availability-zones<p><em>Note: This blog post is part of a series centered around the topic of high availability in Azure:</em></p>
<ul>
<li><em><a href="/2019/02/28/high-availability-azure-1-basics.html">The basics</a></em></li>
<li><em>SLAs and the 9s (coming soon)</em></li>
<li><em><a href="/2019/03/29/high-availability-azure-3-availability-sets.html">Availability Sets</a></em></li>
<li><em><strong>Availability Zones (this post)</strong></em></li>
<li><em><a href="/2019/03/02/high-availability-azure-5-storage.html">Storage redundancies</a></em></li>
<li><em>Load balancing (coming soon)</em></li>
<li><em>Application gateways (coming soon)</em></li>
<li><em><a href="/2019/03/16/high-availability-azure-8-traffic.html">Traffic management</a></em></li>
<li><em><a href="/2019/03/23/high-availability-azure-9-apps.html">App Service, Function Apps</a></em></li>
<li><em>SQL (coming soon)</em></li>
<li><em>CosmosDB (coming soon)</em></li>
<li><em>Wrapping up (coming soon)</em></li>
</ul>
<p><em>I’ll not be addressing scaling (horizontal or vertical), backups/restores and resiliency/healing in these posts. Each of those topics deserve their own series, perhaps I’ll write about them in the future if time permits.</em></p>
<hr />
<h2 id="azure-availability-zones">Azure Availability Zones</h2>
<p><img src="https://assets.cloudskew.com/assets/blog/images/02-azure-availability-zones.jpg" alt="azure availability zones" /></p>
<p>In the <a href="../../../2019/02/28/high-availability-azure-1-basics/#availability-zone">opening post of this blog series</a> we talked about availability zones and how resources can be classified as zone-redundant, zonal (zone-specific) or non-zonal (regional). If you haven’t seen that post, please take a minute to do so.</p>
<p>Availability zones exist to shield your resources against a datacenter-level disaster.</p>
<p>As of the time of writing this blog post, <a href="https://docs.microsoft.com/en-us/azure/availability-zones/az-overview#regions-that-support-availability-zones">only a few Azure regions support availability zones</a>.</p>
<p>Availability zones are free (you’re only charged for the VMs and resources placed in the availability zones).</p>
<h2 id="supported-azure-resources">Supported Azure Resources</h2>
<p>Only a few Azure resource types support availability zones (we’re highlighting a couple of important ones below. The complete list is <a href="https://docs.microsoft.com/en-us/azure/availability-zones/az-overview#regions-that-support-availability-zones">available here</a>).</p>
<ul>
<li>
<p><strong>Virtual Machines</strong>: During creation, a VM can be configured as zonal. Its managed disk and public IP address (standard sku only) are then automatically placed in that same zone.</p>
</li>
<li>
<p><strong>Managed Disks</strong>: During creation, a managed disk can be configured as zonal or non-zonal. <a href="https://docs.microsoft.com/en-us/azure/virtual-machines/windows/snapshot-copy-managed-disk">Snapshots</a> of any managed disks (zonal or otherwise) can be be persisted to zone-redundant storage.</p>
</li>
<li>
<p><strong>Public IPs</strong>: During creation, a Public IP address (standard sku only) can be configured as zone-redundant (default) or zonal. Public IPs with basic sku are non-zonal.</p>
</li>
<li>
<p><strong>Storage Accounts</strong>: With zone-redundant storage, your data is replicated across three availability zones within the same region. We already covered ZRS storage in <a href="../../../2019/03/02/high-availability-azure-5-storage/#zrs-zone-redundant-storage">part 5 of this blog series</a>.</p>
</li>
<li>
<p><strong>Load Balancers (standard sku only)</strong>: During creation, load balancers (standard sku only) can be configured as zone-redundant or zonal. Load balancers with basic sku are non-zonal.</p>
</li>
</ul>
<h2 id="availability-sets-vs-availability-zones">Availability Sets vs Availability Zones</h2>
<p><em>[image attribution: <a href="https://docs.microsoft.com/en-us/azure/architecture/resiliency/">Azure documentation</a>]</em>
<a href="https://docs.microsoft.com/en-us/azure/architecture/resiliency/"><img src="https://assets.cloudskew.com/assets/blog/images/24-azure-avset-vs-avzone.jpg" alt="availability zone vs availability set" /></a></p>
<ul>
<li>
<p>Availability sets provide redundancies within a datacenter, while availability zones provide redundancies within a region. The former shields you against hardware failures in a physical rack, while the latter shields you against a datacenter-level disaster.</p>
</li>
<li>
<p>SLA for VMs in availability zones is predictably higher (99.99% uptime guarantee) than that of VMs in availability sets (99.95% uptime guarantee). <a href="https://azure.microsoft.com/en-in/support/legal/sla/virtual-machines/v1_8/">Full SLA details here</a>.</p>
</li>
<li>
<p>With an availability set, all VMs in it must belong to the same VNET and same resource group. However an availability zone imposes no such restrictions (zonal VMs can belong to any VNET and any resource group within the region).</p>
</li>
<li>
<p>When placing a VM in an availability set, you cannot specify its placement (fault domain, update domain etc). However when placing a VM in an availability zone, you have to specify its zone.</p>
</li>
</ul>
<h2 id="caveats-restrictions-gotchas--tidbits">Caveats, restrictions, gotchas & tidbits</h2>
<ul>
<li>
<p>Zonal resources, once created, cannot be moved to other availability zones within the region. It is however possible to <a href="https://docs.microsoft.com/en-us/azure/site-recovery/move-azure-vms-avset-azone">use Azure Site Recovery to move non-zonal VMs to availability zones in another region</a>.</p>
</li>
<li>
<p>All VMs in an availability zone need not be identical</p>
</li>
<li>
<p>To ensure redundancies in all tiers of your n-tier application, each tier should ideally be placed in a separate availability zone.</p>
</li>
<li>
<p>Some additional caveats with zonal VMs:</p>
<ul>
<li>A zonal VM can only attach to a public IP address that is zone-redundant or zonal (i.e. standard sku only. Basic skus don’t have zonal support).</li>
<li>A zonal VM can only attach a managed disk from the same availability zone. A non-zonal VM can however attach any managed disk from the same region, irrespective of whether it’s zonal or not.</li>
<li>It’s not possible for a zonal VM to use unmanaged disks.
<img src="https://assets.cloudskew.com/assets/blog/images/23-azure-availability-zone-managed-disk.jpg" alt="vm in availability zone must use managed disks" /></li>
</ul>
</li>
<li>
<p>Pro tip: <a href="https://docs.microsoft.com/en-us/azure/load-balancer/tutorial-load-balancer-standard-public-zone-redundant-portal">Pair zonal VMs with a zone-redundant load balancer (standard sku)</a> for traffic equi-distribution amongst the VMs in that availability zone. All the zonal VMs must be connected to the same VNET.</p>
</li>
</ul>
<!-- markdownlint-disable-next-line MD033 -->
<p><br />
<em>That’s all for today folks! Comments? Suggestions? Thoughts? Would love to hear from you, please leave a comment below or <a href="https://twitter.com/MithunShanbhag">send me a tweet</a>.</em></p>Mithun ShanbhagNote: This blog post is part of a series centered around the topic of high availability in Azure:High Availability in Azure: Availability Sets2019-03-29T00:00:00+00:002019-03-29T00:00:00+00:00https://mithunshanbhag.github.io/2019/03/29/high-availability-azure-3-availability-sets<p><em>Note: This blog post is part of a series centered around the topic of high availability in Azure:</em></p>
<ul>
<li><em><a href="/2019/02/28/high-availability-azure-1-basics.html">The basics</a></em></li>
<li><em>SLAs and the 9s (coming soon)</em></li>
<li><em><strong>Availability Sets (this post)</strong></em></li>
<li><em><a href="/2019/03/31/high-availability-azure-4-availability-zones.html">Availability Zones</a></em></li>
<li><em><a href="/2019/03/02/high-availability-azure-5-storage.html">Storage redundancies</a></em></li>
<li><em>Load balancing (coming soon)</em></li>
<li><em>Application gateways (coming soon)</em></li>
<li><em><a href="/2019/03/16/high-availability-azure-8-traffic.html">Traffic management</a></em></li>
<li><em><a href="/2019/03/23/high-availability-azure-9-apps.html">App Service, Function Apps</a></em></li>
<li><em>SQL (coming soon)</em></li>
<li><em>CosmosDB (coming soon)</em></li>
<li><em>Wrapping up (coming soon)</em></li>
</ul>
<p><em>I’ll not be addressing scaling (horizontal or vertical), backups/restores and resiliency/healing in these posts. Each of those topics deserve their own series, perhaps I’ll write about them in the future if time permits.</em></p>
<hr />
<h2 id="azure-availability-sets">Azure Availability Sets</h2>
<p><img src="https://assets.cloudskew.com/assets/blog/images/19-azure-availability-set.png" alt="azure availability sets" /></p>
<p>We’ve already discussed the concepts of <a href="https://docs.microsoft.com/en-us/azure/virtual-machines/windows/regions-and-availability#fault-domains">fault domains</a>, <a href="https://docs.microsoft.com/en-us/azure/virtual-machines/windows/regions-and-availability#update-domains">update domains</a> and <a href="https://docs.microsoft.com/en-us/azure/virtual-machines/windows/regions-and-availability#availability-sets">availability sets</a> in the <a href="../../../2019/02/28/high-availability-azure-1-basics/#fault-domain-physical-server-rack">first post of this series</a>. Visually, you can represent an availability set with a table as follow:</p>
<table>
<thead>
<tr>
<th>——-</th>
<th>FD0</th>
<th>FD1</th>
<th>FD2</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>UD0</strong></td>
<td>VM1</td>
<td> </td>
<td>VM6</td>
</tr>
<tr>
<td><strong>UD1</strong></td>
<td> </td>
<td>VM2</td>
<td> </td>
</tr>
<tr>
<td><strong>UD2</strong></td>
<td> </td>
<td> </td>
<td>VM3</td>
</tr>
<tr>
<td><strong>UD3</strong></td>
<td>VM4</td>
<td> </td>
<td> </td>
</tr>
<tr>
<td><strong>UD4</strong></td>
<td> </td>
<td>VM5</td>
<td> </td>
</tr>
</tbody>
</table>
<p>No two VMs in an availability set share the same fault & update domain. This ensures that there will be at least one available VM in the event of a planned maintenance (where an entire update domain is affected) or hardware failure (where an entire fault domain is affected). The <a href="https://azure.microsoft.com/en-in/support/legal/sla/virtual-machines/v1_8/">SLA for Azure VMs</a> guarantees that if an availability set has two or more VMs, then at least one VM will be available 99.95% of the time.</p>
<p>Availability sets are free (you’re only charged for the VMs and resources placed in the availability sets).</p>
<h2 id="caveats-restrictions-gotchas--tidbits">Caveats, restrictions, gotchas & tidbits</h2>
<ul>
<li>
<p>A VM must be placed in an availability set at the time of creation. Once created, it can’t be moved into an availability set. Also it’s <a href="https://docs.microsoft.com/en-us/azure/virtual-machines/windows/change-availability-set">not possible to change an existing VM’s availability set</a>.</p>
</li>
<li>An availability set forces all its associated VMs to:
<ul>
<li>Be in the same resource group and region (technically they all reside in the same data center actually).</li>
<li>Have their network interfaces associated with the same VNET.</li>
</ul>
</li>
<li>
<p>For HA, a VM can be placed in an availability set or in an availability zone. But NOT both. The former offers HA within a datacenter, the latter offers HA within a region.
<img src="https://assets.cloudskew.com/assets/blog/images/20-azure-avset-vs-avzone.jpg" alt="availability set vs availability zone" /></p>
</li>
<li>
<p>All VMs in an availability set need not be identical, but there are hardware size constraints. Use the <a href="https://docs.microsoft.com/en-us/powershell/module/az.compute/get-azvmsize?view=azps-1.6.0">Get-AzVmSize</a> powershell cmdlet to list all the VM sizes available for a particular availability set (<a href="https://docs.microsoft.com/en-us/azure/virtual-machines/windows/tutorial-availability-sets#check-for-available-vm-sizes">more details</a>).</p>
</li>
<li>For an availability set with (say) 3 FDs and 5 UDs, the <a href="https://blogs.msdn.microsoft.com/plankytronixx/2015/05/01/azure-exam-prep-fault-domains-and-update-domains/">placement of the VMs will generally be as follows</a>:
<ul>
<li>1st VM: FD0, UD0</li>
<li>2nd VM: FD1, UD1</li>
<li>3rd VM: FD2, UD2</li>
<li>4th VM: FD0, UD3</li>
<li>5th VM: FD1, UD4</li>
<li>6th VM: FD2, UD0</li>
<li>and so on…</li>
</ul>
</li>
<li>
<p>Generally an <a href="https://docs.microsoft.com/en-us/azure/virtual-machines/windows/manage-availability#combine-a-load-balancer-with-availability-sets">availability set is paired with a load balancer</a> for traffic equi-distribution amongst the VMs in that availability set.</p>
</li>
<li>
<p>Pro tip: To ensure redundancies in all tiers of your n-tier application, <a href="https://docs.microsoft.com/en-us/azure/virtual-machines/windows/manage-availability#configure-each-application-tier-into-separate-availability-sets">each tier should be placed in a separate availability set</a>.</p>
</li>
<li>Pro tip: Use managed disks & managed availability sets for higher availability. Read more below.</li>
</ul>
<h2 id="managed-disks-and-managed-availability-sets">Managed disks and managed availability sets</h2>
<h3 id="the-issue-with-unmanaged-disks-in-an-availability-set">The issue with unmanaged disks in an availability set</h3>
<p><em>[image attribution: <a href="https://docs.microsoft.com/en-us/azure/virtual-machines/windows/manage-availability">Azure documentation</a>]</em>
<a href="https://docs.microsoft.com/en-us/azure/virtual-machines/windows/manage-availability?#use-managed-disks-for-vms-in-an-availability-set"><img src="https://assets.cloudskew.com/assets/blog/images/21-azure-av-set-unmanaged-disks.jpg" alt="unmanaged availability set" /></a></p>
<p>The storage accounts associated with unmanaged disks in an availability set are all placed in a single storage scale unit (stamp), which then becomes a single point of failure.</p>
<h3 id="benefits-of-managed-disks">Benefits of managed disks</h3>
<p>With <a href="https://docs.microsoft.com/en-gb/azure/virtual-machines/windows/managed-disks-overview">Azure managed disks</a>, you no longer have to explicitly provision storage accounts to back your disks. Managed disks provide a convenient abstraction over storage accounts, blob containers and page blobs. Internally, managed disks use <a href="../../../2019/03/02/high-availability-azure-5-storage/#lrs-locally-redundant-storage">LRS storage</a> (3 redundant copies within a storage scale unit inside a single datacenter).</p>
<h3 id="managed-disks-go-in-managed-availability-sets">Managed disks go in managed availability sets</h3>
<p>If you plan to use managed disks, please ensure you select the “aligned” option while creating the availability set. This effectively creates a managed availability set.</p>
<p><img src="https://assets.cloudskew.com/assets/blog/images/20-azure-managed-availability-set.jpg" alt="creating managed availability set" /></p>
<p>To <a href="https://docs.microsoft.com/en-gb/azure/virtual-machines/windows/migrate-to-managed-disks">migrate VMs in an existing availability set to managed disks</a>, the availability set itself needs to be <a href="https://docs.microsoft.com/en-gb/azure/virtual-machines/windows/convert-unmanaged-to-managed-disks">converted to a managed availability set</a>. This can be done via the Azure portal or via the <a href="https://docs.microsoft.com/en-us/powershell/module/az.compute/update-azavailabilityset?view=azps-1.6.0">Update-AzAvailabilitySet</a> powershell cmdlet. Once converted, only VMs with managed disks can be added to the availability set (existing VMs with unmanaged disks in the availability set will continue to operate as before).</p>
<p>Please note that the <a href="https://docs.microsoft.com/en-us/azure/virtual-machines/windows/manage-availability#number-of-fault-domains-per-region">max number of managed FDs will depend on the availability set’s region</a>.</p>
<h3 id="managed-availability-sets-get-it-right">Managed availability sets get it right</h3>
<p><em>[image attribution: <a href="https://docs.microsoft.com/en-us/azure/virtual-machines/windows/manage-availability">Azure documentation</a>]</em>
<a href="https://docs.microsoft.com/en-us/azure/virtual-machines/windows/manage-availability?#use-managed-disks-for-vms-in-an-availability-set"><img src="https://assets.cloudskew.com/assets/blog/images/22-azure-av-set-managed-disks.jpg" alt="unmanaged availability set" /></a></p>
<p>The managed disks in an availability set are all placed in a multiple storage scale units (stamps), aligned with VM FDs, avoiding a single point of failure. In the event of a storage scale unit failing, only VMs with managed disks in that storage scale unit will fail (other VMs will be unaffected). This increases the overall availability of the VMs in that availability set.</p>
<!-- markdownlint-disable-next-line MD033 -->
<p><br />
<em>That’s all for today folks! Comments? Suggestions? Thoughts? Would love to hear from you, please leave a comment below or <a href="https://twitter.com/MithunShanbhag">send me a tweet</a>.</em></p>Mithun ShanbhagNote: This blog post is part of a series centered around the topic of high availability in Azure:High Availability in Azure: App Service, Function Apps2019-03-23T00:00:00+00:002019-03-23T00:00:00+00:00https://mithunshanbhag.github.io/2019/03/23/high-availability-azure-9-apps<p><em>Note: This blog post is part of a series centered around the topic of high availability in Azure:</em></p>
<ul>
<li><em><a href="/2019/02/28/high-availability-azure-1-basics.html">The basics</a></em></li>
<li><em>SLAs and the 9s (coming soon)</em></li>
<li><em><a href="/2019/03/29/high-availability-azure-3-availability-sets.html">Availability Sets</a></em></li>
<li><em><a href="/2019/03/31/high-availability-azure-4-availability-zones.html">Availability Zones</a></em></li>
<li><em><a href="/2019/03/02/high-availability-azure-5-storage.html">Storage redundancies</a></em></li>
<li><em>Load balancing (coming soon)</em></li>
<li><em>Application gateways (coming soon)</em></li>
<li><em><a href="/2019/03/16/high-availability-azure-8-traffic.html">Traffic management</a></em></li>
<li><em><strong>App Service, Function Apps (this post)</strong></em></li>
<li><em>SQL (coming soon)</em></li>
<li><em>CosmosDB (coming soon)</em></li>
<li><em>Wrapping up (coming soon)</em></li>
</ul>
<p><em>I’ll not be addressing scaling (horizontal or vertical), backups/restores and resiliency/healing in these posts. Each of those topics deserve their own series, perhaps I’ll write about them in the future if time permits.</em></p>
<hr />
<h2 id="azure-app-service-apps-web-apps">Azure App Service Apps (web apps)</h2>
<p><img src="https://assets.cloudskew.com/assets/blog/images/13-azure-app-service.png" alt="azure storage account" /></p>
<p>An <a href="https://docs.microsoft.com/en-us/azure/app-service/overview-hosting-plans">Azure App Service Plan</a> is pinned to a specific <a href="../../../2019/02/28/high-availability-azure-1-basics/#region">Azure Region</a>. Any <a href="https://docs.microsoft.com/en-us/azure/app-service/overview">App Service Apps</a> created in the App Service Plan will be provisioned in that same region. If your app needs additional redundancies in other regions or <a href="../../../2019/02/28/high-availability-azure-1-basics/#geography">geographies</a>, you’ll have to:</p>
<ol>
<li>Provision them yourself (you’ll need to create new App Service Plans in those regions, if they don’t already exist).</li>
<li>Use <a href="/2019/03/16/high-availability-azure-8-traffic.html">Azure Traffic Manager</a> to route traffic to all available redundancies (you can only specify one App Service endpoint per region in a Traffic Manager profile). <a href="https://docs.microsoft.com/en-us/azure/app-service/web-sites-traffic-manager#app-service-and-traffic-manager-profiles">More details here</a>.</li>
</ol>
<p><em>[image attribution: <a href="https://docs.microsoft.com/en-us/azure/architecture/reference-architectures/basic-web-app">Azure documentation</a>]</em>
<img src="https://assets.cloudskew.com/assets/blog/images/14-azure-app-service-redundancy.jpg" alt="azure app service redundancy" /></p>
<p>The <a href="https://azure.microsoft.com/en-in/support/legal/sla/app-service/v1_4/">SLA for Azure App Services</a> guarantee a 99.95% uptime for each regional deployment.</p>
<h2 id="azure-function-apps">Azure Function Apps</h2>
<p><img src="https://assets.cloudskew.com/assets/blog/images/15-azure-functions.png" alt="azure functions" /></p>
<p><a href="https://docs.microsoft.com/en-us/azure/azure-functions/functions-overview">Azure Function Apps</a> too have regional deployments. If you’re using the <a href="https://docs.microsoft.com/en-us/azure/azure-functions/functions-scale#consumption-plan">consumption plan</a>, then you explicitly specify the region. If on the <a href="https://docs.microsoft.com/en-us/azure/azure-functions/functions-scale#app-service-plan">App Service Plan</a>, then the region is the same as that of the App Service Plan.</p>
<p>Similar to App Services above, any additional redundancies will have to be explicitly created and traffic to these will have to be routed via Azure Traffic Manager.</p>
<p><em>[image attribution: <a href="https://docs.microsoft.com/en-us/azure/architecture/reference-architectures/app-service-web-app/multi-region">Azure documentation</a>]</em>
<a href="https://docs.microsoft.com/en-us/azure/architecture/reference-architectures/app-service-web-app/multi-region"><img src="https://assets.cloudskew.com/assets/blog/images/16-azure-functions-redundancy.jpg" alt="azure functions redundancy" /></a></p>
<p>The <a href="https://azure.microsoft.com/en-us/support/legal/sla/functions/v1_1/">SLA for Azure Functions</a> guarantee a 99.95% uptime for each regional deployment (for both app service plan and consumption plan).</p>
<h2 id="miscellaneous">Miscellaneous</h2>
<h3 id="horizontally-scaled-instances">Horizontally scaled instances</h3>
<p>As <a href="../../../2019/02/28/high-availability-azure-1-basics#what-about-vm-scale-sets">I’ve previously mentioned</a>, horizontal auto-scaling exists to address performance concerns rather than high-availability concerns.</p>
<p><em><strong>App Service Apps</strong></em>: When horizontal auto-scaling is enabled on a parent App Service Plan, additional instances are created, and each instance hosts all App Service Apps contained in the parent App Service Plan. All instances are created in the same <a href="#webspaces">WebSpace</a>. The App Service’s integrated load-balancer (non-accessible) manages the traffic. Note that all scaled out instances of an app will still have the same endpoint URL.</p>
<p><em><strong>Function Apps</strong></em>: Based on a combination of factors (trigger types, rate of incoming requests, language/runtime and perhaps the <a href="https://github.com/Azure/azure-functions-host/wiki/Host-Health-Monitor">host health-monitor stats</a>), the <a href="https://docs.microsoft.com/en-in/azure/azure-functions/functions-scale#runtime-scaling">scale controller</a> will create additional instances of an Azure Function App (max limit of 200 instances). Note that the scaling unit is the Function App (host) itself and not individual functions.</p>
<p>Bonus reading:</p>
<ul>
<li>Read more about the <a href="https://docs.microsoft.com/en-in/azure/azure-subscription-service-limits#app-service-limits">scaling limits imposed on App Service Apps</a> based on <a href="https://azure.microsoft.com/en-us/pricing/details/app-service/windows/">pricing tiers</a>.</li>
<li>Read more about <a href="https://stackoverflow.com/a/49651618">ARR affinity</a> and <a href="https://azure.microsoft.com/en-in/blog/disabling-arrs-instance-affinity-in-windows-azure-web-sites/">ARRAffinity cookies</a> for scaled out instances.</li>
<li>You can now enable <a href="https://docs.microsoft.com/en-us/azure/app-service/manage-scale-per-app">per-app horizontal scaling</a>. More details <a href="https://markheath.net/post/per-app-scaling-app-service">in this blog post</a>.</li>
<li>Read more about the <a href="https://docs.microsoft.com/en-in/azure/azure-functions/functions-scale#understanding-scaling-behaviors">scaling behavior</a> of Function Apps.</li>
</ul>
<h3 id="the-always-on-setting">The “Always On” setting</h3>
<p>If you have an App Service App or a Function App associated with an App Service Plan in the production or isolated tier, then you should consider enabling the “always on” setting. This ensures that your app is always running and never unloaded (default behavior is to deactivate/unload idle apps to conserve resources).</p>
<p>Notes:</p>
<ul>
<li>This setting is not available for App Service Apps in dev/test tier.</li>
<li>Idle Function Apps in the consumption plan will be subject to <a href="https://blogs.msdn.microsoft.com/appserviceteam/2018/02/07/understanding-serverless-cold-start/">cold start latency</a>.</li>
</ul>
<p><img src="https://assets.cloudskew.com/assets/blog/images/17-azure-app-service-always-on.jpg" alt="azure app service always on" /></p>
<h3 id="cloning-and-moving-app-service-apps">Cloning and Moving App Service Apps</h3>
<p>Using Azure Powershell, it is possible to <a href="https://docs.microsoft.com/en-us/azure/app-service/app-service-web-app-cloning">create clones of existing App Service App</a> within the same region or in a new region. Please note that there are some <a href="https://docs.microsoft.com/en-us/azure/app-service/app-service-web-app-cloning#current-restrictions">caveats/restrictions</a> though.</p>
<p>You can also <a href="https://docs.microsoft.com/en-us/azure/app-service/app-service-plan-manage#move-an-app-to-another-app-service-plan">move an App Service App to another App Service plan</a> as long as both the source plan and the destination plan are within the same <a href="#webspaces">WebSpace</a>.</p>
<p>FWIW, I’ve never tried this out myself.</p>
<p>And yes, like any other Azure Resource, App Service Plans and App Service Apps can be moved between resource groups.</p>
<h3 id="webspaces">WebSpaces</h3>
<p>WebSpaces are units of deployment for Azure App Service Plans. An <a href="https://docs.microsoft.com/en-us/azure/app-service/app-service-plan-manage#move-an-app-to-another-app-service-plan">App Service Plan’s WebSpace</a> is identified by the combination of its resource group and the region in its deployed. Any additional App Service Plan deployments to the same resource group + region combination gets assigned to the same WebSpace. See <a href="https://github.com/projectkudu/kudu/wiki/ResourceGroup-VS.-WebSpace">more details here</a>.</p>
<p>To see the WebSpace associated with an App Service App or App Service Plan, navigate to that resource in the Azure Resource Explorer (via the <a href="https://portal.azure.com/#blade/HubsExtension/ArmExplorerBlade">Azure Portal</a> or via the <a href="https://resources.azure.com/">website</a>) and see the <code class="language-plaintext highlighter-rouge">WebSpace</code> and <code class="language-plaintext highlighter-rouge">SelfLink</code> properties.</p>
<!-- markdownlint-disable-next-line MD033 -->
<p><br />
<em>That’s all for today folks! Comments? Suggestions? Thoughts? Would love to hear from you, please leave a comment below or <a href="https://twitter.com/MithunShanbhag">send me a tweet</a>.</em></p>Mithun ShanbhagNote: This blog post is part of a series centered around the topic of high availability in Azure:High Availability in Azure: Traffic management2019-03-16T00:00:00+00:002019-03-16T00:00:00+00:00https://mithunshanbhag.github.io/2019/03/16/high-availability-azure-8-traffic<p><em>Note: This blog post is part of a series centered around the topic of high availability in Azure:</em></p>
<ul>
<li><em><a href="/2019/02/28/high-availability-azure-1-basics.html">The basics</a></em></li>
<li><em>SLAs and the 9s (coming soon)</em></li>
<li><em><a href="/2019/03/29/high-availability-azure-3-availability-sets.html">Availability Sets</a></em></li>
<li><em><a href="/2019/03/31/high-availability-azure-4-availability-zones.html">Availability Zones</a></em></li>
<li><em><a href="/2019/03/02/high-availability-azure-5-storage.html">Storage redundancies</a></em></li>
<li><em>Load balancing (coming soon)</em></li>
<li><em>Application gateways (coming soon)</em></li>
<li><em><strong>Traffic management (this post)</strong></em></li>
<li><em><a href="/2019/03/23/high-availability-azure-9-apps.html">App Service, Function Apps</a></em></li>
<li><em>SQL (coming soon)</em></li>
<li><em>CosmosDB (coming soon)</em></li>
<li><em>Wrapping up (coming soon)</em></li>
</ul>
<p><em>I’ll not be addressing scaling (horizontal or vertical), backups/restores and resiliency/healing in these posts. Each of those topics deserve their own series, perhaps I’ll write about them in the future if time permits.</em></p>
<hr />
<h2 id="azure-traffic-manager">Azure Traffic Manager</h2>
<p><img src="https://assets.cloudskew.com/assets/blog/images/08-azure-traffic-manager.png" alt="azure storage account" /></p>
<p><a href="https://docs.microsoft.com/en-us/azure/traffic-manager/">Azure Traffic Manager</a> routes a client’s DNS query to an appropriate service endpoint, selected based on a combination of factors:</p>
<ul>
<li>traffic routing methods (user selected)</li>
<li>health of the endpoints (user configured probing/monitoring rules)</li>
<li>latency tables (internally maintained map of ip address ranges to regions)</li>
</ul>
<p><em>[image attribution: <a href="https://docs.microsoft.com/en-us/azure/traffic-manager/traffic-manager-how-it-works#how-clients-connect-using-traffic-manager">Azure documentation</a>]</em>
<a href="https://docs.microsoft.com/en-us/azure/traffic-manager/traffic-manager-how-it-works#how-clients-connect-using-traffic-manager"><img src="https://assets.cloudskew.com/assets/blog/images/10-azure-traffic-manager-dns.jpg" alt="azure traffic manager internals" /></a></p>
<p>Some scenarios that can be addressed with Azure Traffic Manager are:</p>
<ul>
<li>always routing to primary endpoint (with failover to secondary when primary endpoint’s health degrades).</li>
<li>always routing to endpoint with lowest latency.</li>
<li>always routing to specific regional endpoint for data sovereignty compliance.</li>
<li>enabling blue/green deployments with weighted routing.</li>
</ul>
<p>The <a href="https://azure.microsoft.com/en-in/support/legal/sla/traffic-manager/v1_0/">Azure Traffic Manager SLA</a> is 99.99%.</p>
<h2 id="things-it-is-not-or-does-not-do">Things it is not (or does not do)</h2>
<ul>
<li>not a gateway or a proxy. Traffic between the client and the service endpoint does not pass through the traffic manager. Once the traffic manager points a client to a service endpoint, the client communicates with the endpoint directly.</li>
<li>not a layer-7 (application level) solution.</li>
<li>not a DNS server.</li>
<li>not a WAF.</li>
<li>does not offer TLS termination / SSL offload.</li>
<li>does not offer sticky sessions.</li>
</ul>
<h2 id="the-holy-trinity">The holy trinity</h2>
<p>Azure Traffic Manager is used in conjunction with <a href="https://docs.microsoft.com/en-us/azure/application-gateway/">Azure Application Gateways</a> and <a href="https://docs.microsoft.com/en-us/azure/load-balancer/">Azure Load Balancers</a>. Here is a <a href="https://docs.microsoft.com/en-us/azure/traffic-manager/traffic-manager-load-balancing-azure">nice article</a> that explains how the trio complement each other.</p>
<p><em>[image attribution: <a href="https://docs.microsoft.com/en-us/azure/traffic-manager/traffic-manager-load-balancing-azure">Azure documentation</a>]</em>
<a href="https://docs.microsoft.com/en-us/azure/traffic-manager/traffic-manager-load-balancing-azure#scenario"><img src="https://assets.cloudskew.com/assets/blog/images/09-azure-load-balancing-options.jpg" alt="azure load balancing options" /></a></p>
<h2 id="traffic-routing-methods">Traffic routing methods</h2>
<p>The official docs capture all the <a href="https://docs.microsoft.com/en-us/azure/traffic-manager/traffic-manager-routing-methods">traffic routing methods</a> in great detail. However let me provide a quick recap below:</p>
<p><img src="https://assets.cloudskew.com/assets/blog/images/11-azure-traffic-manager-routing-methods.jpg" alt="azure traffic manager routing methods" /></p>
<h3 id="performance-routing">performance routing</h3>
<p><em>(<a href="https://docs.microsoft.com/en-us/azure/traffic-manager/traffic-manager-routing-methods#performance-traffic-routing-method">official docs</a> | <a href="https://docs.microsoft.com/en-us/azure/traffic-manager/tutorial-traffic-manager-improve-website-response">tutorial</a>)</em></p>
<p>Use this when you need to route traffic to a service endpoint with the lowest network latency (as measured from the client IP address).</p>
<p>The Azure Traffic Manager maintains an internal “latency table”, that maps the latencies of IP address ranges to various Azure Regions. Upon an incoming recursive DNS request, it looks up the client’s IP address and detects the IP address range that it falls under. For that address range, it picks up an available service endpoint from an Azure region with the lowest possible latency. If multiple service endpoints are detected within the same Azure region, then the Azure Traffic Manager distributes traffic evenly across them.</p>
<h3 id="priority-routing">priority routing</h3>
<p><em>(<a href="https://docs.microsoft.com/en-us/azure/traffic-manager/traffic-manager-routing-methods#priority-traffic-routing-method">official docs</a> | <a href="https://docs.microsoft.com/en-us/azure/traffic-manager/traffic-manager-configure-priority-routing-method">tutorial</a>)</em></p>
<p>Use this when you want to route all traffic to a primary endpoint (with a secondary on standby).</p>
<p>All service endpoints are assigned a priority number (value between 1 and 1000 with 1 being highest priority and 1000 being lowest). The primary gets assigned the highest priority (i.e. lowest number) and as a result all traffic gets routed to it. If the primary’s health degrades, all traffic gets routed to the secondary, which has the next highest priority. Manual fail-overs can be initiated by bumping the secondary to higher priority.</p>
<h3 id="weighted-routing">weighted routing</h3>
<p><em>(<a href="https://docs.microsoft.com/en-us/azure/traffic-manager/traffic-manager-routing-methods#weighted-traffic-routing-method">official docs</a> | <a href="https://docs.microsoft.com/en-us/azure/traffic-manager/tutorial-traffic-manager-weighted-endpoint-routing">tutorial</a>)</em></p>
<p>Use this when you need to do staggered roll-outs, blue/green deployments.</p>
<p>All service endpoints are assigned a weight (value between 1 and 1000, 1 being lowest weight and 1000 being highest). The traffic manager will attempt to route traffic to available service endpoints based on weighted priorities.</p>
<p>Note: Weighted routing is different from priority routing mentioned above. In priority routing, only the highest priority endpoint is selected and others are ignored (until the highest priority endpoint’s health degrades). With weighted routing, the traffic manager does route traffic to all endpoints, but uses the assigned weights to choose a specific endpoint on each incoming request.</p>
<h3 id="geographic-routing">geographic routing</h3>
<p><em>(<a href="https://docs.microsoft.com/en-us/azure/traffic-manager/traffic-manager-routing-methods#geographic-traffic-routing-method">official docs</a> | <a href="https://docs.microsoft.com/en-us/azure/traffic-manager/traffic-manager-configure-geographic-routing-method">tutorial</a> | <a href="https://docs.microsoft.com/en-us/azure/traffic-manager/traffic-manager-faqs#traffic-manager-geographic-traffic-routing-method">faqs</a>)</em></p>
<p>Use this when you need to geo-fence your users to specific regions/geographies (for data sovereignty reasons etc).</p>
<p>Per configuration, client requests will get serviced by endpoints from the specified region (this may or may not be the endpoint with lowest latency). Regional endpoints can be assigned at the following granularities:</p>
<ul>
<li>world (highest granularity)</li>
<li>regional grouping (roughly the same as <a href="../../../2019/02/28/high-availability-azure-1-basics/#geography">Azure Geographies</a>)</li>
<li>country</li>
<li>state (lowest granularity, only available for USA, Canada and Australia as of the time of writing this blog post).</li>
</ul>
<p>Lookup always starts from the lowest granularity goes to highest granularity and first match found is returned.</p>
<h3 id="subnet-routing">subnet routing</h3>
<p><em>(<a href="https://docs.microsoft.com/en-us/azure/traffic-manager/traffic-manager-routing-methods#subnet-traffic-routing-method">official docs</a> | <a href="https://docs.microsoft.com/en-us/azure/traffic-manager/tutorial-traffic-manager-subnet-routing">tutorial</a> | <a href="https://docs.microsoft.com/en-us/azure/traffic-manager/traffic-manager-faqs#traffic-manager-subnet-traffic-routing-method">faqs</a>)</em></p>
<p>Use this when you need to map specific client IP address ranges to specific service endpoints.</p>
<h3 id="multivalue-routing">Multivalue routing</h3>
<p><em>(<a href="https://docs.microsoft.com/en-us/azure/traffic-manager/traffic-manager-routing-methods#multivalue-traffic-routing-method">official docs</a> | <a href="https://docs.microsoft.com/en-us/azure/traffic-manager/traffic-manager-faqs#traffic-manager-multivalue-traffic-routing-method">faqs</a>)</em></p>
<p>Just mentioning it for completeness sake; I haven’t actually used it ever.</p>
<!-- markdownlint-disable-next-line MD033 -->
<p><br />
<em>That’s all for today folks! Comments? Suggestions? Thoughts? Would love to hear from you, please leave a comment below or <a href="https://twitter.com/MithunShanbhag">send me a tweet</a>.</em></p>Mithun ShanbhagNote: This blog post is part of a series centered around the topic of high availability in Azure: