Filter dan tindakan topik
Pelanggan dapat menentukan pesan mana yang ingin mereka terima dari sebuah topik. Pesan-pesan ini ditentukan dalam bentuk satu aturan langganan bernama atau lebih. Setiap aturan terdiri dari kondisi filter yang memilih pesan tertentu, dan secara opsional berisi sebuah tindakan yang menganotasi pesan yang dipilih.
Semua aturan tanpa tindakan digabungkan menggunakan kondisi OR
dan menghasilkan satu pesan pada langganan meskipun Anda memiliki beberapa aturan yang cocok.
Setiap aturan dengan tindakan menghasilkan salinan pesan. Pesan ini akan memiliki properti yang disebut RuleName
yang nilainya adalah nama aturan yang cocok. Tindakan dapat menambahkan atau memperbarui properti, atau menghapus properti dari pesan asli untuk menghasilkan pesan pada langganan.
Pertimbangkan skenario berikut di mana langganan memiliki lima aturan: dua aturan dengan tindakan dan tiga lainnya tanpa tindakan. Dalam contoh ini, jika Anda mengirim satu pesan yang cocok dengan kelima aturan tersebut, Anda mendapatkan tiga pesan pada langganan. Itu dua pesan untuk dua aturan dengan tindakan dan satu pesan untuk tiga aturan tanpa tindakan.
Setiap langganan topik yang baru dibuat memiliki aturan langganan default awal. Jika Anda tidak secara eksplisit menentukan kondisi filter untuk aturan tersebut, filter yang diterapkan adalah filter true yang memungkinkan semua pesan dipilih ke dalam langganan. Aturan default tidak memiliki tindakan anotasi terkait.
Catatan
Artikel ini berlaku untuk skenario non-JMS. Untuk skenario JMS, gunakan pemilih pesan.
Filter
Bus Layanan mendukung tiga jenis filter:
- Filter SQL
- Filter Boolean
- Filter korelasi
Bagian berikut ini menyediakan detail tentang filter ini.
Filter SQL
SqlFilter menyimpan ekspresi kondisional seperti SQL yang dievaluasi di broker terhadap properti dan properti sistem yang ditentukan pengguna pesan yang tiba. Semua properti sistem harus diawali sys.
dalam ekspresi bersyarat. Subset bahasa SQL untuk pengujian kondisi filter untuk keberadaan properti (EXISTS
), nilai null (IS NULL
), operator logisAND
//NOT
OR
, relasional, aritmatika numerik sederhana, dan pola teks sederhana yang cocok dengan .LIKE
Berikut adalah contoh .NET untuk menentukan filter SQL:
adminClient = new ServiceBusAdministrationClient(connectionString);
// Create a SQL filter with color set to blue and quantity to 10
await adminClient.CreateSubscriptionAsync(
new CreateSubscriptionOptions(topicName, "ColorBlueSize10Orders"),
new CreateRuleOptions("BlueSize10Orders", new SqlRuleFilter("color='blue' AND quantity=10")));
// Create a SQL filter with color set to red
// Action is defined to set the quantity to half if the color is red
await adminClient.CreateRuleAsync(topicName, "ColorRed", new CreateRuleOptions
{
Name = "RedOrdersWithAction",
Filter = new SqlRuleFilter("user.color='red'"),
Action = new SqlRuleAction("SET quantity = quantity / 2;")
}
Filter Boolean
TrueFilter dan FalseFilter menyebabkan semua pesan yang tiba (benar) atau tidak ada pesan yang tiba (salah) yang dipilih untuk langganan. Kedua filter ini berasal dari filter SQL.
Berikut adalah contoh .NET untuk menentukan filter boolean:
// Create a True Rule filter with an expression that always evaluates to true
// It's equivalent to using SQL rule filter with 1=1 as the expression
await adminClient.CreateSubscriptionAsync(
new CreateSubscriptionOptions(topicName, subscriptionAllOrders),
new CreateRuleOptions("AllOrders", new TrueRuleFilter()));
Filter korelasi
CorrelationFilter menyimpan serangkaian kondisi yang cocok dengan satu atau beberapa properti pengguna dan sistem pesan yang tiba. Penggunaan umum adalah mencocokkan dengan properti CorrelationId, tetapi aplikasi juga dapat memilih untuk mencocokkan dengan properti berikut:
ContentType
Label
MessageId
ReplyTo
ReplyToSessionId
SessionId
To
- properti yang ditentukan pengguna.
Kecocokan ada ketika nilai pesan yang tiba untuk properti sama dengan nilai yang ditentukan dalam filter korelasi. Untuk ekspresi string, perbandingannya peka huruf besar/kecil. Jika Anda menentukan beberapa properti kecocokan, filter menggabungkannya sebagai kondisi DAN logis, yang berarti filter cocok, semua kondisi harus cocok.
Berikut adalah contoh .NET untuk menentukan filter korelasi:
// Create a correlation filter with color set to Red and priority set to High
await adminClient.CreateSubscriptionAsync(
new CreateSubscriptionOptions(topicName, "HighPriorityRedOrders"),
new CreateRuleOptions("HighPriorityRedOrdersRule", new CorrelationRuleFilter() {Subject = "red", CorrelationId = "high"} ));
CorrelationRuleFilter
Gunakan konstruktor yang mengambil String
argumen untuk membuat filter korelasi dengan ID korelasi.
Saat Anda menggunakan CorrelationRuleFilter
konstruktor default, Anda dapat menetapkan properti sistem (ContentType
, , , Label
, ReplyTo
MessageId
, ReplyToSessionId
, SessionId
, To
), dan properti yang ditentukan pengguna untuk pemfilteran. Untuk menentukan properti yang ditentukan pengguna untuk filter korelasi, gunakan properti Properties
jenis IDictionary <string, object>
. Kunci untuk kamus ini adalah properti yang ditentukan pengguna untuk mencari pesan. Nilai yang terkait dengan kunci adalah nilai untuk berkorelasi. Berikut adalah contohnya.
var filter = new CorrelationFilter();
filter.Label = "abc";
filter.ReplyTo = "xdeu@hotmail.com";
filter.Properties["prop1"] = "abc";
filter.Properties["prop2"] = "xyz";
Catatan
- Semua filter mengevaluasi properti pesan. Filter tidak dapat mengevaluasi isi pesan.
- Aturan filter kompleks memerlukan kapasitas pemrosesan. Secara khusus, penggunaan aturan filter SQL menyebabkan throughput pesan keseluruhan yang lebih rendah pada tingkat langganan, topik, dan namespace. Jika memungkinkan, aplikasi harus memilih filter korelasi melalui filter melalui filter seperti SQL karena jauh lebih efisien dalam pemrosesan dan memiliki dampak yang lebih kecil pada throughput.
Tindakan
Dengan ketentuan filter SQL, Anda dapat menentukan tindakan yang dapat membuat anotasi pesan dengan menambahkan, menghapus, atau mengganti properti dan nilainya. Tindakan ini menggunakan ekspresi seperti SQL yang secara longgar condong pada SQL UPDATE
sintaks pernyataan. Tindakan dilakukan pada pesan setelah dicocokkan dan sebelum pesan dipilih ke dalam langganan. Perubahan pada properti pesan bersifat pribadi untuk pesan yang disalin ke dalam langganan.
Berikut adalah contoh .NET yang membuat aturan SQL dengan tindakan untuk memperbarui kuantitas saat warnanya Merah.
adminClient = new ServiceBusAdministrationClient(connectionString);
// Create a SQL filter with color set to red
// Action is defined to set the quantity to half if the color is red
await adminClient.CreateRuleAsync(topicName, "ColorRed", new CreateRuleOptions
{
Name = "RedOrdersWithAction",
Filter = new SqlRuleFilter("user.color='red'"),
Action = new SqlRuleAction("SET quantity = quantity / 2;")
}
Penting
Saat Anda memperbarui properti sistem melalui tindakan aturan, perhatikan bahwa itu mungkin mengubah perilaku yang diharapkan. Beberapa properti hanya dievaluasi ketika pesan diterima dalam antrean atau topik. Oleh karena itu, ketika Anda memperbarui properti ini dalam tindakan aturan lalu mengirimkannya dalam langganan, properti tersebut diabaikan. Meskipun, saat penerusan otomatis ke antrean atau topik lain, mereka dievaluasi kembali.
- ScheduledEnqueueTime: Saat Anda mengatur atau memperbarui properti ini, properti ini diabaikan pada langganan.
- MessageID dengan deduplikasi: Tidak ada deduplikasi yang dilakukan dalam langganan saat MessageID diperbarui dan menghasilkan duplikat.
- SessionID dengan partisi: Dalam skenario ini, ID sesi adalah kunci partisi untuk entitas yang dipartisi dan digunakan untuk memutuskan partisi tempat pesan dikirim. Mengubah sessionID dalam tindakan aturan berarti bahwa kunci partisi diubah setelah pesan mendarat di partisi. Akibatnya, konsumen mungkin tidak menerima beberapa pesan ini dalam sesi. Bahkan jika konsumen menerima pesan, tampaknya seolah-olah mereka berasal dari partisi yang salah karena kunci partisi yang diubah.
Pola penggunaan
Pola siaran
Skenario penggunaan paling sederhana untuk sebuah topik adalah bahwa setiap langganan mendapatkan salinan setiap pesan yang dikirim ke sebuah topik, yang memungkinkan pola siaran.
Pola pemartisian
Pemartisian menggunakan filter untuk mendistribusikan pesan di beberapa langganan topik yang ada dengan cara yang dapat diprediksi dan saling eksklusif . Pola partisi digunakan ketika sistem diskalakan untuk menangani banyak konteks yang berbeda di kompartemen yang identik secara fungsional yang masing-masing mengikat subset data keseluruhan; misalnya, informasi profil pelanggan. Dengan partisi, penerbit mengirimkan pesan ke dalam topik tanpa memerlukan pengetahuan tentang model partisi. Pesan kemudian dipindahkan ke langganan yang benar yang dari situ pesan tersebut kemudian dapat diambil oleh handler pesan partisi.
Pola perutean
Perutean menggunakan filter untuk mendistribusikan pesan di seluruh langganan topik dengan cara yang dapat diprediksi, tetapi belum tentu eksklusif. Bersamaan dengan fitur penerusan otomatis, filter topik dapat digunakan untuk membuat grafik perutean yang kompleks dalam namespace Service Bus untuk distribusi pesan dalam wilayah Azure. Dengan Azure Functions atau Azure Logic Apps yang bertindak sebagai jembatan antara namespace Azure Service Bus, Anda dapat membuat topologi global yang kompleks dengan integrasi langsung ke dalam aplikasi lini bisnis.
Catatan
Karena portal Microsoft Azure sekarang mendukung fungsionalitas Service Bus Explorer, filter langganan dapat dibuat atau diedit dari portal.
Langkah berikutnya
Untuk contoh selengkapnya, lihat contoh filter Bus Layanan.