ApsaraMQ for MQTT mengekspor event koneksi dan pemutusan klien ke layanan Alibaba Cloud downstream melalui aturan yang dapat dikonfigurasi. Aplikasi backend mengonsumsi event tersebut untuk melacak status koneksi, memicu alur kerja otomatis, atau menganalisis pola konektivitas.
Notifikasi event status bersifat asinkron dan tidak mencerminkan status klien secara real-time. Untuk mengkueri status terkini suatu klien secara real-time, lihat Dapatkan status client ApsaraMQ for MQTT.
Cara kerja
Ketika klien ApsaraMQ for MQTT terhubung atau terputus, broker mendorong notifikasi status ke layanan Alibaba Cloud downstream berdasarkan aturan yang Anda konfigurasikan. Aplikasi backend yang diterapkan pada instans Elastic Compute Service (ECS) berlangganan notifikasi ini untuk mendeteksi transisi online dan offline klien.

Karena proses ini bersifat asinkron, satu notifikasi saja tidak menunjukkan apakah klien saat ini sedang online. Untuk menentukan status sebenarnya, analisis garis waktu notifikasi event untuk klien tersebut. Untuk detailnya, lihat Tentukan status client dari event.
Kasus penggunaan
Ekspor event status memicu aksi backend ketika klien MQTT terhubung atau terputus. Alur kerja khas untuk analisis aktivitas koneksi:
Status koneksi klien berubah beberapa kali.
Broker membungkus setiap perubahan menjadi notifikasi berdasarkan aturan yang dikonfigurasi.
Notifikasi dikirimkan ke topik ApsaraMQ for RocketMQ.
Aplikasi backend mengonsumsi notifikasi dan membangun riwayat koneksi untuk klien tersebut.
Batasan
| Item | Batas | Deskripsi |
|---|---|---|
| Aturan per instans | 100 | Untuk meminta batas yang lebih tinggi, bergabunglah dengan grup DingTalk 116015007918 untuk menghubungi dukungan teknis ApsaraMQ for MQTT. |
| Deduplikasi aturan | Satu aturan tiap jenis per resource internal | Misalnya, setiap group mendukung satu aturan notifikasi status client, dan setiap topik ApsaraMQ for MQTT mendukung satu aturan data inbound dan satu aturan data outbound. |
| Aturan cross-region | Tidak didukung | Sumber data dan tujuan data harus berada di wilayah yang sama. |
| Versi instans ApsaraMQ for MQTT | Hanya Kernel V3.x.x | Periksa versi kernel di daftar instans atau pada halaman Detail Instans di Konsol ApsaraMQ for MQTT. |
| Versi instans ApsaraMQ for RocketMQ | Hanya ApsaraMQ for RocketMQ 4.0 | Berlaku untuk aturan data inbound dan data outbound antara ApsaraMQ for MQTT dan ApsaraMQ for RocketMQ. |
Pemetaan resource
Notifikasi status untuk semua klien dalam group ApsaraMQ for MQTT yang sama diteruskan ke resource downstream yang sama.
| Resource ApsaraMQ for MQTT | Layanan Alibaba Cloud | Resource downstream | Definisi paket |
|---|---|---|---|
| Group | ApsaraMQ for RocketMQ | Topik | Pemetaan struktur pesan antara ApsaraMQ for MQTT dan ApsaraMQ for RocketMQ |
Siapkan ekspor event status
Langkah-langkah berikut menggunakan ApsaraMQ for RocketMQ sebagai layanan downstream.
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Instans ApsaraMQ for MQTT dengan versi kernel V3.x.x
Instans ApsaraMQ for RocketMQ 4.0 di wilayah yang sama
Setidaknya satu group yang dikonfigurasi pada instans ApsaraMQ for MQTT
Langkah 1: Buat aturan notifikasi status client
Di Konsol ApsaraMQ for MQTT, buat aturan dan pilih group-group yang event status client-nya ingin diekspor. Untuk langkah-langkah detail, lihat Buat aturan untuk notifikasi status client.
Langkah 2: Berlangganan notifikasi status di aplikasi backend Anda
Setelah aturan berlaku, event status dikirimkan ke topik ApsaraMQ for RocketMQ yang dikonfigurasi. Berlangganan topik tersebut di aplikasi backend Anda untuk menerima event tersebut. Untuk detail langganan, lihat Berlangganan pesan.
Jenis event
Setiap notifikasi status dikirimkan sebagai pesan ApsaraMQ for RocketMQ. Jenis event ditentukan dalam tag pesan.
Format tag: connect, disconnect, atau tcpclean
| Tag | Makna | Kondisi pemicu |
|---|---|---|
connect | Client terhubung | Client membuat koneksi dengan broker. |
disconnect | Client mengirim paket DISCONNECT | Client mengirim paket DISCONNECT sebelum menutup koneksi TCP, sesuai protokol MQTT. Jika SDK client tidak mengirim paket ini, broker tidak menghasilkan event disconnect. |
tcpclean | Koneksi TCP ditutup | Koneksi TCP ditutup, terlepas dari apakah client mengirim paket DISCONNECT atau tidak. |
Untuk menentukan apakah klien sedang offline, periksa tag tcpclean, bukan disconnect. Klien yang keluar secara tak terduga mungkin tidak mengirim paket DISCONNECT, sehingga event disconnect mungkin tidak pernah muncul.
Format data event
Isi pesan berupa objek JSON dengan bidang-bidang berikut:
| Bidang | Tipe | Deskripsi |
|---|---|---|
clientId | String | ID client ApsaraMQ for MQTT. Format: GID_XXX@@@YYYYY. |
time | Long | Timestamp saat event terjadi. |
eventType | String | Jenis event: connect, disconnect, atau tcpclean. |
channelId | String | Pengidentifikasi unik koneksi TCP. |
clientIp | String | Alamat IP publik dan port client MQTT. |
Contoh:
clientId: GID_XXX@@@YYYYY
time:1212121212
eventType:connect/disconnect/tcpclean
channelId:2b9b1281046046faafe5e0b458e4XXXX
clientIp:192.168.XX.XX:133XXTentukan status client dari event
Karena notifikasi bersifat asinkron, Anda tidak dapat menentukan apakah klien sedang online hanya dari satu event. Lacak garis waktu lengkap event untuk setiap clientId dan terapkan aturan berikut:
Gunakan timestamp untuk pengurutan. Nilai
timeyang lebih besar berarti event yang lebih baru. Bandingkan timestamp hanya di antara event yang memilikiclientIdyang sama.Batasi cakupan event offline berdasarkan
channelId. SetiapchannelIdmerepresentasikan satu koneksi TCP dengan tepat satu eventconnectdan satu event penutupan (tcpclean). Eventtcpcleanhanya membatalkan koneksi padachannelIdyang sama — tidak memengaruhi koneksi padachannelIdyang berbeda.Handle rekoneksi sementara. Klien mungkin terputus dan terhubung kembali beberapa kali, menghasilkan beberapa nilai
channelId. Saat menerima eventtcpclean, verifikasi bahwachannelId-nya cocok dengan koneksi yang sedang Anda lacak sebelum menandai klien sebagai offline.
Contoh skenario:
Klien terhubung, terputus sebentar, lalu terhubung kembali:
| Pesanan | Event | channelId | Status client |
|---|---|---|---|
| 1 | connect | aaa111 | Online (koneksi aaa111 aktif) |
| 2 | tcpclean | aaa111 | Offline (koneksi aaa111 ditutup) |
| 3 | connect | bbb222 | Online (koneksi bbb222 aktif) |
Jika Anda menerima tcpclean untuk aaa111 setelah connect untuk bbb222, klien tetap online karena bbb222 belum memiliki tcpclean yang sesuai.
Logika pengambilan keputusan:
Untuk clientId tertentu:
1. Pertahankan peta channelId -> event.
2. Saat menerima event "connect":
- Simpan event tersebut di bawah channelId-nya.
3. Saat menerima event "tcpclean":
- Simpan event tersebut di bawah channelId-nya.
- Jika channelId tersebut memiliki event "connect" dan "tcpclean",
koneksi tersebut ditutup. Hapus channelId dari peta.
4. Periksa apakah client sedang online:
- Jika ada channelId dalam peta yang memiliki event "connect" tetapi tidak
memiliki event "tcpclean", client sedang online.
- Jika semua channelId telah dihapus (atau memiliki kedua event),
client sedang offline.