Mensaje simple RocketMQ (sincronización confiable, transmisión asíncrona confiable y unidireccional)

        Este artículo utilizará RocketMQ para enviar mensajes de tres maneras: sincronización confiable, transmisión asíncrona confiable y unidireccional. E introduzca la diferencia entre el modo de equilibrio de carga y el modo de transmisión:

(1) Enviar mensajes sincrónicamente:

            Utilice una transmisión síncrona confiable en una amplia gama de escenarios, como mensajes de notificación importantes, notificaciones por SMS y sistemas de marketing por SMS.

 Código de productor:

/**
 * 发送同步消息
 * 这种可靠性同步地发送方式使用的比较广泛,比如:重要的消息通知,短信通知。
 */
public class SyncProducer {

    public static void main(String[] args) throws MQClientException, RemotingException, InterruptedException, MQBrokerException {
        //1.创建消息生产者producer,并指定生产者组名
        DefaultMQProducer defaultMQProducer = new DefaultMQProducer("group1");
        //2.指定NameServer地址
        defaultMQProducer.setNamesrvAddr("192.168.160.131:9876");
        //3.启动producer
        defaultMQProducer.start();
        //4.创建消息对象,指定主题topic、tag和消息体
        for (int i = 0; i < 5; i++) {
            /*
             * 参数一:消息主题Topic
             * 参数二:消息tag
             * 参数三:消息内容
             */
            Message message = new Message("base", "tag1", ("hello world" + i).getBytes());
            //5.发送消息
            SendResult result = defaultMQProducer.send(message);
            System.out.println("result:"+result);
            //睡眠1秒
            TimeUnit.SECONDS.sleep(1);
        }
        //6.关闭生产者producer
        defaultMQProducer.shutdown();

    }

}

(2) Enviar mensajes de forma asincrónica

       La transmisión asincrónica generalmente se usa en escenarios comerciales urgentes.

Código de productor:

/**
 * 发送异步消息
 * 异步消息通常用在对响应时间敏感的业务场景,即发送端不能容忍长时间地等待Broker的响应。
 */
@Slf4j
public class AsyncProducer {

    public static void main(String[] args) throws MQClientException, RemotingException, InterruptedException {
        //1.创建消息生产者producer,并指定生产者组名
        DefaultMQProducer defaultMQProducer = new DefaultMQProducer("group1");
        //2.指定NameServer地址
        defaultMQProducer.setNamesrvAddr("192.168.160.131:9876");
        //3.启动producer
        defaultMQProducer.start();
        for (int i = 0; i < 10; i++) {
            //4.创建消息对象,指定主题topic、tag和消息体
            /*
             * 参数一:消息主题Topic
             * 参数二:消息tag
             * 参数三:消息内容
             */
            Message message = new Message("base", "tag2", ("hello world" + i).getBytes());
            //5.发送异步消息
            defaultMQProducer.send(message, new SendCallback() {
                //发送成功回调
                @Override
                public void onSuccess(SendResult sendResult) {
                    log.debug("sendResult:{}", sendResult);
                }

                //发送失败回调
                @Override
                public void onException(Throwable throwable) {
                    log.error("throwable:",throwable);
                }
            });
            TimeUnit.SECONDS.sleep(1);
        }
        //6.关闭生产者producer
        defaultMQProducer.shutdown();
    }
}

(3) Enviar mensajes en modo unidireccional

         La transmisión unidireccional se utiliza en situaciones que requieren una fiabilidad media, como la recopilación de registros.

Código de productor:

/**
 * 单向发送
 * 这种方式主要用在不特别关心发送结果的场景,例如日志发送
 * @author 13871
 */
@Slf4j
public class OneWayProducer {
    public static void main(String[] args) throws MQClientException, RemotingException, InterruptedException {
        DefaultMQProducer defaultMQProducer = new DefaultMQProducer("group1");

        defaultMQProducer.setNamesrvAddr("192.168.160.131:9876");

        defaultMQProducer.start();

        for (int i = 0; i < 10; i++) {
            Message message = new Message("base", "tag3", ("单向消息" + i).getBytes());
            defaultMQProducer.sendOneway(message);
          //  TimeUnit.SECONDS.sleep(1);
        }
        defaultMQProducer.shutdown();
    }
}

Código del consumidor: (para consumo de los tres productores anteriores)

/**
 * 消费者
 */
@Slf4j
public class consumer {
    public static void main(String[] args) throws MQClientException {
        //1.创建消费者Consumer,指定组名
        DefaultMQPushConsumer defaultMQPushConsumer = new DefaultMQPushConsumer("group1");
        //2.指定NameServer地址
        defaultMQPushConsumer.setNamesrvAddr("192.168.160.131:9876");
        //3.订阅主题topic和tag
        defaultMQPushConsumer.subscribe("base", "*");
        //消费者默认是负载均衡,设置成广播模式
        //defaultMQPushConsumer.setMessageModel(MessageModel.BROADCASTING);

        //4.设置回调函数,处理消息
        defaultMQPushConsumer.registerMessageListener(new MessageListenerConcurrently() {
            //指定消息内容
            @Override
            public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> list, ConsumeConcurrentlyContext consumeConcurrentlyContext) {
                for (MessageExt msg:list) {
                    System.out.println("msg:"+new String(msg.getBody()));
                }
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
        });
        //5.启动consumer
        defaultMQPushConsumer.start();
    }
}

ps: el consumidor usa de manera predeterminada el equilibrio de carga, que se puede configurar en modo de transmisión;

Si el consumidor tiene una carga equilibrada:

consumidor1: lado del consumidor

msg:hello world0
msg:hello world3
msg:hello world4

 consumidor2: lado del consumidor

msg:hello world1
msg:hello world2

Es decir, si se utiliza el modo de equilibrio de carga predeterminado, un productor envía 5 mensajes y los dos consumidores consumen, lo cual es compartido por los dos. A su vez, uno consume 3 y uno consume 2.

Modo de transmisión:

           Debido a que el modo de difusión requiere que se entregue un mensaje a todas las instancias del consumidor bajo un grupo de consumidores, no hay argumento de que el mensaje sea compartido. En la implementación, una de las diferencias es que cuando los consumidores asignan colas, todos los consumidores se dividen en todas las colas.

Tome el código de productor que envía mensajes sincrónicamente como ejemplo, inicie el lado del productor, luego inicie los dos lados del consumidor y vea la consola:

 Lado del productor, consola: (enviar 5 mensajes)

result:SendResult [sendStatus=SEND_OK, msgId=24098A1E7A3ECE402C3D4AADC1A10079000018B4AAC2469D7E3D0000, offsetMsgId=C0A8A08300002A9F0000000000019EE5, messageQueue=MessageQueue [topic=base, brokerName=localhost.localdomain, queueId=0], queueOffset=19]
result:SendResult [sendStatus=SEND_OK, msgId=24098A1E7A3ECE402C3D4AADC1A10079000018B4AAC2469D82350001, offsetMsgId=C0A8A08300002A9F0000000000019FBD, messageQueue=MessageQueue [topic=base, brokerName=localhost.localdomain, queueId=1], queueOffset=20]
result:SendResult [sendStatus=SEND_OK, msgId=24098A1E7A3ECE402C3D4AADC1A10079000018B4AAC2469D862D0002, offsetMsgId=C0A8A08300002A9F000000000001A095, messageQueue=MessageQueue [topic=base, brokerName=localhost.localdomain, queueId=2], queueOffset=31]
result:SendResult [sendStatus=SEND_OK, msgId=24098A1E7A3ECE402C3D4AADC1A10079000018B4AAC2469D8A190003, offsetMsgId=C0A8A08300002A9F000000000001A16D, messageQueue=MessageQueue [topic=base, brokerName=localhost.localdomain, queueId=3], queueOffset=30]
result:SendResult [sendStatus=SEND_OK, msgId=24098A1E7A3ECE402C3D4AADC1A10079000018B4AAC2469D8E040004, offsetMsgId=C0A8A08300002A9F000000000001A245, messageQueue=MessageQueue [topic=base, brokerName=localhost.localdomain, queueId=0], queueOffset=20]
17:05:31.676 [NettyClientSelector_1] INFO RocketmqRemoting - closeChannel: close the connection to remote address[192.168.160.131:10911] result: true
17:05:31.684 [NettyClientSelector_1] INFO RocketmqRemoting - closeChannel: close the connection to remote address[192.168.160.131:9876] result: true

 Consumidor, consola: (dos consumidores, consumirán el mismo mensaje, ambos son 5)

msg:hello world0
msg:hello world1
msg:hello world2
msg:hello world3
msg:hello world4

 

186 artículos originales publicados · elogiados 146 · 490,000 visitas

Supongo que te gusta

Origin blog.csdn.net/qq_37495786/article/details/105515701
Recomendado
Clasificación