The klien RabbitMQ Java memiliki konsep berikut:
Connection
- koneksi ke instance server RabbitMQChannel
- ???- Kumpulan utas konsumen - kumpulan utas yang mengkonsumsi pesan dari antrian server RabbitMQ
- Antrian - struktur yang menyimpan pesan dalam urutan FIFO
Saya mencoba memahami hubungan, dan yang lebih penting , hubungan di antara mereka.
- Saya masih tidak yakin apa
Channel
itu, selain fakta bahwa ini adalah struktur yang Anda terbitkan dan konsumsi, dan bahwa itu dibuat dari koneksi terbuka. Jika seseorang dapat menjelaskan kepada saya apa yang dilambangkan oleh "Saluran", ini mungkin membantu membersihkan beberapa hal. - Apa hubungan antara Saluran dan Antrean? Dapatkah Saluran yang sama digunakan untuk berkomunikasi ke Antrian yang berlipat ganda, atau apakah harus 1: 1?
- Apa hubungan antara Antrian dan Kelompok Konsumen? Bisakah beberapa Konsumen berlangganan Antrian yang sama? Apakah beberapa Antrian dapat dikonsumsi oleh Konsumen yang sama? Atau apakah hubungannya 1: 1?
Terima kasih sebelumnya atas bantuan apa pun di sini!
Jawaban:
A
Connection
mewakili koneksi TCP nyata ke broker pesan, sedangkan aChannel
adalah koneksi virtual (koneksi AMQP) di dalamnya. Dengan cara ini Anda dapat menggunakan koneksi (virtual) sebanyak yang Anda inginkan di dalam aplikasi Anda tanpa membebani broker dengan koneksi TCP.Anda dapat menggunakannya
Channel
untuk semuanya. Namun, jika Anda memiliki beberapa utas, disarankan untuk menggunakanChannel
utas yang berbeda untuk setiap utas.Keamanan utas saluran di Panduan API Klien Java :
Tidak ada hubungan langsung antara
Channel
danQueue
. AChannel
digunakan untuk mengirim perintah AMQP ke broker. Ini bisa berupa pembuatan antrian atau serupa, tetapi konsep-konsep ini tidak terikat bersama.Masing-masing
Consumer
berjalan di utasnya sendiri yang dialokasikan dari kumpulan utas konsumen. Jika banyak Konsumen berlangganan Antrian yang sama, broker menggunakan round-robin untuk mendistribusikan pesan di antara mereka secara merata. Lihat Tutorial dua: "Antrian Kerja" .Dimungkinkan juga untuk melampirkan yang sama
Consumer
ke beberapa Antrian. Anda dapat memahami Konsumen sebagai panggilan balik. Ini disebut setiap kali pesan tiba di Antrian yang terikat dengan Konsumen. Untuk kasus Klien Java, setiap Konsumen memiliki metodehandleDelivery(...)
, yang mewakili metode panggilan balik. Apa yang biasanya Anda lakukan adalah, subclassDefaultConsumer
dan overridehandleDelivery(...)
. Catatan: Jika Anda melampirkan instance Konsumen yang sama ke beberapa antrian, metode ini akan dipanggil oleh utas berbeda. Jadi, selaraskan sinkronisasi jika perlu.sumber
Pemahaman konseptual yang baik tentang apa yang protokol AMQP lakukan "di bawah tenda" berguna di sini. Saya akan menawarkan bahwa dokumentasi dan API yang AMQP 0.9.1 pilih untuk digunakan membuat ini sangat membingungkan, jadi pertanyaannya sendiri adalah salah satu yang harus dihadapi banyak orang.
TL; DR
Sebuah koneksi adalah fisik dinegosiasikan TCP socket dengan server AMQP. Klien yang diimplementasikan dengan benar akan memiliki salah satu dari ini per aplikasi, aman untuk benang, dapat digunakan di antara utas.
Sebuah saluran adalah sesi aplikasi tunggal pada sambungan. Utas akan memiliki satu atau lebih dari sesi ini. Arsitektur AMQP 0.9.1 adalah bahwa ini tidak untuk dibagikan di antara utas, dan harus ditutup / dihancurkan ketika utas yang membuatnya selesai dengannya. Mereka juga ditutup oleh server ketika berbagai pelanggaran protokol terjadi.
Sebuah konsumen adalah membangun virtual yang mewakili kehadiran "kotak" pada saluran tertentu. Penggunaan konsumen memberi tahu broker untuk mendorong pesan dari antrian tertentu ke titik akhir saluran itu.
Fakta Koneksi
Pertama, seperti yang orang lain tunjukkan dengan benar, koneksi adalah objek yang mewakili koneksi TCP yang sebenarnya ke server. Koneksi ditentukan pada tingkat protokol di AMQP, dan semua komunikasi dengan broker terjadi melalui satu atau lebih koneksi.
Fakta Saluran
Sebuah Saluran adalah sesi aplikasi yang dibuka untuk setiap bagian dari aplikasi Anda untuk berkomunikasi dengan broker RabbitMQ. Ini beroperasi melalui satu koneksi , dan mewakili sesi dengan broker.
Fakta Konsumen
Seorang konsumen adalah objek yang didefinisikan oleh protokol AMQP. Ini bukan saluran atau koneksi, sebaliknya menjadi sesuatu yang aplikasi khusus Anda gunakan sebagai semacam "kotak surat" untuk menjatuhkan pesan.
Dalam hal apa yang Anda maksud dengan kumpulan utas konsumen, saya menduga bahwa klien Java melakukan sesuatu yang serupa dengan apa yang saya programkan untuk dilakukan klien saya (milik saya didasarkan pada klien .Net, tetapi sangat dimodifikasi).
sumber
Saya menemukan artikel ini yang menjelaskan semua aspek model AMQP, yang salurannya adalah satu. Saya merasa sangat membantu dalam melengkapi pemahaman saya
https://www.rabbitmq.com/tutorials/amqp-concepts.html
sumber
Ada hubungan antara seperti koneksi TCP yang dapat memiliki beberapa Saluran .
Saluran : Ini adalah koneksi virtual di dalam koneksi. Saat menerbitkan atau menggunakan pesan dari antrian - semuanya dilakukan melalui saluran Whereas Connection : Ini adalah koneksi TCP antara aplikasi Anda dan broker RabbitMQ.
Dalam arsitektur multi-threading, Anda mungkin memerlukan koneksi terpisah per utas. Hal itu dapat menyebabkan kurang digunakannya koneksi TCP, juga menambah overhead pada sistem operasi untuk membangun sebanyak mungkin koneksi TCP yang diperlukan selama waktu puncak jaringan. Kinerja sistem dapat dikurangi secara drastis. Di sinilah saluran menjadi berguna, itu menciptakan koneksi virtual di dalam koneksi TCP. Ini secara langsung mengurangi overhead OS, juga memungkinkan kita untuk melakukan operasi asinkron dengan cara yang lebih cepat, andal dan bersamaan.
sumber