Di ApsaraMQ for RocketMQ, konsistensi langganan berarti bahwa semua instance konsumen dengan ID grup yang sama harus berlangganan topik dan tag yang sama. Ketidakkonsistenan dalam langganan dapat menyebabkan kesalahan logika konsumsi pesan serta konsumsi pesan yang berulang atau terlewat.
Apa itu konsistensi langganan?
Di ApsaraMQ for RocketMQ, grup konsumen adalah sekelompok instance konsumen. Dalam aplikasi terdistribusi, beberapa instance konsumen biasanya terhubung ke grup konsumen.
Di ApsaraMQ for RocketMQ, langganan mengacu pada hubungan antara grup konsumen dan topik tertentu, termasuk kondisi yang digunakan untuk memfilter pesan dalam topik tersebut.
Untuk memastikan langganan konsisten, semua instance konsumen dengan ID grup yang sama harus konsisten dalam aspek-aspek berikut:
Topik yang dilanggan oleh instance konsumen harus identik.
Sebagai contoh, jika Konsumen 1 berlangganan Topik A dan Topik B, Konsumen 2 dalam grup yang sama juga harus berlangganan Topik A dan Topik B. Konsumen 2 tidak boleh hanya berlangganan Topik A atau Topik B, atau berlangganan Topik A dan Topik C.
Tag yang dilanggan oleh instance konsumen dalam topik harus identik, termasuk jumlah dan urutan tag.
Sebagai contoh, jika Konsumen 1 berlangganan Tag1||Tag2 di Topik B, Konsumen 2 dalam grup yang sama juga harus berlangganan Tag1||Tag2 di Topik B. Konsumen 2 tidak boleh hanya berlangganan Tag1 atau Tag2, atau berlangganan Tag2||Tag1 di Topik B.
Jika instance konsumen dalam grup berlangganan beberapa topik, tipe pesan dari topik-topik tersebut harus identik.
Sebagai contoh, jika Konsumen 1 dan Konsumen 2 berlangganan Topik A dan Topik B, kedua topik tersebut harus memiliki tipe pesan yang sama, seperti tipe pesan normal atau tipe pesan terurut. Untuk informasi lebih lanjut tentang tipe pesan yang didukung oleh ApsaraMQ for RocketMQ, lihat Tipe Pesan.
Gambar berikut menunjukkan contoh langganan yang konsisten. Grup dengan ID berbeda berlangganan topik yang berbeda. Setiap grup berisi instance konsumen C1, C2, dan C3. Semua instance konsumen dalam grup yang sama berlangganan topik dan tag yang sama.
ApsaraMQ for RocketMQ memungkinkan Anda menggunakan SDK klien TCP dan HTTP untuk mengirim dan menerima pesan. Selain memastikan konsistensi langganan instance konsumen dalam grup yang sama, Anda juga harus memastikan konsistensi antara versi protokol grup konsumen yang berlangganan pesan dan versi protokol SDK. Sebagai contoh, jika Anda menggunakan SDK klien TCP untuk mengirim dan menerima pesan, Anda juga harus menggunakan grup konsumen yang menggunakan protokol TCP untuk berlangganan pesan. Jika tidak, pesan gagal dikonsumsi.
Bagaimana cara memeriksa apakah langganan instance konsumen dalam grup konsisten?
Untuk memeriksa apakah langganan instance konsumen dalam grup konsisten, ikuti langkah-langkah berikut:
Masuk ke Konsol ApsaraMQ for RocketMQ. Di halaman Instances, temukan instance yang ingin Anda kelola dan klik nama instance untuk masuk ke halaman Instance Details.
Di panel navigasi di sebelah kiri, klik Groups. Pada halaman yang muncul, klik nama grup konsumen yang ingin Anda kelola.
Di bagian Subscriptions pada halaman Group Details, periksa apakah langganan grup konsumen konsisten.
Langganan Konsisten 1: Satu tag dalam satu topik
Pada gambar berikut, instance konsumen C1, C2, dan C3 termasuk dalam grup yang sama. Instance konsumen berlangganan Tag 1 di Topik A. Skenario ini memenuhi persyaratan konsistensi langganan.
Contoh Kode Langganan Konsisten 1
Langganan C1, C2, dan C3 konsisten. Oleh karena itu, kode yang ditulis untuk C1, C2, dan C3 untuk berlangganan pesan harus identik. Contoh kode:
Properties properties = new Properties();
properties.put(PropertyKeyConst.GROUP_ID, "GID_test_1");
Consumer consumer = ONSFactory.createConsumer(properties);
consumer.subscribe("TopicA", "Tag1", new MessageListener() {
public Action consume(Message message, ConsumeContext context) {
System.out.println(message.getMsgID());
return Action.CommitMessage;
}
}); Langganan Konsisten 2: Beberapa tag dalam satu topik
Pada gambar berikut, instance konsumen C1, C2, dan C3 termasuk dalam grup yang sama. Instance konsumen tersebut berlangganan Tag1||Tag2 di Topik B. Dengan demikian, semua instance konsumen akan menerima pesan dengan Tag 1 atau Tag 2 di Topik B dalam urutan yang sama. Skenario ini memenuhi persyaratan konsistensi langganan.
Contoh Kode Langganan Konsisten 2
Langganan C1, C2, dan C3 konsisten. Oleh karena itu, kode yang ditulis untuk C1, C2, dan C3 untuk berlangganan pesan harus identik. Contoh kode:
Properties properties = new Properties();
properties.put(PropertyKeyConst.GROUP_ID, "GID_test_2");
Consumer consumer = ONSFactory.createConsumer(properties);
consumer.subscribe("TopicB", "Tag1||Tag2", new MessageListener() {
public Action consume(Message message, ConsumeContext context) {
System.out.println(message.getMsgID());
return Action.CommitMessage;
}
}); Langganan Konsisten 3: Beberapa tag dalam beberapa topik
Pada gambar berikut, instance konsumen C1, C2, dan C3 termasuk dalam grup yang sama. Instance konsumen ini berlangganan Topik A dan Topik B. Tidak ada tag yang ditentukan untuk Topik A, sedangkan Tag1||Tag2 ditentukan untuk Topik B. Dalam hal ini, instance konsumen berlangganan semua pesan di Topik A serta pesan dengan Tag 1 atau Tag 2 di Topik B dalam urutan yang sama. Skenario ini memenuhi persyaratan konsistensi langganan.
Contoh Kode Langganan Konsisten 3
Langganan C1, C2, dan C3 konsisten. Oleh karena itu, kode yang ditulis untuk C1, C2, dan C3 untuk berlangganan pesan harus identik. Contoh kode:
Properties properties = new Properties();
properties.put(PropertyKeyConst.GROUP_ID, "GID_test_3");
Consumer consumer = ONSFactory.createConsumer(properties);
consumer.subscribe("TopicA", "*", new MessageListener() {
public Action consume(Message message, ConsumeContext context) {
System.out.println(message.getMsgID());
return Action.CommitMessage;
}
});
consumer.subscribe("TopicB", "Tag1||Tag2", new MessageListener() {
public Action consume(Message message, ConsumeContext context) {
System.out.println(message.getMsgID());
return Action.CommitMessage;
}
}); Langganan Tidak Konsisten
Anda menggunakan ApsaraMQ for RocketMQ untuk mengirim dan menerima pesan. Instance konsumen tidak menerima pesan seperti yang diharapkan dan langganan instance konsumen yang ditampilkan di konsol ApsaraMQ for RocketMQ tidak konsisten. Ini dapat disebabkan oleh salah satu dari masalah berikut yang terjadi pada instance konsumen:
Langganan Tidak Konsisten 1: Instance konsumen yang termasuk dalam grup yang sama berlangganan topik yang berbeda
Pada gambar berikut, instance konsumen C1, C2, dan C3 termasuk dalam grup yang sama. Instance konsumen berlangganan topik yang berbeda. C1 berlangganan Topik A. C2 berlangganan Topik B. C3 berlangganan Topik C. Skenario ini tidak memenuhi persyaratan konsistensi langganan.
Langganan Tidak Konsisten 2: Instance konsumen yang termasuk dalam grup yang sama berlangganan tag yang berbeda dalam topik yang sama
Pada gambar berikut, instance konsumen C1, C2, dan C3 termasuk dalam grup yang sama. Instance konsumen berlangganan Topik A. Namun, C1 berlangganan Tag 1 di Topik A sedangkan C2 dan C3 berlangganan Tag 2 di Topik A. Instance konsumen berlangganan tag yang berbeda dalam topik yang sama. Skenario ini tidak memenuhi persyaratan konsistensi langganan.

Langganan Tidak Konsisten 3: Instance konsumen yang termasuk dalam grup yang sama berlangganan topik yang sama dan tag yang sama dari topik tersebut, tetapi tag ditentukan dalam urutan yang berbeda
Pada gambar berikut, instance konsumen C1, C2, dan C3 termasuk dalam grup yang sama. Instance konsumen berlangganan Topik A dan Topik B. Tidak ada tag yang ditentukan untuk Topik A. Tag 1 dan Tag 2 ditentukan untuk Topik B. Namun, C1 berlangganan Tag1||Tag2 di Topik B sedangkan C2 dan C3 berlangganan Tag2||Tag1 di Topik B. Skenario ini tidak memenuhi persyaratan konsistensi langganan.

FAQ
Bisakah grup konsumen berlangganan beberapa topik?
Ya, grup konsumen dapat berlangganan beberapa topik. Jika grup konsumen berlangganan topik tertentu, langganan dibuat. Pastikan bahwa semua instance konsumen dalam grup konsumen berlangganan topik tersebut.
Bisakah saya menghapus langganan di konsol ApsaraMQ for RocketMQ?
Tidak, Anda tidak dapat menghapus langganan di konsol ApsaraMQ for RocketMQ. Anda harus menghapus langganan dengan mengonfigurasi parameter yang sesuai dalam kode klien.
