Back to IF4031 Arsitektur Aplikasi Terdistribusi
AMQP dan RabbitMQ - Arsitektur Smart Broker
Questions/Cues
Apa itu AMQP?
Apa model AMQP?
Apa itu arsitektur Smart Broker?
Apa peran Exchange?
Apa peran Queue?
Apa itu Binding?
Apa saja jenis-jenis Exchange?
Bagaimana cara kerja Direct Exchange?
Bagaimana cara kerja Fanout Exchange?
Bagaimana cara kerja Topic Exchange?
Reference Points
- 10-IF4031-07-2023-Message-Publish-Subscribe-2.pdf
Advanced Message Queuing Protocol (AMQP)
AMQP adalah sebuah protokol open standard di application layer untuk sistem messaging. Tujuannya adalah untuk menstandardisasi komunikasi antara klien dan message broker, sehingga implementasi dari vendor yang berbeda dapat saling berinteraksi. RabbitMQ adalah salah satu implementasi message broker AMQP yang paling populer.
Arsitektur Smart Broker, Dumb Client
RabbitMQ mengikuti filosofi “broker pintar, klien bodoh”.
Smart Broker: Semua logika perutean (routing) pesan yang kompleks berada di sisi broker (RabbitMQ). Broker bertanggung jawab penuh untuk menentukan ke mana sebuah pesan harus dikirim.
Dumb Client (Producer/Consumer): Klien tidak perlu tahu ke mana pesan akan berakhir. Producer hanya mempublikasikan pesan ke sebuah entitas bernama Exchange. Consumer hanya mengambil pesan dari entitas bernama Queue.
Komponen Inti RabbitMQ
Alur pesan di RabbitMQ tidak langsung dari producer ke queue.
Producer mengirimkan pesan ke sebuah Exchange.
Exchange menerima pesan tersebut dan, berdasarkan aturan tertentu, meneruskannya ke satu atau lebih Queue.
Queue adalah tempat penyimpanan pesan sementara, menunggu untuk diambil.
Consumer terhubung ke sebuah Queue dan menerima pesan darinya.
Binding: Ini adalah “aturan” yang menghubungkan sebuah Exchange ke sebuah Queue. Binding memberi tahu Exchange pesan mana yang harus diteruskan ke queue mana.
Jenis-jenis Exchange
Perilaku routing ditentukan oleh tipe Exchange. Tiga tipe utama adalah:
1. Direct Exchange
Mekanisme: Meneruskan pesan ke queue yang binding key-nya cocok persis dengan routing key pada pesan.
Kasus Penggunaan: Unicast atau point-to-point. Sangat cocok untuk mengarahkan tugas ke worker queue tertentu.
2. Fanout Exchange
Mekanisme: Meneruskan pesan ke semua queue yang terikat padanya, tanpa mempedulikan routing key.
Kasus Penggunaan: Broadcast atau publish-subscribe murni. Ideal untuk menyiarkan pembaruan state atau notifikasi ke banyak penerima.
3. Topic Exchange
Mekanisme: Meneruskan pesan ke queue yang binding key-nya cocok dengan pola (pattern) dari routing key pada pesan. Pola ini menggunakan wildcard:
*(bintang) cocok untuk tepat satu kata.
#(pagar) cocok untuk nol atau lebih kata.Contoh:
Routing key pesan:
logs.europe.errorBinding key
logs.*.errorakan cocok.Binding key
logs.europe.#akan cocok.Binding key
logs.asia.*tidak akan cocok.Kasus Penggunaan: Multicast atau publish-subscribe berbasis konten. Sangat fleksibel untuk mengarahkan pesan ke subscriber yang hanya tertarik pada sub-kategori tertentu.
RabbitMQ adalah implementasi Message Broker dari protokol AMQP yang mengadopsi arsitektur “Smart Broker”, di mana semua logika perutean pesan yang kompleks berada di pusat. Pesan dari Producer dikirim ke sebuah Exchange, yang kemudian mendistribusikannya ke satu atau lebih Queue berdasarkan aturan Binding dan tipe Exchange (Direct untuk pencocokan pasti, Fanout untuk broadcast, dan Topic untuk pencocokan pola). Consumer kemudian mengambil pesan dari Queue, sepenuhnya terpisah dari logika perutean tersebut.
Additional Information
Channel dalam AMQP
Koneksi TCP/IP antara klien dan broker adalah “mahal” untuk dibuat. Untuk memungkinkan banyak komunikasi terisolasi melalui satu koneksi fisik, AMQP menggunakan konsep Channel. Bayangkan satu koneksi TCP sebagai pipa besar, dan channel adalah banyak jalur kecil di dalam pipa tersebut. Setiap operasi (mempublikasikan pesan, mendeklarasikan queue) terjadi di dalam sebuah channel. Ini sangat efisien dan merupakan praktik terbaik untuk menggunakan satu koneksi per proses aplikasi dan membuka banyak channel sesuai kebutuhan.
Durable vs. Transient
Untuk mencegah kehilangan data jika broker RabbitMQ di-restart, komponen-komponennya dapat dibuat persisten:
Durable Exchange/Queue: Metadata tentang exchange atau queue tersebut akan bertahan setelah restart.
Persistent Message: Isi pesan itu sendiri akan ditulis ke disk oleh broker.
Untuk menjamin pesan tidak hilang, Anda harus mendeklarasikan queue sebagai durable DAN mempublikasikan pesan sebagai persistent. Ini memberikan jaminan at-least-once, tetapi dengan trade-off performa karena adanya operasi I/O disk.