Azure Documentation

Sending Messages to Azure Event Hubs

This guide provides detailed instructions on how to send messages to an Azure Event Hub using various programming languages and SDKs. Understanding how to publish events is crucial for leveraging Event Hubs as a real-time data streaming platform.

Note: Before you begin, ensure you have an Azure Event Hubs namespace and an Event Hub created. You'll need the connection string for your Event Hub.

Prerequisites

  • An Azure subscription.
  • An Azure Event Hubs namespace.
  • An Event Hub within the namespace.
  • The connection string for your Event Hub.
  • Appropriate SDKs installed for your chosen programming language.

Sending Messages using C#

The Azure SDK for .NET provides a robust way to interact with Event Hubs. Below is an example using the Azure.Messaging.EventHubs package.


using Azure.Messaging.EventHubs;
using Azure.Messaging.EventHubs.Producer;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;

public class EventHubSender
{
    private const string eventHubConnectionString = "";
    private const string eventHubName = "";

    public static async Task Main(string[] args)
    {
        await SendMessagesToEventHub();
    }

    public static async Task SendMessagesToEventHub()
    {
        await using var producerClient = new EventHubProducerClient(eventHubConnectionString, eventHubName);

        using EventDataBatch eventDataBatch = await producerClient.CreateBatchAsync();

        for (int i = 1; i <= 5; i++)
        {
            var message = $"Message {i}";
            if (!eventDataBatch.TryAddMessage(new EventData(Encoding.UTF8.GetBytes(message))))
            {
                throw new Exception($"The message \"{message}\" is too large for the batch and cannot be sent.");
            }
        }

        try
        {
            await producerClient.SendAsync(eventDataBatch);
            Console.WriteLine("A batch of messages has been sent to the Event Hub.");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error sending batch: {ex.Message}");
        }
    }
}
                

Sending Messages using Python

The Python SDK for Azure Event Hubs simplifies publishing events. You can install it using pip:


pip install azure-eventhub
                

Here's a Python example:


import os
import asyncio
from azure.eventhub import EventData, EventHubProducerClient

EVENTHUB_CONNECTION_STR = os.environ["EVENTHUB_CONNECTION_STR"]
EVENTHUB_NAME = os.environ["EVENTHUB_NAME"] # Replace with your Event Hub name

async def send_message(fully_qualified_namespace: str, event_hub_name: str, connection_str: str):
    producer = EventHubProducerClient.from_connection_string(connection_str, event_hub_name)
    async with producer:
        batch = await producer.create_batch()
        for i in range(5):
            message = f"Message {i+1}"
            if not batch.add(EventData(message)):
                print(f"Message {message} is too large for the batch.")
                break
        await producer.send_batch(batch)
        print("Batch sent successfully.")

async def main():
    await send_message("YOUR_NAMESPACE.servicebus.windows.net", EVENTHUB_NAME, EVENTHUB_CONNECTION_STR)

if __name__ == "__main__":
    asyncio.run(main())
                

Sending Messages using Node.js

For Node.js applications, you can use the @azure/event-hubs package. Install it via npm:


npm install @azure/event-hubs
                

Node.js example:


const { EventHubProducerClient } = require("@azure/event-hubs");

const connectionString = process.env.EVENTHUB_CONNECTION_STRING;
const eventHubName = process.env.EVENTHUB_NAME; // Replace with your Event Hub name

async function main() {
    const producer = new EventHubProducerClient(connectionString, eventHubName);
    const batch = await producer.createBatch();

    for (let i = 0; i < 5; i++) {
        const message = `Message ${i + 1}`;
        if (!batch.tryAdd({ body: message })) {
            console.log(`Message ${message} is too large for the batch.`);
            break;
        }
    }

    try {
        await producer.send(batch);
        console.log("Batch sent successfully.");
    } catch (error) {
        console.error("Error sending batch:", error);
    } finally {
        await producer.close();
    }
}

main().catch((err) => {
    console.error("Error running example:", err);
});
                
Important: Always handle connection strings securely. Use environment variables or Azure Key Vault instead of hardcoding them directly in your code.

Key Concepts for Sending Messages

  • EventData: Represents a single event or message to be sent to Event Hubs. It contains the event body, properties, and other metadata.
  • EventDataBatch: A container for multiple EventData objects that are sent together as a single operation. This improves efficiency and reduces latency. Event Hubs has a maximum batch size limit.
  • Producer Client: The primary object used to create batches and send them to the Event Hub.
  • Partitioning: You can optionally specify a partition key when sending messages. This ensures that messages with the same partition key are sent to the same partition, preserving order for that key.

Best Practices

  • Batching: Always batch messages for sending to improve throughput and reduce costs.
  • Error Handling: Implement robust error handling for sending operations, including retries for transient failures.
  • Partitioning Strategy: Choose a partition key that distributes your load evenly across partitions if order within a specific context is not critical. For strict ordering, use a single partition or carefully chosen keys.
  • Connection Management: Reuse the EventHubProducerClient instance for sending multiple batches to reduce overhead.

This guide covers the fundamental aspects of sending messages. For more advanced scenarios, such as sending with specific partition keys or handling large events, refer to the respective SDK documentation.