ApsaraMQ for RocketMQ admite tres modos de transmisión para mensajes normales. Elija un modo según el nivel de garantía de entrega que requiera su aplicación:
|
Modo |
Comportamiento |
Recomendado para |
|
Síncrono |
El productor espera la confirmación del broker antes de enviar el siguiente mensaje. |
Escenarios que requieren confirmación de entrega |
|
Asíncrono |
El productor envía un mensaje y continúa inmediatamente. Un callback devuelve el resultado. |
Flujos de trabajo sensibles a la latencia |
|
Unidireccional |
El productor envía un mensaje sin esperar ninguna respuesta. |
Escenarios de alto throughput donde es aceptable la pérdida ocasional de mensajes |
Requisitos previos
Antes de empezar, asegúrese de contar con lo siguiente:
Instancias, topics y grupos de consumidores creados en la consola de ApsaraMQ for RocketMQ
Un par de AccessKey para su cuenta de Alibaba Cloud
(Opcional) Configuración de registros establecida
Configuración común del productor
Los tres modos comparten la misma lógica de inicialización. Cree un productor una sola vez y luego invoque el método de envío correspondiente al modo deseado.
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();
Reemplace el marcador de posición con su valor real:
|
Marcador de posición |
Descripción |
Ejemplo |
|
|
El endpoint TCP de su instancia |
|
Construcción de un mensaje
Cada llamada de envío requiere un objeto Message. El constructor acepta tres 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");
Un topic utilizado para mensajes normales no puede usarse para otros tipos de mensajes, como los transaccionales o programados.
Transmisión síncrona
El productor envía un mensaje y se bloquea hasta que el broker devuelve una respuesta. Si no se lanza ninguna excepción, el mensaje se entregó correctamente.

Cuándo usarla: Escenarios que requieren confirmación de entrega, como notificaciones por correo electrónico, alertas de registro o mensajes promocionales.
Código de ejemplo
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();
}
}
Transmisión asíncrona
El productor envía un mensaje y retorna de inmediato. La respuesta del broker se entrega mediante un SendCallback con dos métodos: onSuccess y onException.

Cuándo usarla: Flujos de trabajo sensibles a la latencia donde el hilo invocador no puede bloquearse; por ejemplo, al enviar un trabajo de transcodificación de video y gestionar el resultado en un callback.
Código de ejemplo
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);
Transmisión unidireccional
El productor envía un mensaje y continúa su ejecución. No se devuelve ninguna respuesta ni se activa ningún callback. Este modo ofrece el mayor throughput a costa de la fiabilidad, ya que un mensaje puede enviarse en microsegundos.

Cuándo usarla: Escenarios de alto volumen donde es aceptable la pérdida ocasional de mensajes, como la recolección de registros o el reporte de métricas.
El broker no envía respuesta en el modo unidireccional, por lo que los mensajes fallidos se pierden silenciosamente. Si la pérdida de datos no es aceptable, utilice la transmisión síncrona o asíncrona en su lugar.
Código de ejemplo
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);
}
Cierre del productor
Cierre el productor antes de que su aplicación finalice para liberar recursos.
producer.shutdown();
Cerrar el productor libera memoria. Si su aplicación envía mensajes con frecuencia, mantenga el productor en ejecución en lugar de crearlo y destruirlo por cada solicitud.
Comparación de los modos de transmisión
Los tres modos difieren en si el productor espera una respuesta del broker y en el equilibrio entre throughput y fiabilidad.
|
Modo |
Método de envío |
TPS |
Respuesta del broker |
Fiabilidad |
Caso de uso típico |
|
Síncrono |
|
Alto |
Sí: el productor se bloquea hasta que el broker confirma el mensaje |
Sin pérdida de mensajes |
Notificaciones, confirmaciones de pedidos |
|
Asíncrono |
|
Alto |
Sí: se entrega mediante |
Sin pérdida de mensajes |
Transcodificación de video, flujos de trabajo asíncronos |
|
Unidireccional |
|
Máximo |
No: el broker no responde, por lo que el productor no puede detectar fallos |
Posible pérdida de mensajes |
Recolección de registros, métricas |
Pasos siguientes
Subscribe to messages: consuma los mensajes normales que envió