Saturday, 25 July 2015

Exploring Event Hubs in Azure

Hi All,

Recently in project I got a chance to explore Azure Event Hub and I really liked it, its brilliant service from Azure for some targeted scenarios. There is lots of good stuff available but since it took time for me to explore, I thought to share here in a simple way. Lets start the show :)

What is Event Hub : 

1. Event hub is a azure service that can be used to take large amount of data/events (can take/log millions of data/events per second in near real time). 
2. This large amount of data can be collected from WebSites, client apps (Mobile, web), IOT sensors, feeds from social network 
3. Process/analyze this large amount of event data using any real-time analytics system like Apache Storm, Azure analytic system etc.
4. Either store/transform this data into any data storage system including blob storage, hDInsight and Hadoop based solutions

Scenarios: What are the scenarios where we can think to use Event Hub?

1. Where we need to integrate/coordinate/receive millions of things (IoT Internet of Things), for example receive messages from millions of sensors, coordinate messages between thousands of trains or taxis and why not, send millions of logging messages to the Cloud (On Premise Tracking/Monitoring/Advertising Centralization) and more.
2. Where we need to collect audit data from devices on the field.
3. To collect the GPS locations of devices. 
And many more...

Few points to be consider while using Event Hubs

1. Event data size: Maximum event data of a batch that contains multiple event data is 256kb.

This is all about theory part, now we will see how to send the messages to Event Hub and receive those for further analyzing/processing. 

Steps:
1. We need to create Event Hub in Azure Portal. For this we will require Azure account to login to Azure management portal. If you don't have an azure account we can also create free trial azure account.

2. Log on to Azure management portal. Click on “+NEW” 


 Go to APP SERVICES >> SERVICE BUS >> EVENT HUB as


 Click on QUICK CREATE and enter the respective details “EVENT HUB NAME”, “REGION” and ‘’NAMSPACE NAME” as
  

Once event hub successfully created, you will see as


 So here event hub is created now we will send and receive the message to event hub.  

Now lets explore the code require for sending message. Before starting code we will require sdk for “Microsoft Service Azure Bus”, you can install it with the help of NuGet manager as 
 

Once the above NuGet package installed it will add references to ServiceBus library. To send the message we will also require the event hub connection string, which we will get from azure management portal, click on the namespace 




Click on Management tasks >> Manage Connection Strings, we will get the connection string for sending and receiving the messages as


 Copy the above connection strings. 

And finally, following is the code for sending the message:

var eventHubClient = EventHubClient.CreateFromConnectionString(connectionString, eventHubName);
   try{
      var serializedString = JsonConvert.SerializeObject(“Message to send”);
      EventData data = new EventData(Encoding.UTF8.GetBytes(serializedString));
      data.PartitionKey = "15";
                
      await eventHubClient.SendAsync(data);

     }catch (Exception exception){
//ToDo: Exception handling
     }

Receiving the message:

For receiving message we use EventProcessorHost class. To use this class we will require azure storage account. Use the Azure Management Portal to create the storage account, click on “+NEW” as 



Once data storage successfully created, click on it. From the bottom of the page click on “MANAGE ACCESS KEYS” as 

 Manage Access Keys pop up will appear as 


 Copy the primary access key which we will require in our receiver code. 

Finally simple receiver code:

 string eventHubConnectionString = "my event hub connection key for receiver";

 string eventHubName = "eventhubname";
 string storageAccountName = "storage account name";
 string storageAccountKey = "storage account key;
 string storageConnectionString =  string.Format("DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}",storageAccountName, storageAccountKey);

string eventProcessorHostName = Guid.NewGuid().ToString();
EventProcessorHost eventProcessorHost = new EventProcessorHost(eventProcessorHostName, eventHubName, EventHubConsumerGroup.DefaultGroupName, eventHubConnectionString, storageConnectionString);
     eventProcessorHost.RegisterEventProcessorAsync<EventProcessor>().Wait();

In above code in RegisterEventProcessorAsyncwe are registering the EventProcessor class which is derived from IEventProcessorThis class allows us to processes the events/messages. 

public class EventProcessor : IEventProcessor
    {

async Task IEventProcessor.ProcessEventsAsync(PartitionContext partitionContext, IEnumerable<EventData> messages)
  {
            foreach (EventData event in messages)
            {
//ToDo: event processing logic
                 
            }
        }

 References:


Thanks!

Enjoy reading :)

Please share your suggestion / comments / feedback if any.