opção
LarLar Skill Desenvolvimento de APIs azure-servicebus-py

azure-servicebus-py

microsoft/skills microsoft/skills

Envie e receba mensagens usando filas, tópicos e assinaturas do Azure Service Bus com o SDK para Python.

...Expandir tudo
6
Tempo atualizado 13 de Setembro de 2026

SDK do Azure Service Bus para Python

Mensageria empresarial para comunicação em nuvem confiável com filas e tópicos de publicação/assinatura.

Instalação

pip install azure-servicebus azure-identity

Variáveis de Ambiente

SERVICEBUS_FULLY_QUALIFIED_NAMESPACE=<namespace>.servicebus.windows.net  # Obrigatório para todos os métodos de autenticação
SERVICEBUS_QUEUE_NAME=minhafila  # Obrigatório para operações de fila
SERVICEBUS_TOPIC_NAME=meutopic  # Obrigatório para operações de tópico
SERVICEBUS_SUBSCRIPTION_NAME=minhasubscricao  # Obrigatório para operações de assinatura
AZURE_TOKEN_CREDENTIALS=prod # Obrigatório apenas se DefaultAzureCredential for usado em produção
</namespace>

Autenticação e Ciclo de Vida

🔑 Duas regras se aplicam a todas as amostras de código abaixo:

  1. Prefira DefaultAzureCredential. Ele funciona localmente (Azure CLI / VS Code / Developer CLI) e no Azure (identidade gerenciada, identidade de carga de trabalho) sem alteração de código. Evite strings de conexão, contas/chaves de API — elas contornam a auditoria e a rotação do Entra.
    • Desenvolvimento local: DefaultAzureCredential funciona como está.
    • Produção: defina AZURE_TOKEN_CREDENTIALS=prod (ou AZURE_TOKEN_CREDENTIALS=<credencial_especifica></credencial_especifica>) para restringir a cadeia de credenciais a credenciais seguras para produção.
  2. Envolva cada cliente em um gerenciador de contexto para que transportes HTTP, soquetes e caches de token sejam liberados de forma determinística:
    • Síncrono: with <cliente>(...) as cliente:</cliente>
    • Assíncrono: async with <cliente>(...) as cliente:</cliente> e async with DefaultAzureCredential() as credencial: (de azure.identity.aio)

Os trechos de código podem abreviar esta configuração, mas o código de produção deve sempre seguir ambas as regras.

from azure.identity import DefaultAzureCredential, ManagedIdentityCredential
from azure.servicebus import ServiceBusClient

# Desenvolvimento local: DefaultAzureCredential. Produção: defina AZURE_TOKEN_CREDENTIALS=prod ou AZURE_TOKEN_CREDENTIALS=<credencial_especifica>
credencial = DefaultAzureCredential(require_envvar=True)
# Ou use uma credencial específica diretamente em produção:
# Consulte https://learn.microsoft.com/python/api/overview/azure/identity-readme?view=azure-python#credential-classes
# credencial = ManagedIdentityCredential()
namespace = "<namespace>.servicebus.windows.net"

with ServiceBusClient(
    fully_qualified_namespace=namespace,
    credential=credencial
) as cliente:
    # Use o cliente aqui (consulte as seções seguintes para operações)
    ...
</namespace></credencial_especifica>

Tipos de Cliente

ClienteFinalidadeObter De
`ServiceBusClient`Gestão de conexãoInstanciação direta
`ServiceBusSender`Enviar mensagens`client.get_queue_sender()` / `get_topic_sender()`
`ServiceBusReceiver`Receber mensagens`client.get_queue_receiver()` / `get_subscription_receiver()`

Enviar Mensagens (Assíncrono)

import asyncio
from azure.servicebus.aio import ServiceBusClient
from azure.servicebus import ServiceBusMessage
from azure.identity.aio import DefaultAzureCredential

async def enviar_mensagens():
    credencial = DefaultAzureCredential()

    async with ServiceBusClient(
        fully_qualified_namespace="<namespace>.servicebus.windows.net",
        credential=credencial
    ) as cliente:
        remetente = cliente.get_queue_sender(queue_name="minhafila")

        async with remetente:
            # Mensagem única
            mensagem = ServiceBusMessage("Olá, Service Bus!")
            await remetente.send_messages(mensagem)

            # Lote de mensagens
            mensagens = [ServiceBusMessage(f"Mensagem {i}") for i in range(10)]
            await remetente.send_messages(mensagens)

            # Lote de mensagens (para controle de tamanho)
            lote = await remetente.create_message_batch()
            for i in range(100):
                try:
                    lote.add_message(ServiceBusMessage(f"Mensagem do lote {i}"))
                except ValueError:  # Lote cheio
                    await remetente.send_messages(lote)
                    lote = await remetente.create_message_batch()
                    lote.add_message(ServiceBusMessage(f"Mensagem do lote {i}"))
            await remetente.send_messages(lote)

asyncio.run(enviar_mensagens())
</namespace>

Receber Mensagens (Assíncrono)

async def receber_mensagens():
    credencial = DefaultAzureCredential()

    async with ServiceBusClient(
        fully_qualified_namespace="<namespace>.servicebus.windows.net",
        credential=credencial
    ) as cliente:
        receptor = cliente.get_queue_receiver(queue_name="minhafila")

        async with receptor:
            # Receber lote
            mensagens = await receptor.receive_messages(
                max_message_count=10,
                max_wait_time=5  # segundos
            )

            for msg in mensagens:
                print(f"Recebido: {str(msg)}")
                await receptor.complete_message(msg)  # Remover da fila

asyncio.run(receber_mensagens())
</namespace>

Modos de Recebimento

ModoComportamentoCaso de Uso
`PEEK_LOCK` (padrão)Mensagem bloqueada, deve ser concluída/abandonadaProcessamento confiável
`RECEIVE_AND_DELETE`Removida imediatamente ao receberEntrega no máximo uma vez
from azure.servicebus import ServiceBusReceiveMode

receptor = cliente.get_queue_receiver(
    queue_name="minhafila",
    receive_mode=ServiceBusReceiveMode.RECEIVE_AND_DELETE
)

Acerto de Mensagens

async with receptor:
    mensagens = await receptor.receive_messages(max_message_count=1)

    for msg in mensagens:
        try:
            # Processar mensagem...
            await receptor.complete_message(msg)  # Sucesso - remover da fila
        except ProcessingError:
            await receptor.abandon_message(msg)  # Tentar novamente mais tarde
        except PermanentError:
            await receptor.dead_letter_message(
                msg,
                reason="ProcessingFailed",
                error_description="Não foi possível processar"
            )
AçãoEfeito
`complete_message()`Remover da fila (sucesso)
`abandon_message()`Liberar bloqueio, tentar novamente imediatamente
`dead_letter_message()`Mover para a fila de mensagens não processáveis
`defer_message()`Colocar de lado, receber por número de sequência

Tópicos e Assinaturas

# Enviar para tópico
remetente = cliente.get_topic_sender(topic_name="meutopic")
async with remetente:
    await remetente.send_messages(ServiceBusMessage("Mensagem do tópico"))

# Receber de assinatura
receptor = cliente.get_subscription_receiver(
    topic_name="meutopic",
    subscription_name="minhasubscricao"
)
async with receptor:
    mensagens = await receptor.receive_messages(max_message_count=10)

Sessões (FIFO)

# Enviar com sessão
mensagem = ServiceBusMessage("Mensagem de sessão")
mensagem.session_id = "pedido-123"
await remetente.send_messages(mensagem)

# Receber de sessão específica
receptor = cliente.get_queue_receiver(
    queue_name="fila-de-sessao",
    session_id="pedido-123"
)

# Receber da próxima sessão disponível
from azure.servicebus import NEXT_AVAILABLE_SESSION
receptor = cliente.get_queue_receiver(
    queue_name="fila-de-sessao",
    session_id=NEXT_AVAILABLE_SESSION
)

Mensagens Agendadas

from datetime import datetime, timedelta, timezone

mensagem = ServiceBusMessage("Mensagem agendada")
tempo_agendado = datetime.now(timezone.utc) + timedelta(minutes=10)

# Agendar mensagem
numero_sequencia = await remetente.schedule_messages(mensagem, tempo_agendado)

# Cancelar mensagem agendada
await remetente.cancel_scheduled_messages(numero_sequencia)

Fila de Mensagens Não Processáveis

from azure.servicebus import ServiceBusSubQueue

# Receber da fila de mensagens não processáveis
receptor_dlq = cliente.get_queue_receiver(
    queue_name="minhafila",
    sub_queue=ServiceBusSubQueue.DEAD_LETTER
)

async with receptor_dlq:
    mensagens = await receptor_dlq.receive_messages(max_message_count=10)
    for msg in mensagens:
        print(f"Não processável: {msg.dead_letter_reason}")
        await receptor_dlq.complete_message(msg)

Cliente Síncrono (para scripts simples)

from azure.servicebus import ServiceBusClient, ServiceBusMessage
from azure.identity import DefaultAzureCredential

with ServiceBusClient(
    fully_qualified_namespace="<namespace>.servicebus.windows.net",
    credential=DefaultAzureCredential()
) as cliente:
    with cliente.get_queue_sender("minhafila") as remetente:
        remetente.send_messages(ServiceBusMessage("Mensagem síncrona"))

    with cliente.get_queue_receiver("minhafila") as receptor:
        for msg in receptor:
            print(str(msg))
            receptor.complete_message(msg)
</namespace>

Melhores Práticas

  1. Escolha síncrono OU assíncrono e mantenha a consistência. Não misture clientes síncronos azure.xxx com clientes assíncronos azure.xxx.aio no mesmo caminho de chamada. Escolha um modo por módulo.
  2. Sempre use gerenciadores de contexto para clientes e credenciais assíncronas. Envolva cada cliente em with Cliente(...) as cliente: (síncrono) ou async with Cliente(...) as cliente: (assíncrono) para limpeza adequada. Para DefaultAzureCredential assíncrono de azure.identity.aio, também use async with credencial: para que tokens e transportes sejam limpos.
  3. Use DefaultAzureCredential para autenticação portátil entre desenvolvimento local e Azure (evite strings de conexão / chaves de API quando possível).
  4. Use cliente assíncrono para cargas de trabalho de produção
  5. Complete as mensagens após o processamento bem-sucedido
  6. Use a fila de mensagens não processáveis para mensagens venenosas
  7. Use sessões para processamento ordenado e FIFO
  8. Use lotes de mensagens para cenários de alta taxa de transferência
  9. Defina max_wait_time para evitar bloqueio infinito

Arquivos de Referência

ArquivoConteúdo
references/patterns.mdConsumidores concorrentes, sessões, padrões de tentativa de repetição, solicitação-resposta, transações
references/dead-letter.mdTratamento de DLQ, mensagens venenosas, estratégias de reprocesso
scripts/setup\_servicebus.pyCLI para gestão de fila/tópico/assinatura e monitoramento de DLQ
Ver no GitHub
---
name: azure-servicebus-py
description: Send and receive messages using Azure Service Bus queues, topics, and subscriptions with Python SDK.
license: MIT
---

# Azure Service Bus SDK for Python

Enterprise messaging for reliable cloud communication with queues and pub/sub topics.

## Installation

```bash
pip install azure-servicebus azure-identity
```

## Environment Variables

```bash
SERVICEBUS_FULLY_QUALIFIED_NAMESPACE=<namespace>.servicebus.windows.net  # Required for all auth methods
SERVICEBUS_QUEUE_NAME=myqueue  # Required for queue operations
SERVICEBUS_TOPIC_NAME=mytopic  # Required for topic operations
SERVICEBUS_SUBSCRIPTION_NAME=mysubscription  # Required for subscription operations
AZURE_TOKEN_CREDENTIALS=prod # Required only if DefaultAzureCredential is used in production
```

## Authentication & Lifecycle

> **🔑 Two rules apply to every code sample below:**
>
> 1. **Prefer `DefaultAzureCredential`.** It works locally (Azure CLI / VS Code / Developer CLI) and in Azure (managed identity, workload identity) with no code change. Avoid connection strings, account/API keys — they bypass Entra audit and rotation.
>    - Local dev: `DefaultAzureCredential` works as-is.
>    - Production: set `AZURE_TOKEN_CREDENTIALS=prod` (or `AZURE_TOKEN_CREDENTIALS=<specific_credential>`) to constrain the credential chain to production-safe credentials.
> 2. **Wrap every client in a context manager** so HTTP transports, sockets, and token caches are released deterministically:
>    - Sync: `with <Client>(...) as client:`
>    - Async: `async with <Client>(...) as client:` **and** `async with DefaultAzureCredential() as credential:` (from `azure.identity.aio`)
>
> Snippets may abbreviate this setup, but production code should always follow both rules.

```python
from azure.identity import DefaultAzureCredential, ManagedIdentityCredential
from azure.servicebus import ServiceBusClient

# Local dev: DefaultAzureCredential. Production: set AZURE_TOKEN_CREDENTIALS=prod or AZURE_TOKEN_CREDENTIALS=<specific_credential>
credential = DefaultAzureCredential(require_envvar=True)
# Or use a specific credential directly in production:
# See https://learn.microsoft.com/python/api/overview/azure/identity-readme?view=azure-python#credential-classes
# credential = ManagedIdentityCredential()
namespace = "<namespace>.servicebus.windows.net"

with ServiceBusClient(
    fully_qualified_namespace=namespace,
    credential=credential
) as client:
    # Use client here (see following sections for operations)
    ...
```

## Client Types

| Client | Purpose | Get From |
|--------|---------|----------|
| `ServiceBusClient` | Connection management | Direct instantiation |
| `ServiceBusSender` | Send messages | `client.get_queue_sender()` / `get_topic_sender()` |
| `ServiceBusReceiver` | Receive messages | `client.get_queue_receiver()` / `get_subscription_receiver()` |

## Send Messages (Async)

```python
import asyncio
from azure.servicebus.aio import ServiceBusClient
from azure.servicebus import ServiceBusMessage
from azure.identity.aio import DefaultAzureCredential

async def send_messages():
    credential = DefaultAzureCredential()
    
    async with ServiceBusClient(
        fully_qualified_namespace="<namespace>.servicebus.windows.net",
        credential=credential
    ) as client:
        sender = client.get_queue_sender(queue_name="myqueue")
        
        async with sender:
            # Single message
            message = ServiceBusMessage("Hello, Service Bus!")
            await sender.send_messages(message)
            
            # Batch of messages
            messages = [ServiceBusMessage(f"Message {i}") for i in range(10)]
            await sender.send_messages(messages)
            
            # Message batch (for size control)
            batch = await sender.create_message_batch()
            for i in range(100):
                try:
                    batch.add_message(ServiceBusMessage(f"Batch message {i}"))
                except ValueError:  # Batch full
                    await sender.send_messages(batch)
                    batch = await sender.create_message_batch()
                    batch.add_message(ServiceBusMessage(f"Batch message {i}"))
            await sender.send_messages(batch)

asyncio.run(send_messages())
```

## Receive Messages (Async)

```python
async def receive_messages():
    credential = DefaultAzureCredential()
    
    async with ServiceBusClient(
        fully_qualified_namespace="<namespace>.servicebus.windows.net",
        credential=credential
    ) as client:
        receiver = client.get_queue_receiver(queue_name="myqueue")
        
        async with receiver:
            # Receive batch
            messages = await receiver.receive_messages(
                max_message_count=10,
                max_wait_time=5  # seconds
            )
            
            for msg in messages:
                print(f"Received: {str(msg)}")
                await receiver.complete_message(msg)  # Remove from queue

asyncio.run(receive_messages())
```

## Receive Modes

| Mode | Behavior | Use Case |
|------|----------|----------|
| `PEEK_LOCK` (default) | Message locked, must complete/abandon | Reliable processing |
| `RECEIVE_AND_DELETE` | Removed immediately on receive | At-most-once delivery |

```python
from azure.servicebus import ServiceBusReceiveMode

receiver = client.get_queue_receiver(
    queue_name="myqueue",
    receive_mode=ServiceBusReceiveMode.RECEIVE_AND_DELETE
)
```

## Message Settlement

```python
async with receiver:
    messages = await receiver.receive_messages(max_message_count=1)
    
    for msg in messages:
        try:
            # Process message...
            await receiver.complete_message(msg)  # Success - remove from queue
        except ProcessingError:
            await receiver.abandon_message(msg)  # Retry later
        except PermanentError:
            await receiver.dead_letter_message(
                msg,
                reason="ProcessingFailed",
                error_description="Could not process"
            )
```

| Action | Effect |
|--------|--------|
| `complete_message()` | Remove from queue (success) |
| `abandon_message()` | Release lock, retry immediately |
| `dead_letter_message()` | Move to dead-letter queue |
| `defer_message()` | Set aside, receive by sequence number |

## Topics and Subscriptions

```python
# Send to topic
sender = client.get_topic_sender(topic_name="mytopic")
async with sender:
    await sender.send_messages(ServiceBusMessage("Topic message"))

# Receive from subscription
receiver = client.get_subscription_receiver(
    topic_name="mytopic",
    subscription_name="mysubscription"
)
async with receiver:
    messages = await receiver.receive_messages(max_message_count=10)
```

## Sessions (FIFO)

```python
# Send with session
message = ServiceBusMessage("Session message")
message.session_id = "order-123"
await sender.send_messages(message)

# Receive from specific session
receiver = client.get_queue_receiver(
    queue_name="session-queue",
    session_id="order-123"
)

# Receive from next available session
from azure.servicebus import NEXT_AVAILABLE_SESSION
receiver = client.get_queue_receiver(
    queue_name="session-queue",
    session_id=NEXT_AVAILABLE_SESSION
)
```

## Scheduled Messages

```python
from datetime import datetime, timedelta, timezone

message = ServiceBusMessage("Scheduled message")
scheduled_time = datetime.now(timezone.utc) + timedelta(minutes=10)

# Schedule message
sequence_number = await sender.schedule_messages(message, scheduled_time)

# Cancel scheduled message
await sender.cancel_scheduled_messages(sequence_number)
```

## Dead-Letter Queue

```python
from azure.servicebus import ServiceBusSubQueue

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

async with dlq_receiver:
    messages = await dlq_receiver.receive_messages(max_message_count=10)
    for msg in messages:
        print(f"Dead-lettered: {msg.dead_letter_reason}")
        await dlq_receiver.complete_message(msg)
```

## Sync Client (for simple scripts)

```python
from azure.servicebus import ServiceBusClient, ServiceBusMessage
from azure.identity import DefaultAzureCredential

with ServiceBusClient(
    fully_qualified_namespace="<namespace>.servicebus.windows.net",
    credential=DefaultAzureCredential()
) as client:
    with client.get_queue_sender("myqueue") as sender:
        sender.send_messages(ServiceBusMessage("Sync message"))
    
    with client.get_queue_receiver("myqueue") as receiver:
        for msg in receiver:
            print(str(msg))
            receiver.complete_message(msg)
```

## Best Practices

1. **Pick sync OR async and stay consistent.** Do not mix `azure.xxx` sync clients with `azure.xxx.aio` async clients in the same call path. Choose one mode per module.
2. **Always use context managers for clients and async credentials.** Wrap every client in `with Client(...) as client:` (sync) or `async with Client(...) as client:` (async) for proper cleanup. For async `DefaultAzureCredential` from `azure.identity.aio`, also use `async with credential:` so tokens and transports are cleaned up.
3. **Use `DefaultAzureCredential`** for portable auth across local dev and Azure (avoid connection strings / API keys when possible).
4. **Use async client** for production workloads
5. **Complete messages** after successful processing
6. **Use dead-letter queue** for poison messages
7. **Use sessions** for ordered, FIFO processing
8. **Use message batches** for high-throughput scenarios
9. **Set `max_wait_time`** to avoid infinite blocking

## Reference Files

| File | Contents |
|------|----------|
| [references/patterns.md](references/patterns.md) | Competing consumers, sessions, retry patterns, request-response, transactions |
| [references/dead-letter.md](references/dead-letter.md) | DLQ handling, poison messages, reprocessing strategies |
| [scripts/setup_servicebus.py](scripts/setup_servicebus.py) | CLI for queue/topic/subscription management and DLQ monitoring |

Todos os arquivos

0 arquivos

Instalar azure-servicebus-py

Baixe e extraia os arquivos de habilidade para o diretório .claude/skills/.

Baixar ZIP

Clone o repositório e copie os arquivos da habilidade para o seu projeto.

git clone https://github.com/microsoft/skills/tree/main/.github/plugins/azure-sdk-python/skills/azure-servicebus-py # Copy SKILL.md to your .claude/skills/ directory

Copiar Copiar
Configuração rápida: Copie a pasta de habilidades para .claude/skills/ O Claude detectará e usará automaticamente a habilidade
Repositório microsoft/skills

Habilidades relacionadas

agentwallet
Tempo atualizado 7 de Julho de 2026
brightdata-cli
Tempo atualizado 29 de Junho de 2026
humanize
Tempo atualizado 7 de Julho de 2026
korean-stock-search
Tempo atualizado 8 de Julho de 2026
OR