Advanced (Atualizado: 19/07/2026)

Desenhe Azure Service Bus para pedidos EC com Claude Code

Separe pedidos, estoque, email, DLQ e retry de uma loja EC com Azure Service Bus.

Desenhe Azure Service Bus para pedidos EC com Claude Code

Em uma loja EC, tela de pedido, CSV de estoque, solicitação de envio, log de email e nota de retry ficam separados. Se alguém reenviar o pedido inteiro quando só o email falhou, o estoque pode baixar duas vezes. Este artigo transforma Azure Service Bus em uma tabela prática para pedido, estoque e reenvio.

Onde o fluxo EC quebra

  • Não misture pedido aceito, reserva de estoque, envio, email e retry em uma queue.
  • Use topic quando um pedido precisa alimentar estoque, envio, email e analytics.
  • Crie MessageId estável com pedido, linha e ação antes de usar duplicate detection.
  • Dead-letter queue é mesa de inspeção, não botão cego de reenvio.
  • Claude Code monta tabelas; pagamento, reembolso, dados pessoais e aprovação ficam com pessoas.

The Microsoft documentation for Service Bus overview, queues, topics, and subscriptions, dead-letter queues, duplicate detection, message transfers, and pricing tiers is the source base. The internal Azure memo pattern is also related to the Azure OpenAI privacy memo.

O que Claude Code faz e o que pessoas revisam

Em uma loja EC, tela de pedido, CSV de estoque, solicitação de envio, log de email e nota de retry ficam separados. Se alguém reenviar o pedido inteiro quando só o email falhou, o estoque pode baixar duas vezes. Este artigo transforma Azure Service Bus em uma tabela prática para pedido, estoque e reenvio. Claude Code should read column names, event names, retry samples, and DLQ reason text. It should not receive card data, full address text, refund judgment, or credentials. The output should be a table with event name, input columns, queue or topic, subscription, MessageId, DLQ owner, retry condition, and human review.

Humans keep payment state, refund permission, privacy policy, stock finalization, warehouse contract, apology text, and release approval. This split matters because a technically valid retry can still be a business mistake. The table makes the stop point visible before production.

Três casos de uso

Use case 1

Pedido aceito abre várias tarefas. Entrada: CSV, order id, linha, SKU, quantidade, pagamento e flag de email. Saída: topic:orders com assinaturas para estoque, envio, email e analytics. Revisão humana: pedido não pago, pré-venda, kit, presente, ajuste manual e texto de email.

Use case 2

Reserva de estoque precisa de chave estável. Entrada: order id, linha, SKU, quantidade, ação reserve e log de envio. Saída: tabela de MessageId como pedido mais linha mais reserve. Revisão: alteração de quantidade, cancelamento, recompra, kit, retorno de estoque.

Use case 3

DLQ deve ser legível para operação. Entrada: reason, description, order id, SKU, falhas, horário e memo. Saída: retry automático, corrigir e reenviar, segurar pedido, revisar reembolso, investigar dev. Revisão: cliente, reembolso, estoque, armazém e permissão.

Prompt para copiar

You are preparing an Azure Service Bus design memo for an EC store.
Inputs: order CSV columns, inventory CSV columns, event names, retry logs, DLQ reason samples, and planned Azure tier.
Output:
1. Event table with eventName, input columns, queue or topic, subscription, MessageId, and DLQ owner.
2. Human review table for payment, refund, personal data, stock finalization, customer notice, and resend approval.
3. MessageId naming rules based on order id, line item id, and action.
4. DLQ classification: auto retry, fix then retry, hold order, refund review, engineering investigation.
5. One first action that can be done in 30 minutes.
Rules: do not put card data or full address text in messages. Do not blindly resend every DLQ message.

Código de verificação

const events = [
  { type: "order.accepted", orderId: "ORD-1001", lineItemId: "1", sku: "TSHIRT-M", quantity: 2, action: "accept" },
  { type: "inventory.reserve", orderId: "ORD-1001", lineItemId: "1", sku: "TSHIRT-M", quantity: 2, action: "reserve" },
  { type: "inventory.reserve", orderId: "ORD-1001", lineItemId: "1", sku: "TSHIRT-M", quantity: 2, action: "reserve" },
  { type: "mail.send", orderId: "ORD-1001", lineItemId: "", sku: "", quantity: 0, action: "confirmation" },
  { type: "inventory.reserve", orderId: "", lineItemId: "2", sku: "MUG-BLUE", quantity: 1, action: "reserve" },
  { type: "shipping.requested", orderId: "ORD-1002", lineItemId: "1", sku: "BAG-BK", quantity: 1, action: "ship" }
];

function routeEvent(event) {
  if (event.type === "order.accepted") {
    return {
      entity: "topic:orders",
      messageId: event.orderId + ":accepted",
      reason: "fan out to inventory, shipping, mail, and analytics subscriptions"
    };
  }
  if (event.type === "inventory.reserve") {
    return {
      entity: "queue:inventory-reserve",
      messageId: event.orderId + ":" + event.lineItemId + ":reserve",
      reason: "one stock reservation worker should own this line item"
    };
  }
  if (event.type === "mail.send") {
    return {
      entity: "queue:mail-send",
      messageId: event.orderId + ":" + event.action,
      reason: "mail can retry without touching stock"
    };
  }
  return {
    entity: "needs-design-review",
    messageId: event.orderId + ":" + event.type,
    reason: "route is not documented yet"
  };
}

const seen = new Set();
const findings = [];

for (const event of events) {
  const route = routeEvent(event);
  if (!event.orderId) {
    findings.push({
      type: "missing-order-id",
      eventType: event.type,
      fix: "do not send this message until the order id is present"
    });
  }
  if (seen.has(route.messageId)) {
    findings.push({
      type: "duplicate-message-id",
      eventType: event.type,
      messageId: route.messageId,
      fix: "keep the same MessageId for sender retry, but make the handler idempotent"
    });
  }
  if (route.entity === "needs-design-review") {
    findings.push({
      type: "unknown-route",
      eventType: event.type,
      fix: "decide queue, topic subscription, DLQ owner, and retry rule before release"
    });
  }
  seen.add(route.messageId);
}

console.table(findings);
if (findings.length > 0) process.exitCode = 1;

Pitfall: erros comuns

The first cause is one queue for every action. The fix is to use a topic for order accepted and separate queues or subscriptions for inventory, shipping, and mail. This prevents a mail retry from touching stock again.

The second cause is random MessageId generation. The fix is to generate the id from order id, line item id, and action before sending. Duplicate detection can only help inside the configured window when the id stays stable.

The third cause is blind DLQ resend. The fix is to classify each reason into auto retry, fix then retry, hold order, refund review, or engineering investigation. Messages that affect customers or refunds need human review.

The fourth cause is ignoring tier differences. The fix is to check whether topics, transactions, de-duplication, or sessions are required before choosing Basic, Standard, or Premium.

Perguntas frequentes

Q. Should every EC event be a topic? A. No. Topic is useful when one event fans out. A queue is clearer when one worker owns one task such as inventory reservation or mail send.

Q. Does duplicate detection remove all double stock moves? A. No. It helps when MessageId is stable. The handler should still check whether the line item was already processed.

Q. Who should read DLQ? A. Operations and developers. EC failures can involve customer notice, refund, stock gap, and warehouse contact.

Q. What should message body contain? A. Prefer order id, line item id, SKU, quantity, and reference id. Review personal data and logging policy before adding sensitive text.

Caminho para consultoria

Para EC, valor vem de menos estoque errado, menos atraso e menos ticket. Leve colunas do CSV, três falhas e o fluxo atual de retry para a consultoria. Use Claude Code training and consultation when the team needs help turning order CSV, inventory CSV, retry logs, and release approval into a workflow.

O que verifiquei

Verifiquei Microsoft Learn sobre Service Bus, queues/topics/subscriptions, DLQ, duplicate detection, transfers e tiers. O código local mostra order id ausente, MessageId duplicado e rota desconhecida. O primeiro passo é uma tabela para pedido, estoque, email e retry.

#claude-code #EC #Azure Service Bus #pedidos #estoque
Grátis

PDF grátis: cheatsheet do Claude Code

Informe seu e-mail e baixe uma página com comandos, hábitos de revisão e workflows seguros.

Cuidamos dos seus dados e não enviamos spam.

Masa

Sobre o autor

Masa

Engenheiro focado em workflows práticos com Claude Code.