全部产品
Search
文档中心

ApsaraMQ for RocketMQ:Penyaringan pesan

更新时间:Dec 16, 2025

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.Tag过滤

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.

Catatan

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.sql过滤

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.

a IS NULL: Atribut a tidak ada.

IS NOT NULL

Menentukan bahwa atribut ada.

a IS NOT NULL: Atribut a 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
  • String yang dapat dikonversi menjadi nilai numerik dianggap sebagai nilai numerik.

  • Nilai numerik adalah tipe int. Nilai valid: -2147483648 hingga 2147483647.

  • a IS NOT NULL AND a > 100: Atribut a ada dan nilai Atribut a lebih besar dari 100.

  • a IS NOT NULL AND a > 'abc': Contoh kesalahan. Anda tidak dapat membandingkan nilai Atribut a dengan 'abc' karena 'abc' adalah string.

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.

a IS NOT NULL AND (a BETWEEN 10 AND 100): Atribut a ada dan nilai Atribut a lebih besar dari atau sama dengan 10 dan kurang dari atau sama dengan 100.

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.

a IS NOT NULL AND (a NOT BETWEEN 10 AND 100): Atribut a ada dan nilai Atribut a kurang dari 10 atau lebih besar dari 100.

IN (xxx, xxx)

Menentukan bahwa nilai atribut termasuk dalam satu set. Elemen dalam set hanya bisa berupa string.

a IS NOT NULL AND (a IN ('abc', 'def')): Atribut a ada dan nilai Atribut a adalah abc atau def.

  • =

  • <>

Operator sama dengan dan operator tidak sama dengan. Anda dapat menggunakan operator ini untuk membandingkan nilai numerik dan string.

a IS NOT NULL AND (a = 'abc' OR a<>'def'): Atribut aada dan nilai Atribut a adalah 'abc' atau bukan 'def'.

  • AND

  • OR

Operator logika AND dan operator logika OR. Anda dapat menggunakan operator ini untuk menggabungkan fungsi logika sederhana. Setiap fungsi logika harus diapit tanda kurung.

a IS NOT NULL AND (a > 100) OR (b IS NULL): Atribut a ada dan nilai Atribut a lebih besar dari 100 atau Atribut b tidak ada.

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

Catatan

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.