ApsaraMQ for MQTT memungkinkan Anda melakukan kueri sinkron atau berlangganan notifikasi status asinkron untuk mendapatkan status klien. Topik ini menjelaskan mekanisme kerja, skenario, dan metode implementasi dari kedua pendekatan tersebut, serta perbedaan di antara keduanya.
Mekanisme kerja
Broker ApsaraMQ for MQTT menyediakan dua metode untuk mendapatkan status klien:
Kueri Sinkron
Metode ini relatif sederhana. Anda dapat mengirimkan permintaan HTTP atau HTTPS melalui titik akhir publik untuk memanggil API guna menanyakan status satu atau beberapa klien secara langsung.
Notifikasi Status Asinkron
Metode ini berbasis notifikasi. Ketika klien ApsaraMQ for MQTT online atau offline, broker akan mengirimkan notifikasi perubahan status ke aplikasi layanan backend yang berada di server Alibaba Cloud.
Proses ini bersifat asinkron dan tidak memberikan informasi secara real-time. Aplikasi hanya dapat menentukan status aktual klien berdasarkan garis waktu notifikasi peristiwa.
Skenario
Kedua metode ini cocok untuk skenario berikut:
Kueri Sinkron
Logika operasi selanjutnya bergantung pada apakah klien tertentu sedang online selama proses layanan utama.
Insinyur O&M perlu menentukan apakah klien tertentu sedang online.
Notifikasi Status Asinkron
Broker harus memicu tindakan tertentu ketika klien tertentu online atau offline.
Broker harus mengumpulkan dan menganalisis data perubahan status klien, serta mengirimkan notifikasi berdasarkan peristiwa tersebut.
Perbedaan antara kueri sinkron dan notifikasi status asinkron
Berikut adalah perbedaan utama antara kedua metode:
Kueri sinkron memungkinkan Anda menanyakan status real-time klien tertentu. Secara teori, metode ini lebih akurat dibandingkan dengan notifikasi status asinkron.
Notifikasi status asinkron lebih kompleks dan kurang akurat dalam menentukan status aktual klien karena adanya pemisahan pesan. Namun, metode ini cocok untuk menganalisis jejak status beberapa klien sekaligus dan mengumpulkan statistik tentang status sejumlah besar klien.
Metode implementasi
Kueri Sinkron
Anda dapat memanggil operasi berikut untuk menanyakan status satu atau beberapa klien:
Notifikasi Status Asinkron
Anda dapat menggunakan cloud SDK yang disediakan oleh ApsaraMQ for MQTT untuk mendapatkan notifikasi status klien. Untuk informasi lebih lanjut tentang cara mengunduh cloud SDK, lihat Catatan Rilis.
Contoh kode berikut menunjukkan cara mendapatkan notifikasi status klien:
package com.aliyun.openservices.lmq.example; import com.alibaba.fastjson.JSONObject; import com.alibaba.mqtt.server.ServerConsumer; import com.alibaba.mqtt.server.callback.StatusListener; import com.alibaba.mqtt.server.config.ChannelConfig; import com.alibaba.mqtt.server.config.ConsumerConfig; import com.alibaba.mqtt.server.model.StatusNotice; public class MQTTClientStatusNoticeProcessDemo { public static void main(String[] args) throws Exception { /** * Titik akhir dari instance Antrian Pesan untuk MQTT yang Anda buat. * Untuk mendapatkan titik akhir yang digunakan untuk mengakses instance dengan menggunakan cloud SDK, hubungi dukungan teknis. * Gunakan nama domain alih-alih alamat IP sebagai titik akhir. Jika tidak, pengecualian broker mungkin terjadi. */ String domain = "domain"; /** * Port yang digunakan oleh cloud SDK. Protokol dan port yang digunakan oleh cloud SDK harus sesuai. Atur nilainya menjadi 5672. */ int port = 5672; /** * ID dari instance Antrian Pesan untuk MQTT yang Anda buat. */ String instanceId = "instanceId"; /** * ID AccessKey yang Anda buat di konsol RAM Alibaba Cloud untuk otentikasi identitas. Untuk informasi tentang cara mendapatkan ID AccessKey, lihat Memperoleh pasangan AccessKey. */ String accessKey = "accessKey"; /** * Rahasia AccessKey yang Anda buat di konsol RAM Alibaba Cloud untuk otentikasi identitas. Rahasia AccessKey hanya diperlukan saat mode otentikasi tanda tangan digunakan. Untuk informasi tentang cara mendapatkan rahasia AccessKey, lihat Memperoleh pasangan AccessKey. */ String secretKey = "secretKey"; /** * ID grup yang Anda buat di konsol Antrian Pesan untuk MQTT. * */ String mqttGroupId = "mqttGroupId"; ChannelConfig channelConfig = new ChannelConfig(); channelConfig.setDomain(domain); channelConfig.setPort(port); channelConfig.setInstanceId(instanceId); channelConfig.setAccessKey(accessKey); channelConfig.setSecretKey(secretKey); ServerConsumer serverConsumer = new ServerConsumer(channelConfig, new ConsumerConfig()); serverConsumer.start(); serverConsumer.subscribeStatus(mqttGroupId, new StatusListener() { @Override public void process(StatusNotice statusNotice) { System.out.println(JSONObject.toJSONString(statusNotice)); } }); } }