Halaman ini menjelaskan cara membuat langganan Pub/Sub dengan filter.
Saat menerima pesan dari langganan dengan filter, Anda hanya akan menerima pesan yang cocok dengan filter. Layanan Pub/Sub secara otomatis mengonfirmasi bahwa pesan yang tidak cocok dengan filter. Anda dapat memfilter pesan menurut atribut-nya, tetapi tidak menurut data dalam pesan.
Anda dapat memiliki beberapa langganan yang terpasang ke topik dan setiap langganan dapat memiliki filter yang berbeda.
Misalnya, jika Anda memiliki topik yang menerima berita dari berbagai bagian dunia, Anda dapat mengonfigurasi langganan untuk memfilter berita yang hanya dipublikasikan dari wilayah tertentu. Untuk konfigurasi ini, Anda harus memastikan bahwa salah satu atribut pesan topik menunjukkan wilayah publikasi berita.
Saat menerima pesan dari langganan dengan filter, Anda tidak dikenai biaya pesan keluar untuk pesan yang otomatis dikonfirmasi oleh Pub/Sub. Anda akan dikenai biaya pengiriman pesan dan biaya penyimpanan terkait penelusuran untuk pesan ini.
Membuat langganan dengan filter
Langganan pull dan push dapat memiliki filter. Semua pelanggan dapat menerima pesan dari langganan dengan filter, termasuk pelanggan yang menggunakan StreamingPull API.
Anda dapat membuat langganan dengan filter menggunakan konsol Google Cloud, Google Cloud CLI, library klien, atau Pub/Sub API.
Konsol
Untuk membuat langganan pull dengan filter, ikuti langkah-langkah berikut:
Di konsol Google Cloud, buka halaman Langganan.
Klik Buat langganan.
Masukkan ID Langganan.
Pilih atau buat topik dari menu drop-down. Langganan menerima pesan dari topik.
Di bagian Filter subscription, masukkan ekspresi filter.
Klik Create.
Untuk membuat langganan push dengan filter, ikuti langkah-langkah berikut:
Di konsol Google Cloud, buka halaman Langganan.
Klik Buat langganan.
Masukkan ID Langganan.
Pilih atau buat topik dari menu drop-down. Langganan menerima pesan dari topik.
Di bagian Jenis pengiriman, klik Push.
Di kolom Endpoint URL, masukkan URL endpoint push.
Di bagian Filter subscription, masukkan ekspresi filter.
Klik Create.
gcloud
Untuk membuat langganan pull dengan filter, gunakan perintah gcloud pubsub subscriptions create
dengan flag --message-filter
:
gcloud pubsub subscriptions create SUBSCRIPTION_ID \ --topic=TOPIC_ID \ --message-filter='FILTER'
Ganti kode berikut:
- SUBSCRIPTION_ID: ID langganan yang akan dibuat
- TOPIC_ID: ID topik yang akan dilampirkan ke langganan
- FILTER: ekspresi dalam sintaksis pemfilteran
Untuk membuat langganan push dengan filter, gunakan perintah gcloud pubsub subscriptions create
dengan flag --push-endpoint
dan --message-filter
:
gcloud pubsub subscriptions create SUBSCRIPTION_ID \ --topic=TOPIC_ID \ --push-endpoint=PUSH_ENDPOINT \ --message-filter='FILTER'
Ganti kode berikut:
- SUBSCRIPTION_ID: ID langganan yang akan dibuat
- TOPIC_ID: ID topik yang akan dilampirkan ke langganan
- PUSH_ENDPOINT: URL server tempat subscriber push berjalan
- FILTER: ekspresi dalam sintaksis pemfilteran
REST
Untuk membuat langganan dengan filter, gunakan metode
projects.subscriptions.create
.
PUT https://pubsub.googleapis.com/v1/projects/PROJECT_ID/subscriptions/SUBSCRIPTION_ID Authorization: Bearer $(gcloud auth print-access-token)
Ganti kode berikut:
- PROJECT_ID: project ID untuk project tempat langganan akan dibuat
- SUBSCRIPTION_ID: ID langganan yang akan dibuat
Untuk membuat langganan pull dengan filter, tentukan filter dalam isi permintaan:
{ "topic": "projects/PROJECT_ID/topics/TOPIC_ID", "filter": "FILTER" }
Ganti kode berikut:
- PROJECT_ID: project ID untuk project dengan topik
- TOPIC_ID: ID topik yang akan dilampirkan ke langganan
- FILTER: ekspresi dalam sintaksis pemfilteran
Untuk membuat langganan push dengan filter, tentukan endpoint push dan filter dalam isi permintaan:
{ "topic": "projects/PROJECT_ID/topics/TOPIC_ID", "pushConfig": { "pushEndpoint": "PUSH_ENDPOINT" }, "filter": "FILTER" }
Ganti kode berikut:
- PROJECT_ID: project ID untuk project dengan topik
- TOPIC_ID: ID topik yang akan dilampirkan ke langganan
- PUSH_ENDPOINT: URL server tempat subscriber push berjalan
- FILTER: ekspresi dalam sintaksis pemfilteran
C++
Sebelum mencoba contoh ini, ikuti petunjuk penyiapan C++ di Panduan Memulai: Menggunakan Library Klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi Pub/Sub C++ API.
C#
Sebelum mencoba contoh ini, ikuti petunjuk penyiapan C# di Panduan Memulai: Menggunakan Library Klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi Pub/Sub C# API.
Go
Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Go di Panduan Memulai: Menggunakan Library Klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi Pub/Sub Go API.
Java
Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Java di Panduan Memulai: Menggunakan Library Klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi Java API Pub/Sub.
Node.js
Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Node.js di Panduan Memulai: Menggunakan Library Klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Node.js Pub/Sub.
Node.js
Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Node.js di Panduan Memulai: Menggunakan Library Klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API Node.js Pub/Sub.
PHP
Sebelum mencoba contoh ini, ikuti petunjuk penyiapan PHP di Panduan Memulai: Menggunakan Library Klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi API PHP Pub/Sub.
Python
Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Python di Panduan Memulai: Menggunakan Library Klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi Pub/Sub Python API.
Ruby
Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Ruby di Panduan Memulai: Menggunakan Library Klien. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi Pub/Sub Ruby API.
Panjang maksimum filter adalah 256 byte. Filter adalah properti langganan yang tidak dapat diubah. Setelah membuat langganan, Anda tidak dapat memperbarui langganan untuk mengubah filter.
Pengaruh filter terhadap metrik backlog
Untuk memantau langganan yang baru saja Anda buat, lihat Memantau langganan dengan filter.
Jika Anda mengaktifkan pemfilteran, metrik backlog hanya akan menyertakan data dari pesan yang cocok dengan filter. Berikut adalah daftar metrik backlog:
subscription/backlog_bytes
subscription/unacked_bytes_by_region
subscription/num_undelivered_messages
subscription/num_unacked_messages_by_region
subscription/oldest_unacked_message_age
subscription/oldest_unacked_message_age_by_region
topic/unacked_bytes_by_region
topic/num_unacked_messages_by_region
topic/oldest_unacked_messages_age_by_region
Untuk mempelajari metrik ini lebih lanjut, lihat daftar metrik Pub/Sub.
Memperbarui filter untuk langganan
Anda tidak dapat memperbarui filter untuk langganan yang sudah ada. Sebagai gantinya, ikuti solusi ini.
Ambil snapshot langganan yang filternya ingin Anda ubah.
Untuk mengetahui lebih lanjut cara mengambil snapshot menggunakan konsol, lihat Membuat snapshot.
Buat langganan baru dengan filter baru.
Untuk mengetahui lebih lanjut cara membuat langganan dengan filter, lihat Membuat langganan dengan filter.
Di konsol Google Cloud, buka halaman Langganan Pub/Sub.
Klik langganan yang baru saja Anda buat.
Di halaman detail langganan, klik Putar ulang pesan.
Untuk Cari, klik Ke snapshot.
Pilih snapshot yang Anda buat untuk langganan asli di langkah 1, lalu klik Seek.
Anda tidak akan kehilangan pesan apa pun selama transisi.
Ubah pelanggan agar menggunakan langganan baru.
Setelah menyelesaikan prosedur ini, Anda dapat melanjutkan dan menghapus langganan asli.
Sintaksis untuk membuat filter
Untuk memfilter pesan, tulis ekspresi yang beroperasi pada atribut. Anda dapat
menulis ekspresi yang cocok dengan kunci atau nilai atribut. ID
attributes
memilih atribut dalam pesan.
Misalnya, filter dalam tabel berikut memilih atribut name
:
Filter | Deskripsi |
---|---|
attributes:name |
Pesan dengan atribut name |
NOT attributes:name |
Pesan tanpa atribut name |
attributes.name = "com" |
Pesan dengan atribut name dan nilai com |
attributes.name != "com" |
Pesan tanpa atribut name dan nilai com |
hasPrefix(attributes.name, "co") |
Pesan dengan atribut name dan nilai yang diawali dengan co |
NOT hasPrefix(attributes.name, "co") |
Pesan tanpa atribut name dan nilai yang dimulai dengan co |
Operator perbandingan untuk ekspresi filter
Anda dapat memfilter atribut dengan operator perbandingan berikut:
:
=
!=
Operator :
mencocokkan kunci dalam daftar atribut.
attributes:KEY
Operator persamaan mencocokkan kunci dan nilai. Nilai harus berupa literal string.
attributes.KEY = "VALUE"
Ekspresi dengan operator persamaan harus diawali dengan kunci, dan operator persamaan harus membandingkan kunci dan nilai.
Valid: Filter membandingkan kunci dan nilai
attributes.name = "com"
Tidak valid: Sisi kiri filter adalah nilai
"com" = attributes.name
Tidak valid: Filter membandingkan dua kunci
attributes.name = attributes.website
Kunci dan nilai peka huruf besar/kecil dan harus sama persis dengan atribut. Jika kunci berisi karakter selain tanda hubung, garis bawah, atau karakter alfanumerik, gunakan literal string.
attributes."iana.org/language_tag" = "en"
Untuk menggunakan garis miring terbalik, tanda petik, dan karakter non-cetak dalam filter, escape karakter dalam literal string. Anda juga dapat menggunakan urutan escape Unicode, heksadesimal, dan oktal dalam literal string.
Valid: Filter meng-escape karakter dalam literal string
attributes:"\u307F\u3093\u306A"
Tidak valid: Filter meng-escape karakter tanpa literal string
attributes:\u307F\u3093\u306A
Operator Boolean untuk ekspresi filter
Anda dapat menggunakan operator logika boolean AND
, NOT
, dan OR
dalam filter. Operator
harus dalam huruf besar. Misalnya, filter berikut adalah untuk pesan dengan atribut iana.org/language_tag
,
tetapi tanpa atribut name
dan nilai com
.
attributes:"iana.org/language_tag" AND NOT attributes.name = "com"
Operator NOT
memiliki prioritas tertinggi. Untuk menggabungkan operator AND
dan OR
, gunakan tanda kurung dan ekspresi lengkap.
Valid: Operator
AND
danOR
dengan tanda kurungattributes:"iana.org/language_tag" AND (attributes.name = "net" OR attributes.name = "org")
Tidak valid: Operator
AND
danOR
tanpa tanda kurungattributes:"iana.org/language_tag" AND attributes.name = "net" OR attributes.name = "org"
Tidak valid: Operator
AND
danOR
menggabungkan ekspresi yang tidak lengkapattributes.name = "com" AND ("net" OR "org")
Anda juga dapat menggunakan operator minus unary, bukan operator NOT
.
attributes.name = "com" AND -attributes:"iana.org/language_tag"
Fungsi untuk ekspresi filter
Anda dapat menggunakan fungsi hasPrefix
untuk memfilter atribut dengan nilai yang dimulai dengan substring. hasPrefix
adalah satu-satunya fungsi yang didukung dalam filter.
Meskipun pencocokan awalan didukung dengan fungsi hasPrefix
, ekspresi reguler
umum tidak didukung.
hasPrefix(attributes.KEY, "SUBSTRING")
Ganti kode berikut:
- KEY: nama atribut
- SUBSTRING: substring nilai