ApsaraMQ for MQTT oferece dois métodos para obter o status online de seus clientes: consulta síncrona e notificação assíncrona de eventos de online e offline. Este tópico descreve os princípios básicos, cenários de aplicação, diferenças e métodos de implementação para essas duas abordagens.
Princípios básicos
O servidor do ApsaraMQ for MQTT oferece os seguintes métodos para obter o status online dos clientes:
-
Consulta síncrona
Este método é simples. Chame uma operação da openapi por HTTP ou HTTPS por meio de um endpoint aberto para consultar o status atual em tempo real de um cliente específico. Use este método para verificar o status de um ou mais clientes.
-
Notificação assíncrona de eventos de online e offline
Este método utiliza notificações de mensagens. Quando um cliente fica online ou offline, o servidor MQTT pode enviar mensagens de evento diretamente para uma aplicação na cloud implantada em um servidor da Alibaba Cloud.
Esta abordagem permite detectar alterações no status de um cliente de forma assíncrona. Ela detecta os eventos de online e offline, e não o status online em si. Portanto, a aplicação na cloud deve analisar a série temporal desses eventos para determinar o status atual do cliente.
Cenários
Os dois métodos para obter o status online dos clientes do ApsaraMQ for MQTT são adequados para os seguintes cenários:
-
Consulta síncrona
Indicado quando é necessário determinar a lógica subsequente no fluxo principal de negócios com base no status online de um cliente.
Útil para verificar se um cliente específico está online como parte de um procedimento de Operação e Manutenção (O&M).
-
Notificação assíncrona de eventos de online e offline
Recomendado quando a aplicação do lado do servidor precisa acionar ações predefinidas ao detectar que um cliente ficou online ou offline.
Adequado para analisar os dados de online e offline dos clientes e enviar mensagens com base nesses status.
Diferenças entre consulta síncrona e notificação assíncrona de eventos
As diferenças entre os dois métodos de consulta são:
A consulta síncrona recupera o status atual e em tempo real de um cliente. Na teoria, este método é mais preciso do que a notificação assíncrona.
A notificação assíncrona de online e offline utiliza o desacoplamento de mensagens. Isso torna a determinação do status mais complexa e aumenta a chance de imprecisão. No entanto, este método permite analisar o histórico de status de vários clientes com base em eventos. Apesar da complexidade e da possível imprecisão, a notificação assíncrona é mais adequada para coletar estatísticas de status de muitos clientes.
Métodos de implementação
-
Consulta síncrona
Obtenha o status do cliente chamando as seguintes operações de API:
-
Notificação assíncrona de eventos de online e offline
Para a notificação assíncrona de eventos de online e offline, seu service na cloud pode obter mensagens de online e offline do cliente usando o kit de desenvolvimento de software (SDK) do lado do servidor fornecido pelo ApsaraMQ for MQTT. Para baixar os SDKs, consulte Version Guide.
O código de exemplo a seguir mostra como recuperar eventos de online e offline do cliente:
NotaAntes de usar o código de exemplo, configure as variáveis de ambiente para suas credenciais de acesso. Para mais informações sobre como configurar variáveis de ambiente, consulte Configure access credentials.
As variáveis de ambiente para o AccessKey ID e o AccessKey secret do ApsaraMQ for MQTT são MQTT_AK_ENV e MQTT_SK_ENV.
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 { /** * The endpoint of the ApsaraMQ for MQTT instance that you created. * To get the endpoint for the server-side SDK, contact technical support. DingTalk group number: 116015007918. * You must use the assigned domain name for the endpoint address. Do not connect directly using an IP address. Otherwise, server-side exceptions may occur. */ String domain = "domain"; /** * The protocol and port must match. The value of this parameter is fixed at 5672. */ int port = 5672; /** * The ID of the ApsaraMQ for MQTT instance that you created. */ String instanceId = "instanceId"; /** * The AccessKey ID for Alibaba Cloud identity verification. Create it in the Resource Access Management (RAM) console. * An Alibaba Cloud account AccessKey has access permissions for all API operations. We recommend that you use a RAM user for API access or daily O&M. * We strongly recommend that you do not save your AccessKey ID and AccessKey secret in your project code. This can lead to an AccessKey leak, which threatens the security of all resources in your account. * This example shows how to save the AccessKey and AccessKey secret in environment variables. */ String accessKey = System.getenv("MQTT_AK_ENV"); /** * The AccessKey secret for Alibaba Cloud identity verification. Create it in the RAM console. You only need to set this in signature authentication mode. */ String secretKey = System.getenv("MQTT_SK_ENV"); /** * The ID of the group that you created in the ApsaraMQ for MQTT console. * */ 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)); } }); } }
Mais informações
Data flow for online and offline events of ApsaraMQ for MQTT clients