Membahas cara menyambungkan solusi dengan dunia luar: memilih sinkron (REST/gRPC) vs asinkron (queue/event streaming), pola integrasi enterprise dari request-reply hingga saga, ETL vs ELT, idempotency, serta desain kontrak API yang tahan perubahan bertahun-tahun

Setelah di episode 5 kalian bisa menurunkan keputusan arsitektur menjadi desain fisik di cloud — VPC multi-AZ, managed database, autoscaling — solusi kalian sudah berdiri. Tetapi tidak ada solusi modern yang berdiri sendiri: ia harus bicara dengan payment gateway, CRM, sistem legacy, layanan pihak ketiga, dan aplikasi internal lain. Integration architecture adalah disiplin merancang percakapan itu.
Mengapa ini krusial? Karena integrasi adalah sumber mayoritas kegagalan lintas sistem: partner timeout saat checkout, pesan duplikat menghasilkan double payment, skema API partner berubah tanpa pemberitahuan, atau batch malam yang tumpang tindih dengan jam ramai. Desain integrasi yang baik mengantisipasi semua itu sejak awal.
Percakapan antar-sistem ada dua karakter, dan memilihnya salah adalah kesalahan arsitektur termahal:
| Dimensi | Sinkron (REST/gRPC) | Asinkron (Queue/Event) |
|---|---|---|
| Pola | Request → tunggu balasan | Kirim pesan → lanjut kerja |
| Coupling | Ketat: kedua sisi harus hidup bersamaan | Longgar: penerima boleh offline |
| Cocok untuk | Query data, operasi cepat yang butuh jawaban langsung | Workflow panjang, fan-out, penyerapan lonjakan trafik |
| Risiko utama | Cascade failure, latency berantai | Konsistensi akhir, duplikasi pesan |
Aturan praktis yang bisa kalian pegang:
Studi kasus tiket kita adalah contoh sempurna: pembelian kursi divalidasi sinkron, tetapi setelah pembayaran terkonfirmasi semuanya asinkron — penerbitan tiket QR, pengiriman email, sinkronisasi ke sistem panitia. Satu kegagalan email tidak boleh menggagalkan pembayaran.
Untuk lapisan asinkron, kalian akan memilih antara dua keluarga teknologi:
Kriteria pemilihan cepat: satu tugas dikerjakan satu pihak → queue; satu kejadian diminati banyak pihak → streaming. Untuk studi kasus kita, topic payment.confirmed di Kafka/Pub/Sub melayani tiga consumer sekaligus — itulah nilai fan-out streaming.
Sistem asinkron menjamin at-least-once delivery — artinya pesan yang sama bisa diproses dua kali. Konsekuensinya wajib: setiap handler harus aman terhadap duplikat (idempotent). Cara standarnya dengan idempotency key:
1. Terima pesan event_id = pay_20260816_000123.
2. Cek tabel processed_events: apakah event_id sudah ada?
-> ya : skip (log duplicate), commit offset/ack.
-> no : proses penerbitan tiket,
INSERT event_id + hasil ke processed_events DALAM SATU TRANSAKSI,
lalu ack.Tanpa pola ini, satu retry jaringan menghasilkan dua e-tiket untuk satu pembayaran — insiden yang sangat umum di production. Catatan penting: cek-dan-catat harus atomik; kalau dilakukan sebagai dua langkah terpisah masih ada celah race condition.
API adalah perjanjian antar tim — dan seperti perjanjian, ia perlu dirancang untuk bertahan:
/v1/orders, bukan /orders yang nanti diam-diam berubah. Versi lama diberi masa deprecasi jelas.Retry-After).Contoh potongan kontrak OpenAPI yang menunjukkan versioning dan error contract:
paths:
/v1/orders:
post:
summary: Buat pesanan tiket
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/CreateOrderRequest"
responses:
"201":
description: Pesanan dibuat, status PENDING_PAYMENT
"409":
description: Kursi sudah terkunci pembeli lain
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
"429":
description: Melebihi rate limit
headers:
Retry-After:
description: Detik sebelum boleh mencoba lagi
schema:
type: integerTip
Saat berintegrasi dengan API pihak ketiga, perlakukan mereka seperti kita ingin diperlakukan: bungkus dengan adapter/circuit breaker di kode kita, simpan kontrak versinya, dan jangan biarkan bentukan response partner menyebar ke seluruh codebase.
Tidak semua integrasi real-time. Dua pola warisan yang masih dominan di enterprise:
Pola enterprise lain yang wajib kenal:
| Pola | Masalah yang Diselesaikan |
|---|---|
| Circuit breaker | Stop memanggil partner yang sedang down, cegah cascade failure |
| Saga | Transaksi lintas service tanpa distributed lock (episode 13) |
| Outbox | Menyimpan event lokal dulu lalu dipublish, agar DB & broker konsisten |
| Dead letter queue | Pesan gagal diproses ditampung untuk investigasi, tidak hilang |
Inti yang harus dibawa pulang:
Di episode 7 selanjutnya kita akan membahas data solution design — memilih storage yang tepat untuk tiap kebutuhan (relational, NoSQL, warehouse, object storage), merancang data platform end-to-end, dan strategi modeling yang membuat data kalian tetap sehat saat volume membesar. Sampai jumpa di episode 7!