Setelah konsumen berlangganan ke topik, ApsaraMQ for RocketMQ mengirimkan semua pesan dalam topik tersebut kepada konsumen. Jika konsumen hanya ingin menerima pesan tertentu dari topik tersebut, Anda dapat mengonfigurasi kondisi penyaringan pada broker ApsaraMQ for RocketMQ. Hal ini mencegah konsumen menerima sejumlah besar pesan yang tidak relevan.
Skenario
ApsaraMQ for RocketMQ adalah layanan middleware berbasis model publikasi-langganan (pub/sub) yang digunakan untuk mengintegrasikan bisnis hulu dan hilir. Dalam skenario bisnis nyata, pesan dalam topik diproses oleh aplikasi hilir dengan logika konsumsi yang berbeda. Setiap aplikasi hanya perlu mengonsumsi pesan yang sesuai dengan logika konsumsinya.
Anda dapat menggunakan fitur penyaringan pesan yang disediakan oleh ApsaraMQ for RocketMQ untuk secara efisien menyaring pesan yang dibutuhkan oleh konsumen. Ini mencegah sejumlah besar pesan yang tidak relevan dikirimkan ke konsumen dan mengurangi beban kerja di sistem hilir.
Fitur penyaringan pesan dari ApsaraMQ for RocketMQ menyelesaikan masalah penyaringan pesan dalam topik dan digunakan dalam skenario di mana diperlukan pengkategorian rinci untuk jalur bisnis yang sama. Jika Anda ingin mengelola pesan untuk jalur bisnis yang berbeda, kami sarankan menggunakan topik yang berbeda.
Ikhtisar
Apa itu penyaringan pesan?
Fitur penyaringan pesan dari ApsaraMQ for RocketMQ menyaring pesan berdasarkan kondisi yang dikonfigurasi oleh konsumen dan mengirimkan pesan yang memenuhi kondisi tersebut kepada konsumen.
Setelah atribut pesan dan tag didefinisikan untuk produsen dan konsumen, pesan disaring dan dicocokkan berdasarkan kondisi penyaringan pada broker ApsaraMQ for RocketMQ. Hanya pesan yang memenuhi kondisi penyaringan yang dikirimkan kepada konsumen.
Bagaimana cara kerja penyaringan pesan?

Penyaringan pesan melibatkan langkah-langkah berikut:
Produser: Sebelum produser menginisialisasi pesan, produser menambahkan atribut dan tag yang digunakan untuk mencocokkan kondisi penyaringan yang dikonfigurasi oleh konsumen ke dalam pesan.
Konsumen: Selama inisialisasi dan konsumsi pesan, konsumen memanggil operasi pendaftaran langganan untuk memberi tahu broker ApsaraMQ for RocketMQ tentang pesan yang ingin dilanggan dalam topik tertentu. Ini juga dikenal sebagai pelaporan kondisi penyaringan.
Broker: Saat konsumen mengonsumsi pesan, broker ApsaraMQ for RocketMQ secara dinamis mencocokkan pesan berdasarkan ekspresi kondisi penyaringan yang dilaporkan dan mengirimkan pesan yang memenuhi kondisi penyaringan kepada konsumen.
Klasifikasi
ApsaraMQ for RocketMQ mendukung metode penyaringan berbasis tag dan penyaringan SQL berbasis atribut. Tabel berikut menjelaskan metode-metode tersebut.
Item | Penyaringan berbasis tag | Penyaringan SQL berbasis atribut |
Target | Tag pesan. | Atribut pesan, yang mencakup atribut kustom dan atribut sistem. Tag pesan adalah jenis atribut sistem. |
Kapasitas | Pencocokan tepat. | Pencocokan berbasis sintaksis SQL. |
Skenario | Skema penyaringan yang melibatkan logika komputasi sederhana dan ringan. | Skema penyaringan yang melibatkan logika komputasi kompleks. |
Untuk informasi lebih lanjut, lihat Penyaringan Berbasis Tag dan Penyaringan Berbasis Atribut SQL.
Konsistensi langganan
Ekspresi penyaringan merupakan bagian dari langganan. Berdasarkan model domain ApsaraMQ for RocketMQ, ekspresi penyaringan langganan konsumen dalam grup konsumen yang sama harus sama. Jika tidak, pesan tertentu tidak dapat dikonsumsi. Untuk informasi lebih lanjut, lihat Langganan.
Penyaringan berbasis tag
Penyaringan berbasis tag adalah metode penyaringan dasar yang disediakan oleh ApsaraMQ for RocketMQ. Dalam metode ini, pesan dicocokkan berdasarkan tag yang ditentukan oleh produser. Konsumen menggunakan tag untuk menentukan pesan yang ingin mereka konsumsi.
Skenario contoh
Item berikut menggambarkan pesan yang dihasilkan dalam skenario transaksi e-commerce:
Pesan pesanan
Pesan pembayaran
Pesan logistik
Pesan dikirim ke topik bernama Trade_Topic yang dilanggan oleh sistem hilir berikut:
Sistem pembayaran: hanya berlangganan pesan pembayaran.
Sistem logistik: hanya berlangganan pesan logistik.
Sistem analisis tingkat keberhasilan transaksi: berlangganan pesan pesanan dan pembayaran.
Sistem komputasi waktu nyata: berlangganan semua pesan.
Gambar berikut menunjukkan efek penyaringan.
Pengaturan tag
Sebelum produser mengirim pesan, produser hanya dapat menambahkan satu tag ke setiap pesan.
Setiap tag terdiri dari serangkaian karakter. Kami sarankan setiap tag tidak melebihi 128 karakter.
Tag bersifat peka huruf besar/kecil. Misalnya, TAG A dan tag a adalah tag yang berbeda.
Aturan penyaringan
Penyaringan berbasis tag mengimplementasikan penyaringan tepat berdasarkan string karakter. Aturan penyaringan berikut didukung:
Pencocokan tag tunggal: Anda dapat menentukan satu tag dalam ekspresi filter untuk menerima hanya pesan yang memiliki tag tersebut.
Pencocokan multi-tag: Anda dapat menentukan beberapa tag dalam ekspresi filter untuk menerima pesan yang memiliki salah satu tag tersebut. Pisahkan beberapa tag dengan dua garis vertikal (||). Misalnya, Tag1||Tag2||Tag3 menentukan bahwa pesan yang memiliki Tag1, Tag2, atau Tag3 semuanya dikirim ke konsumen.
Pencocokan semua: Anda dapat menggunakan tanda bintang (*) sebagai karakter wildcard untuk mencocokkan semua tag. Ini menentukan bahwa semua pesan dalam topik dikirim ke konsumen.
Kode contoh
Tentukan tag sebelum pengiriman pesan
Message message = messageBuilder.setTopic("topic") // Kunci pesan. Anda dapat menggunakan kunci untuk mencari pesan. .setKeys("messageKey") // Tag pesan. Konsumen dapat menggunakan tag untuk menyaring pesan. // Dalam contoh ini, tag pesan diatur ke TagA. .setTag("TagA") // Isi pesan. .setBody("messageBody".getBytes()) .build();Berlangganan pesan yang cocok dengan satu tag
String topic = "Topik Anda"; // Berlangganan pesan yang memiliki TagA. FilterExpression filterExpression = new FilterExpression("TagA", FilterExpressionType.TAG); pushConsumer.subscribe(topic, filterExpression);Berlangganan pesan yang cocok dengan beberapa tag
String topic = "Topik Anda"; // Berlangganan pesan yang memiliki TagA, TagB, atau TagC. FilterExpression filterExpression = new FilterExpression("TagA||TagB||TagC", FilterExpressionType.TAG); pushConsumer.subscribe(topic, filterExpression);Berlangganan semua pesan dalam topik
String topic = "Topik Anda"; // Berlangganan semua pesan. FilterExpression filterExpression = new FilterExpression("*", FilterExpressionType.TAG); pushConsumer.subscribe(topic, filterExpression);
Penyaringan SQL berbasis atribut
Penyaringan SQL berbasis atribut adalah metode penyaringan lanjutan yang disediakan oleh ApsaraMQ for RocketMQ. Dalam metode ini, pesan dicocokkan berdasarkan pasangan nilai-kunci yang ditentukan oleh produser. Saat produser mengirim pesan, produser dapat menentukan beberapa atribut untuk setiap pesan. Kemudian, konsumen dapat menentukan atribut dalam ekspresi SQL untuk menerima pesan tertentu.
Penyaringan berbasis tag juga merupakan jenis penyaringan SQL berbasis atribut karena tag adalah jenis atribut sistem. Dalam sintaksis SQL, atribut tag direpresentasikan oleh TAGS.
Skenario contoh
Item berikut menggambarkan pesan yang dihasilkan dalam skenario transaksi e-commerce. Pesan diklasifikasikan menjadi pesan pesanan dan pesan logistik. Atribut wilayah ditentukan untuk pesan logistik. Nilai atribut wilayah adalah Hangzhou dan Shanghai.
Pesan pesanan
Pesan logistik
Pesan logistik yang nilai atribut wilayahnya adalah Hangzhou
Pesan logistik yang nilai atribut wilayahnya adalah Shanghai
Pesan dikirim ke topik bernama Trade_Topic yang dilanggan oleh sistem hilir berikut:
Sistem logistik 1: hanya berlangganan pesan logistik yang nilai atribut wilayahnya adalah Hangzhou.
Sistem logistik 2: berlangganan semua pesan logistik.
Sistem pelacakan pesanan: hanya berlangganan pesan pesanan.
Sistem komputasi waktu nyata: berlangganan semua pesan.
Gambar berikut menunjukkan efek penyaringan.
Pengaturan atribut pesan
Sebelum produser mengirim pesan, produser dapat menentukan atribut kustom untuk setiap pesan. Setiap atribut adalah pasangan nilai-kunci kustom.
Kunci atribut dapat berisi huruf, angka, dan garis bawah (_).
Kunci atribut harus dimulai dengan huruf atau garis bawah (_).
Beberapa atribut dapat ditentukan untuk setiap pesan.
Aturan penyaringan
Anda harus mengikuti sintaksis SQL-92 saat menulis ekspresi filter. Tabel berikut menjelaskan sintaksis tersebut.
Sintaksis | Deskripsi | Contoh |
IS NULL | Menentukan bahwa atribut tidak ada. |
|
IS NOT NULL | Menentukan bahwa atribut ada. |
|
| Membandingkan nilai numerik. Anda tidak dapat menggunakan sintaksis ini untuk membandingkan string. Jika Anda menggunakan sintaksis ini untuk membandingkan string, kesalahan akan dilaporkan saat konsumen dimulai. Catatan
|
|
BETWEEN xxx AND xxx | Membandingkan nilai numerik. Anda tidak dapat menggunakan sintaksis ini untuk membandingkan string. Jika Anda menggunakan sintaksis ini untuk membandingkan string, kesalahan akan dilaporkan saat konsumen dimulai. Sintaksis ini setara dengan >= xxx AND <= xxx, yang menentukan bahwa nilai atribut berada di antara dua nilai numerik atau sama dengan salah satu dari dua nilai numerik tersebut. |
|
NOT BETWEEN xxx AND xxx | Membandingkan nilai numerik. Anda tidak dapat menggunakan sintaksis ini untuk membandingkan string. Jika Anda menggunakan sintaksis ini untuk membandingkan string, kesalahan akan dilaporkan saat konsumen dimulai. Sintaksis ini setara dengan < xxx OR > xxx, yang menentukan bahwa nilai atribut kurang dari nilai numerik di sisi kiri atau lebih besar dari nilai numerik di sisi kanan. |
|
IN (xxx, xxx) | Menentukan bahwa nilai atribut termasuk dalam satu set. Elemen dalam set hanya bisa berupa string. |
|
| Operator sama dengan dan operator tidak sama dengan. Anda dapat menggunakan operator ini untuk membandingkan nilai numerik dan string. |
|
| Operator logika AND dan operator logika OR. Anda dapat menggunakan operator ini untuk menggabungkan fungsi logika sederhana. Setiap fungsi logika harus diapit tanda kurung. |
|
Dalam penyaringan berbasis atribut SQL, produser menentukan atribut pesan kustom, dan kemudian konsumen mendefinisikan ekspresi filter SQL untuk mengonsumsi pesan. Akibatnya, hasil perhitungan ekspresi filter mungkin tidak pasti. Dalam hal ini, broker ApsaraMQ for RocketMQ memproses pesan berdasarkan logika berikut:
Penanganan pengecualian: Jika pengecualian dilaporkan saat ekspresi filter sedang dihitung, broker secara otomatis menyaring pesan yang diterima dan tidak mengirimkan pesan tersebut ke konsumen. Misalnya, pengecualian terjadi saat nilai numerik dan non-numerik dibandingkan.
Penanganan nilai null: Jika hasil perhitungan ekspresi filter adalah NULL atau nilainya bukan nilai Boolean, broker secara otomatis menyaring pesan yang diterima dan tidak mengirimkan pesan tersebut ke konsumen. Nilai Boolean mewakili nilai kebenaran, yang bisa benar atau salah. Misalnya, saat konsumen berlangganan pesan, konsumen menggunakan atribut yang tidak ditentukan oleh produser sebagai kondisi filter. Dalam hal ini, hasil perhitungan ekspresi filter adalah NULL.
Penanganan nilai numerik yang tidak konsisten: Jika nilai atribut pesan kustom adalah bilangan floating-point, tetapi nilai atribut yang digunakan dalam ekspresi filter adalah bilangan bulat, broker secara otomatis menyaring pesan yang diterima dan tidak mengirimkan pesan tersebut ke konsumen.
Kode contoh
Tentukan tag dan atribut kustom sebelum pengiriman pesan
Message message = messageBuilder.setTopic("topic") // Kunci pesan. Anda dapat menggunakan kunci untuk mencari pesan. .setKeys("messageKey") // Tag pesan. Konsumen dapat menggunakan tag untuk menyaring pesan. // Dalam contoh ini, tag pesan diatur ke messageTag. .setTag("messageTag") // Anda juga dapat menentukan atribut kustom untuk pesan, seperti lingkungan, wilayah, dan cabang logis. // Dalam contoh ini, atribut kustom adalah region dan nilai atributnya adalah Hangzhou. .addProperty("Region", "Hangzhou") // Isi pesan. .setBody("messageBody".getBytes()) .build();Berlangganan pesan yang cocok dengan satu atribut
String topic = "topik"; // Berlangganan hanya pesan yang nilai atribut wilayahnya adalah Hangzhou. FilterExpression filterExpression = new FilterExpression("Region IS NOT NULL AND Region='Hangzhou'", FilterExpressionType.SQL92); simpleConsumer.subscribe(topic, filterExpression);Berlangganan pesan yang cocok dengan beberapa atribut
String topic = "topik"; // Berlangganan pesan yang nilai atribut wilayahnya adalah Hangzhou dan nilai atribut harga lebih besar dari 30. FilterExpression filterExpression = new FilterExpression("Region IS NOT NULL AND price IS NOT NULL AND Region = 'Hangzhou' AND price > 30", FilterExpressionType.SQL92); simpleConsumer.subscribe(topic, filterExpression);Berlangganan semua pesan dalam topik
String topic = "topik"; // Berlangganan semua pesan. FilterExpression filterExpression = new FilterExpression("True", FilterExpressionType.SQL92); simpleConsumer.subscribe(topic, filterExpression);
Catatan penggunaan
Rencanakan topik dengan baik dan tentukan tag
Anda dapat menggunakan topik, tag, dan atribut untuk mendistribusikan pesan. Perhatikan prinsip-prinsip berikut saat mendistribusikan pesan:
Jenis pesan: Pesan dengan jenis berbeda, seperti pesan terurut dan pesan normal, harus didistribusikan ke topik yang berbeda. Jangan gunakan tag untuk mengkategorikan pesan.
Domain bisnis: Domain bisnis dan departemen yang berbeda harus menggunakan topik yang berbeda. Misalnya, topik untuk pesan logistik dan pesan pembayaran harus berbeda. Pesan logistik dapat dibagi menjadi pesan biasa dan pesan mendesak dengan menggunakan tag.
Konsistensi antara jumlah pesan dan pentingnya tautan: Pesan yang berbeda dalam jumlah atau pentingnya tautan harus didistribusikan ke topik yang berbeda.
FAQ
Mengapa pesan hilang saat beberapa konsumen berlangganan tag berbeda dalam satu topik?
Penyebab yang mungkin: Jika konsumen tersebut termasuk dalam grup konsumen yang sama, tag yang dilanggan oleh konsumen harus sama. Jika tidak, ketidaksesuaian langganan terjadi dan pesan tertentu hilang.
Bagaimana cara menghitung jumlah pesan yang dikonsumsi oleh konsumen saat kondisi penyaringan ditentukan?
Jumlah pesan yang dikonsumsi oleh konsumen dihitung setelah kondisi penyaringan ditentukan.
Mengapa pesan terakumulasi dalam grup meskipun konsumen online tidak mengonsumsi pesan?
Jika Anda menggunakan penyaringan SQL atau penyaringan berbasis tag untuk menyaring pesan, pesan yang tidak memenuhi kondisi penyaringan terakumulasi. Item berikut menjelaskan cara menghitung jumlah pesan terakumulasi dalam skenario tersebut:
Penyaringan SQL: Jumlah pesan terakumulasi = Jumlah pesan siap + Jumlah pesan dalam proses - Jumlah pesan yang tidak memenuhi kondisi penyaringan
Penyaringan berbasis tag: Jumlah pesan terakumulasi = (Jumlah pesan siap + Jumlah pesan dalam proses) × Persentase pesan yang cocok dengan tag
Persentase pesan yang cocok dengan tag = Jumlah pesan yang cocok dengan tag dalam sampel / Jumlah total pesan sampel
Referensi
Untuk informasi tentang kode contoh lengkap untuk perpesanan, lihat Ikhtisar.