Back to Blog
1 min read

Azure Service Bus: Queues and Topics Patterns

Azure Service Bus provides enterprise messaging with queues (point-to-point) and topics (publish-subscribe).

Queue: Point-to-Point

from azure.servicebus import ServiceBusClient, ServiceBusMessage

connection_str = "Endpoint=sb://mynamespace.servicebus.windows.net/..."
queue_name = "orders"

# Send message
with ServiceBusClient.from_connection_string(connection_str) as client:
    with client.get_queue_sender(queue_name) as sender:
        message = ServiceBusMessage(
            json.dumps({"order_id": "123", "amount": 99.99}),
            content_type="application/json",
            subject="new-order"
        )
        sender.send_messages(message)

# Receive message
with ServiceBusClient.from_connection_string(connection_str) as client:
    with client.get_queue_receiver(queue_name) as receiver:
        for msg in receiver.receive_messages(max_message_count=10, max_wait_time=5):
            print(json.loads(str(msg)))
            receiver.complete_message(msg)

Topic: Publish-Subscribe

topic_name = "order-events"
subscription_name = "inventory-service"

# Publish to topic
with client.get_topic_sender(topic_name) as sender:
    sender.send_messages(ServiceBusMessage(json.dumps(order)))

# Subscribe
with client.get_subscription_receiver(topic_name, subscription_name) as receiver:
    for msg in receiver:
        process_message(msg)
        receiver.complete_message(msg)

Subscription Filters

-- SQL Filter: Only high-value orders
Amount > 1000

-- Correlation Filter: By order type
sys.Subject = 'priority-order'

Dead Letter Queue

# Receive from dead letter queue
dlq_receiver = client.get_queue_receiver(
    queue_name,
    sub_queue=ServiceBusSubQueue.DEAD_LETTER
)

for msg in dlq_receiver:
    print(f"Dead letter reason: {msg.dead_letter_reason}")
    print(f"Error: {msg.dead_letter_error_description}")

Session-Based Processing

For ordered, grouped message processing:

# Send with session
message = ServiceBusMessage(data, session_id="customer-123")
sender.send_messages(message)

# Receive by session
session_receiver = client.get_queue_receiver(queue_name, session_id="customer-123")

Service Bus is the backbone of reliable, decoupled architectures on Azure.

Michael John Peña

Michael John Peña

Senior Data Engineer based in Sydney. Writing about data, cloud, and technology.