Rancang Azure Service Bus untuk order EC dengan Claude Code
Pisahkan order, stok, email, DLQ, duplicate detection, dan retry untuk toko EC.
Di toko EC, layar pesanan, CSV stok, permintaan kirim, log email, dan catatan retry sering terpisah. Saat pesanan dikirim ulang padahal hanya email yang gagal, stok bisa berkurang dua kali. Artikel ini menjadikan Azure Service Bus sebagai tabel kerja untuk order, stok, dan retry.
Di mana alur pesanan EC rusak
- Jangan campur order accepted, inventory reserve, shipping request, mail send, dan retry dalam satu queue.
- Gunakan topic saat satu order perlu masuk ke stok, pengiriman, email, dan analytics.
- Buat MessageId stabil dari order id, line item id, dan action.
- Dead-letter queue adalah meja pemeriksaan, bukan tombol kirim ulang buta.
- Claude Code membuat tabel; pembayaran, refund, data pribadi, dan approval tetap manusia.
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.
Bagian Claude Code dan bagian manusia
Di toko EC, layar pesanan, CSV stok, permintaan kirim, log email, dan catatan retry sering terpisah. Saat pesanan dikirim ulang padahal hanya email yang gagal, stok bisa berkurang dua kali. Artikel ini menjadikan Azure Service Bus sebagai tabel kerja untuk order, stok, dan retry. 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.
Tiga use case
Use case 1
Order accepted memicu banyak kerja. Input: CSV pesanan, order id, line item, SKU, quantity, status pembayaran, flag email. Output: topic:orders dengan subscription stok, kirim, email, analytics. Pemeriksaan manusia: belum bayar, preorder, bundle, hadiah, penyesuaian stok, isi email.
Use case 2
Reservasi stok butuh kunci bisnis stabil. Input: order id, line item, SKU, quantity, action reserve, log kirim. Output: tabel MessageId seperti order id plus line item plus reserve. Pemeriksaan: perubahan quantity, batal, reorder, bundle, pengembalian stok.
Use case 3
DLQ harus bisa dibaca tim operasi. Input: reason, description, order id, SKU, jumlah gagal, waktu, memo. Output: retry otomatis, perbaiki lalu kirim, tahan order, cek refund, investigasi dev. Pemeriksaan: pesan pelanggan, refund, selisih stok, gudang, izin resend.
Prompt siap pakai
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.
Kode pengecekan
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: kesalahan umum
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.
FAQ
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.
Jalur konsultasi
Untuk tim EC, nilai ada pada stok yang tidak salah, pengiriman tidak terlambat, dan tiket support lebih sedikit. Bawa kolom CSV, tiga kegagalan, dan langkah retry saat ini ke halaman konsultasi. Use Claude Code training and consultation when the team needs help turning order CSV, inventory CSV, retry logs, and release approval into a workflow.
Yang saya verifikasi
Saya memeriksa Microsoft Learn untuk Service Bus, queues/topics/subscriptions, DLQ, duplicate detection, transfers, dan tiers. Kode lokal menemukan order id kosong, MessageId duplikat, dan route belum dirancang. Langkah pertama adalah membuat satu tabel order, stok, email, dan retry.
Artikel terkait
Membangun toko e-commerce dengan Claude Code: Next.js, Stripe Checkout, dan stok
Panduan membuat toko dengan Claude Code: produk, keranjang, stok, Stripe Checkout, Webhook, admin, SEO, analytics, retur, dan pembatalan.
Bikin Tulisan POP, Brosur, dan Memo Penataan Rak Toko Ritel dengan Claude Code
Cara mempercepat tulisan POP, brosur, dan memo penataan rak toko ritel dengan Claude Code, lengkap template prompt dan skrip pengecek.
Service Worker dengan Claude Code: cache, update, dan offline UX
Panduan praktis Service Worker dengan Claude Code: cache, lifecycle update, UX offline, pitfall, dan contoh jalan.
PDF gratis: cheatsheet Claude Code
Masukkan email dan unduh satu halaman berisi command, kebiasaan review, dan workflow aman.
Kami menjaga datamu dan tidak mengirim spam.
Tentang penulis
Masa
Engineer yang berfokus pada workflow Claude Code praktis dan adopsi tim.