架构师-RocketMQ(二)

RocketMQ对比RabbitMQ和Kafka,具有事务消息、18级延迟消息等优势。它支持NormalProducer、OrderProducer等消息模式,确保消息顺序性和可靠性。消息发送后,通过ConsumeQueue和CommitLog存储,实现高可用和负载均衡。RocketMQ的事务设计包括TransactionProducer和回查机制,保证分布式事务的最终一致性。
摘要由CSDN通过智能技术生成

RocketMQ特性

  • 削峰填谷(主要解决瞬时写压力大于应用服务能力导致消息丢失、系统奔溃等问题)
  • 系统解耦(解决不同重要程度、不同能力级别系统之间依赖导致一死全死)
  • 提升性能(当存在一对多调用时,可以发一条消息给消息系统,让消息系统通知相关系统)
  • 蓄流压测(线上有些链路不好压测,可以通过堆积一定量消息再放开来压测)

目前主流的MQ主要是Rocketmq、kafka、Rabbitmq,Rocketmq相比于Rabbitmq、kafka具有主要优势特性有:
• 支持事务型消息(消息发送和DB操作保持两方的最终一致性,rabbitmq和kafka不支持)
• 支持结合rocketmq的多个系统之间数据最终一致性(多方事务,二方事务是前提)
• 支持18个级别的延迟消息(rabbitmq和kafka不支持)
• 支持指定次数和时间间隔的失败消息重发(kafka不支持,rabbitmq需要手动确认)
• 支持consumer端tag过滤,减少不必要的网络传输(rabbitmq和kafka不支持)
• 支持重复消费(rabbitmq不支持,kafka支持)

消息队列: 应用解耦(异构),流量消峰,消息分发,保证最终一致性(分布式事务),方便动态扩容等

RocketMQ消息支持的模式

NormalProducer(普通)

  • 消息同步发送
    普通消息的发送和接收在前面已经演示过了,在上面的案例中是基于同步消息发送模式。也就是说消息
    发送出去后,producer会等到broker回应后才能继续发送下一个消息

在这里插入图片描述

   SendResult sendResult =  producer.send(message); // 同步发送 会阻塞直到消息发送成功或失败
   System.out.printf("%s%n",sendResult);
  • 消息异步发送
    异步发送是指发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。 MQ 的异步
    发送,需要用户实现异步发送回调接口(SendCallback)。消息发送方在发送了一条消息后,不需要等
    待服务器响应即可返回,进行第二条消息发送。发送方通过回调接口接收服务器响应,并对响应结果进
    行处理
   producer.send(message, new SendCallback() {
   
                @Override
                public void onSuccess(SendResult sendResult) {
   
                    System.out.println("%s%n",sendResult);
                }

                @Override
                public void onException(Throwable e) {
   
                    e.printStackTrace();
                }
            });
  • OneWay
    单向(Oneway)发送特点为发送方只负责发送消息,不等待服务器回应且没有回调函数触发,即只发
    送请求不等待应答.效率最高
    在这里插入图片描述
  producer.sendOneway(message);
  • OrderProducer(顺序)

类似于kafka的机制,消息可以通过自定义分区策略来进行消息的顺序发送,实现原理就
是把同一类消息都发送到相同的分区上。

在RocketMQ中,是基于多个Message Queue来实现类似于kafka的分区效果。如果一个Topic 要发送
和接收的数据量非常大, 需要能支持增加并行处理的机器来提高处理速度,这时候一个Topic 可以根据
需求设置一个或多个Message Queue。Topic 有了多个Message Queue 后,消息可以并行地向各个
Message Queue 发送,消费者也可以并行地从多个Message Queue 读取消息并消费。

要实现消息的顺序性,消息只发送一个消息队列上,需要生产者和消费者都保证顺序性 ,生产者通过MessageQueueSelector选择一个队列上发送,消费者通过MessageListenerOrderly实现顺序性消费

  // 生产者
   producer.send(message, new MessageQueueSelector() {
   
                @Override
                public MessageQueue select(List<MessageQueue> list, Message message, Object o) {
   
                    return list.get(0); // 路由策略 直选一个messagequeue
                }
            },"key-"+num);
// 消费者
 consumer.registerMessageListener((MessageListenerOrderly) (msgs, context) -> {
   
            System.out.println("Receive Message:"+msgs);
            msgs.forEach((o)->{
   
                try {
   
                    System.out.println(new String(o.getBody(),"UTF-8"));
                } catch (UnsupportedEncodingException e) {
   
                    e.printStackTrace();
                }
            });
            return ConsumeOrderlyStatus.SUCCESS;
   });

消息顺序性会降低消息效率

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值