Tuesday, March 30, 2021

Redirecting Traffic Based On Priority Using Azure Traffic Manager

For any web application to work there has to be an associated end point, which means whenever users sends a request, endpoint is the first thing which gets hit. If I say in simple term, endpoint is an internet facing service which could be hosted either in Microsoft Azure or outside of Azure.

What is Azure Traffic Manager

Now what is Traffic Manager? As it’s name suggests, it manages the traffic. It distributes the traffic across various Azure regions along with health monitoring capabilities. So, if you are planning for a multi-region support with high availability, it could be a perfect service for you. 

Now, you must be thinking, what is the core which is making this happen? Actually it uses the DNS to route traffic to endpoints based on the selected Traffic Manger profile and the configured routing mechanisms. I’ll shortly mention about what all routing methods are available but before that let’s take a quick look at some of the major benefits which we can achieve using Traffic Manager. 

Benefits of using Azure Traffic Manager

  • Traffic Manager provides automatic failover whenever endpoint goes down as it keeps monitoring the end points.
  •  In case of planned maintenance activity, Traffic Manager redirects the traffic to other end points which are configured. So, we need not to worry about any downtime windows.
  • Traffic Manager has the ability to perform calculation to know which end point will provide lowest latency to the user. In a way, Traffic Manager improves the responsiveness by redirecting the traffic to such end points.
  • Another important capability of Traffic Manager is, it not only supports Azure end points, but it also go hand-in-hand with external non-Azure endpoints.
  • And lastly, Traffic Manager allows to combine multiple routing methods to achieve any complex business scenarios using nested profiling mechanism.

Ways to manage traffic

Currently, there are 6 ways once can manage DNS routing. 


Performance 

This method is useful, when endpoints are configured in different geographic locations and one wants to select the closet one, in terms of lowest network latency.


Weighted

In this method, one can create endpoints with designated weights, ranging between 1 and 1000 and based on the weight, traffic is redirected accordingly.


Geographical

This method route users based on the geo location or say, it works based on the geography their DNS query originates from. It may look similar to performance but actually it’s different. The best use case, I can think of is, let’s say due to some compliance and government regulations one wants all the traffic from EAST US to be redirected to WEST US endpoint. So, this can be achieved by selecting the geo based profile.


Priority

As it’s name says, it works on the basis of assigned priority. So, whichever endpoint is having higher priority, traffic would be redirected to that one. By any chance, if endpoint having highest priority is down or not healthy, request will automatically be redirected to the endpoint which is assigned as 2nd highest priority and it keeps going on. Such routing method is very useful in disaster recovery scenarios.


Multivalue

In this type of routing method, there exists multiple endpoints for a single client request. One caveat here is, one can not go with server name mappings and has to mandatorily go with IPv4 or IPv6 one. Unfortunately, I couldn’t find any real-time use case here.


Subnet

This method allows to map range of IP addresses to specific endpoints. Say, you want certain users or to be specific certain IP addresses to always use WEST US endpoint and rest all can use other end points then this routing method can be used.

Well enough of theory. Let’s have a look at practical example of how priority based DNS routing works.


Thursday, March 25, 2021

Enabling Preview Features in Visual Studio 2019

By default, Visual Studio doesn’t enable preview feature selection in Visual Studio 2019. Say you have .Net 5.0 installed on your machine and you are creating a new Console Application.

 After creating the application, you will notice that, although .Net 5.0 is installed, application still picks up the .Net Core 3.1 as a default framework. In fact, application didn’t ask for framework selection too.

So, how can we select the framework while creating an application itself. For doing this, we need to enable Preview Features in Visual Studio by going to Options menu as shown below:












Video of this feature can be found here.

Hope you enjoyed learning this cool tip.

Monday, March 22, 2021

Get Notified via Azure Event Grid whenever Azure Blob is updated

In this article, we will learn how to get notification whenever something is changed in Azure Storage. Let’s say, we want our application to get notified whenever any new file is uploaded to the blob or say any file is deleted from the blob. How can we do that?

Before directly jumping into the solution, let’s have all the major pieces listed here which will contribute towards this.

Azure Storage: We need an Azure storage wherein we will be uploading our blog objects, i.e. image files.

Azure Event Grid: Next we need is Azure Event Grid. It is a routing service provided by Microsoft and the best part about this service is, it has built-in support for events coming from storage blobs and resource groups. So, we need to create a subscription which will tell what event and which specific topic we are interested in.

Endpoint: Lastly, we need an endpoint, which will receive notifications. So, it could be Function App, Logic App, or any custom application which is hosted somewhere and is accessible over HTTP.

With this much brief theoretical knowledge, we are good to proceed for implementation.

Complete article can be found here.

Video tutorial can be found here.

Saturday, March 20, 2021

Bring Azure Blob Objects Back to Life

Nowadays, there are many applications which are utilizing Azure Blob Storage for reading and writing objects. Looking at that, it’s quite common that these objects may get deleted accidentally due to user’s negligence or application's behavior. 

So, my today’s writeup is around this topic wherein we will see, how can we bring back our deleted blob objects back to life.

Lifecycle of blob storage is managed by a very well-known concept called Versioning. Versioning deals with the state - when any object was created, when was it modified or when was it deleted. If this topic impresses you, you can read complete blog post here or you can view it on my YouTube channel.

Thursday, March 18, 2021

Azure App Registration and Microsoft Graph API

As part of Sip and Learn series, this time I covered a very interesting topic – App registration for Microsoft Graph API in AAD. Here you will get to know how to do application registration using Azure portal and what all permissions need to be given to call particular type of API. If this topic is of use to you, do view this episode on my channel.

Thursday, March 11, 2021

Using Postman to interact with Microsoft Graph API

I have added another episode to my technical series named Sip and Learn on YouTube. It covers the topic, how one can play with Postman for Microsoft Graph API. I also mentioned about how one can generate bearer token and what all header fields are necessary to make an API call. You can watch complete episode over here.

Monday, March 8, 2021

Top Level Statement

Last week, I started my technical series on YouTube Channel with the name Sip and Learn. As part of this series, I'm planning to share some of the interesting short technical tips and concepts which are very easy to grab in just few minutes. Here, I speak about Top Level Statements feature of C# 9.0 as part of my first episode. You can go through this session here.

Monday, March 1, 2021

Simplifying use of Static

Hope everyone must have come across static keyword while doing development, specifically using C#. Static modifier is used to declare static member, which means it belong to the type itself. Well, as part of this article, I’m not going to discuss more about static, but if you are interested in knowing more about it, here is the good reference. 

  1. public class Logger  
  2. {  
  3.      public static int GetLogLevel(string logType)  
  4.     {  
  5.          …  
  6.     }  
  7. } 

Above is a sample code snippet wherein, we have a class called Logger and it has a static method called GetLogLevel.

Now in order to call this GetLogLevel(…) method, first we have to add the required namespace, where this Logger class has been defined. Something like this,

  1. using Planner.Utilities;  

Well, nothing new as of now. Next, let’s have a look at, how to make a call to this static method.

  1. int logLevel = Logger.GetLogLevel(fileLog);  

Till here, nothing that bad, but we do have a room to improve our code by making it more readable and cleaner. Let’s re-write our code in below two steps:

Step 1: Using static keyword along with namespace

  1. using static Planner.Utilities.Logger;  

Step 2: Remove class name while calling static method

As we have already referred our class along with namespace, we need not to write that again. Hence, we can directly call our static method as shown below:

  1. int logLevel =GetLogLevel(fileLog);  

What do you think about this approach? Isn’t it cool?

Thursday, February 25, 2021

Speaker at C# Corner MVP Ft Show

Yesterday I got a privilege to be a speaker on C# Corner MVP Show. It was a great show and a wonderful interaction with host Stephan Simon on my topic ‘Handling Notifications using Microsoft Graph’. Recording is available over here.

Thursday, February 18, 2021

Troubleshooting Bad Gateway errors for Ngrok

Ngrok is one of the well-known tool for local tunneling solution. I have used it many times being the easiest tool for any developer.

This time once again, I thought to use Ngrok for my current application, which uses Graph API to get notifications from Microsoft Teams channel. As always, I launched the Ngrok with required port as shown below:

  1. ngrok http 44332  

and it got connected as shown below:







Till now everything is alright. But now when I ran my application with Ngrok’s forwarding address, I end up getting an error - 400 Bad Request.








And here is what I read more about this:

Seems like some applications can’t deal with the default behavior of Ngrok and need an explicit mention of header information, which means there is another way to handle such scenario:

  1. ngrok http http://localhost:44332 -host-header="localhost:44332"

After connecting Ngrok with above command, everything went very smooth and as expected.







Hope this tip would be useful for you too.