O ApsaraMQ for RocketMQ oferece três modos de transmissão para mensagens normais. Escolha o modo adequado conforme o nível de garantia de entrega exigido pela sua aplicação:
|
Modo |
Comportamento |
Mais indicado para |
|
Síncrono |
O produtor aguarda a confirmação do broker antes de enviar a próxima mensagem. |
Cenários que exigem confirmação de entrega |
|
Assíncrono |
O produtor envia a mensagem e continua imediatamente. Um callback retorna o resultado. |
Fluxos de trabalho sensíveis à latência |
|
Unidirecional |
O produtor envia a mensagem sem esperar resposta. |
Cenários de alto throughput em que perda ocasional de mensagens é aceitável |
Pré-requisitos
Antes de começar, verifique se você possui:
Instâncias, tópicos e grupos de consumidores criados no console do ApsaraMQ for RocketMQ
Um par de AccessKey para sua conta Alibaba Cloud
(Opcional) Configurações de log definidas
Configuração comum do produtor
Os três modos compartilham a mesma lógica de inicialização. Crie um produtor uma única vez e chame o método de envio específico do modo desejado.
import com.aliyun.openservices.ons.api.Message;
import com.aliyun.openservices.ons.api.Producer;
import com.aliyun.openservices.ons.api.SendResult;
import com.aliyun.openservices.ons.api.SendCallback;
import com.aliyun.openservices.ons.api.OnExceptionContext;
import com.aliyun.openservices.ons.api.ONSFactory;
import com.aliyun.openservices.ons.api.PropertyKeyConst;
import java.util.Date;
import java.util.Properties;
import java.util.concurrent.TimeUnit;
Properties properties = new Properties();
// Read credentials from environment variables.
properties.put(PropertyKeyConst.AccessKey, System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
properties.put(PropertyKeyConst.SecretKey, System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
// Send timeout in milliseconds.
properties.setProperty(PropertyKeyConst.SendMsgTimeoutMillis, "3000");
// TCP endpoint. Find this in the TCP Endpoint section of the Instance Details page
// in the ApsaraMQ for RocketMQ console.
properties.put(PropertyKeyConst.NAMESRV_ADDR, "<your-tcp-endpoint>");
Producer producer = ONSFactory.createProducer(properties);
// Call start() once before sending any messages.
producer.start();
Substitua o placeholder pelo valor real:
|
Placeholder |
Descrição |
Exemplo |
|
|
O endpoint TCP da sua instância |
|
Construção da mensagem
Toda chamada de envio requer um objeto Message. O construtor aceita três argumentos:
Message msg = new Message(
"TopicTestMQ", // Topic -- must be a normal-message topic
"TagA", // Tag -- used by consumers to filter messages
"Hello MQ".getBytes() // Body -- binary payload; producer and consumer must
// agree on the serialization format
);
// Optional: set a business key for message tracing in the console.
msg.setKey("ORDERID_100");
Um tópico usado para mensagens normais não pode ser utilizado para outros tipos de mensagem, como transacionais ou agendadas.
Transmissão síncrona
O produtor envia a mensagem e bloqueia a execução até receber uma resposta do broker. Se nenhuma exceção for lançada, a entrega foi bem-sucedida.

Quando usar: Cenários que exigem confirmação de entrega, como notificações por e-mail, alertas de cadastro ou mensagens promocionais.
Código de exemplo
for (int i = 0; i < 100; i++) {
Message msg = new Message("TopicTestMQ", "TagA", "Hello MQ".getBytes());
msg.setKey("ORDERID_" + i);
try {
SendResult sendResult = producer.send(msg);
// A non-null result means the broker accepted the message.
if (sendResult != null) {
System.out.println(new Date() + " Send mq message success. Topic is:"
+ msg.getTopic() + " msgId is: " + sendResult.getMessageId());
}
} catch (Exception e) {
// Handle failures: retry or persist the message for later delivery.
System.out.println(new Date() + " Send mq message failed. Topic is:" + msg.getTopic());
e.printStackTrace();
}
}
Transmissão assíncrona
O produtor envia a mensagem e retorna imediatamente. A resposta do broker chega por meio de um SendCallback com dois métodos: onSuccess e onException.

Quando usar: Fluxos sensíveis à latência em que a thread chamadora não pode ficar bloqueada — por exemplo, ao submeter um job de transcodificação de vídeo e tratar o resultado em um callback.
Código de exemplo
Message msg = new Message("TopicTestMQ", "TagA", "Hello MQ".getBytes());
msg.setKey("ORDERID_100");
producer.sendAsync(msg, new SendCallback() {
@Override
public void onSuccess(final SendResult sendResult) {
System.out.println("send message success. topic=" + sendResult.getTopic()
+ ", msgId=" + sendResult.getMessageId());
}
@Override
public void onException(OnExceptionContext context) {
// Handle failures: retry or persist the message for later delivery.
System.out.println("send message failed. topic=" + context.getTopic()
+ ", msgId=" + context.getMessageId());
}
});
// Block for 3 seconds to wait for the callback. In production, use a
// CountDownLatch or similar mechanism instead of Thread.sleep.
TimeUnit.SECONDS.sleep(3);
Transmissão unidirecional
O produtor dispara a mensagem e segue adiante. Nenhuma resposta é retornada e nenhum callback é acionado. Esse modo oferece o maior throughput possível, mas reduz a confiabilidade — uma mensagem pode ser enviada em microssegundos.

Quando usar: Cenários de alto volume em que perda ocasional de mensagens é aceitável, como coleta de logs ou relatório de métricas.
No modo unidirecional, o broker não envia resposta, portanto mensagens com falha são perdidas silenciosamente. Se a perda de dados não for aceitável, utilize a transmissão síncrona ou assíncrona.
Código de exemplo
for (int i = 0; i < 100; i++) {
Message msg = new Message("TopicTestMQ", "TagA", "Hello MQ".getBytes());
msg.setKey("ORDERID_" + i);
// No return value, no callback. Fire and forget.
producer.sendOneway(msg);
}
Encerramento do produtor
Encerre o produtor antes que sua aplicação finalize para liberar recursos.
producer.shutdown();
O encerramento do produtor libera memória. Se sua aplicação envia mensagens com frequência, mantenha o produtor ativo em vez de criá-lo e destruí-lo a cada requisição.
Comparação entre os modos de transmissão
Os três modos diferem quanto à espera pela resposta do broker e ao equilíbrio entre throughput e confiabilidade.
|
Modo |
Método de envio |
TPS |
Resposta do broker |
Confiabilidade |
Caso de uso típico |
|
Síncrono |
|
Alto |
Sim — o produtor bloqueia até o broker confirmar a mensagem |
Sem perda de mensagens |
Notificações, confirmações de pedido |
|
Assíncrono |
|
Alto |
Sim — entregue via |
Sem perda de mensagens |
Transcodificação de vídeo, fluxos assíncronos |
|
Unidirecional |
|
Mais alto |
Não — o broker não responde, então o produtor não detecta falhas |
Possível perda de mensagens |
Coleta de logs, métricas |
Próximos passos
Assinar mensagens — consuma as mensagens normais enviadas