深入理解 RocketMQ

深入理解 RocketMQ本文对RocketMQ的仅做理论性阐述,以便更深入的理解RocketMQ的内部机制,遇到棘手的问题更容易入手解决。关于代码实战请参考鄙人的另一篇文章:RocketMQ 入门使用详解

大家好,又见面了,我是你们的朋友全栈君。

    本文对RocketMQ的仅做理论性阐述,以便更深入的理解RocketMQ的内部机制,遇到棘手的问题更容易入手解决。关于代码实战请参考鄙人的另一篇文章:RocketMQ 入门使用详解

1. RocketMQ的负载均衡:
          RocketMQ采用轮询所有队列的方式确定消息发送到哪一个队列,RocketMQ提供了两种消息队列轮询(MessageQueueSelector)方式,一种是根据Hash值进行轮询(即
SelectMessageQueueByHash implements MessageQueueSelector),另一种是随机方式(即SelectMessageQueueByRandoom implements MessageQueueSelector)。

          深入理解 RocketMQ

                                         图片来源于:分布式开放消息系统(RocketMQ)的原理与实践

         具体源码如下:          

    private SendResult sendSelectImpl(Message msg, MessageQueueSelector selector, Object arg, CommunicationMode communicationMode, SendCallback sendCallback, long timeout) throws MQClientException, RemotingException, MQBrokerException, InterruptedException {
        this.makeSureStateOK();
        Validators.checkMessage(msg, this.defaultMQProducer);
        TopicPublishInfo topicPublishInfo = this.tryToFindTopicPublishInfo(msg.getTopic());
        if(topicPublishInfo != null && topicPublishInfo.ok()) {
            MessageQueue mq = null;

            try {
                mq = selector.select(topicPublishInfo.getMessageQueueList(), msg, arg);
            } catch (Throwable var11) {
                throw new MQClientException("select message queue throwed exception.", var11);
            }

            if(mq != null) {
                return this.sendKernelImpl(msg, mq, communicationMode, sendCallback, timeout);
            } else {
                throw new MQClientException("select message queue return null.", (Throwable)null);
            }
        } else {
            throw new MQClientException("No route info for this topic, " + msg.getTopic(), (Throwable)null);
        }
    }

      2.RocketMQ的消费者获取重复消息的问题

        RocketMQ目前不能够保证消息重复消息的不出现,如果业务方严格要求不重复,则业务方需要自己处理消息重复的问题,具体方式如下: 

                2.1 消费者处理MQ消息时必须幂等性(即无论接收到多少相同的消息,执行后的结果一致),如果不具有幂等性,则转换成幂等性处理方法;

                2.2  业务方自己保证每条发送到RocketMQ消息都有唯一的ID,这样消费者根据消息的唯一ID去重,并确保消息处理成功。

        <待续>

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/149570.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月17日 上午7:00
下一篇 2022年6月17日 上午7:00


相关推荐

  • DDR4原理及硬件设计

    DDR4原理及硬件设计DDR4 的工作原理以及寻址方式 DDR4 是什么 DDR4 全称 DDR4 DRAM 与其他 DDRDRAM 一样 是当前电子系统架构中使用最为广泛的的 RAM 存储器 这句话可以分解出 3 个关键字 存储器 DRAM DDR4 先说存储器 说到存储 顾名思义 它是个动词 以生活为例 假如有个酸奶 你不想吃的时候 将酸奶存到某冰箱 某层 某个位置 当你想吃的时候 在某冰箱 某曾 某个位置中取出该酸奶 这个过程 我们称为存储 结合生活 我们可以看到存储要有 3 个关键动作 酸奶放哪了 你得知道 如果不知道放哪了

    2026年3月18日
    1
  • 食物链3_食物链条数计算公式

    食物链3_食物链条数计算公式动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形。A 吃 B,B 吃 C,C 吃 A。现有 N 个动物,以 1∼N 编号。每个动物都是 A,B,C 中的一种,但是我们并不知道它到底是哪一种。有人用两种说法对这 N 个动物所构成的食物链关系进行描述:第一种说法是 1 X Y,表示 X 和 Y 是同类。第二种说法是 2 X Y,表示 X 吃 Y。此人对 N 个动物,用上述两种说法,一句接一句地说出 K 句话,这 K 句话有的是真的,有的是假的。当一句话满足下列三条之一时,这句

    2022年8月9日
    9
  • Mac下JMeter的简要使用入门级

    Mac下JMeter的简要使用入门级关于压力测试工具 JMeter 的安装和使用 Mac 下 JMeter 的安装并中文汉化 JMeter 入门级的使用方法

    2025年10月22日
    5
  • 豆包大模型2.0震撼发布,AI技术再上新台阶!

    豆包大模型2.0震撼发布,AI技术再上新台阶!

    2026年3月12日
    2
  • Jenkins(4)docker容器内部修改jenkins容器时间「建议收藏」

    Jenkins(4)docker容器内部修改jenkins容器时间「建议收藏」前言用docker搭建的Jenkins环境时间显示和我们本地时间相差8个小时,需修改容器内部的系统时间查看时间查看系统时间date-R进入docker容器内部,查看容器时间dockere

    2022年7月29日
    14
  • 电子设计竞赛控制组——完整旋转倒立摆程序

    电子设计竞赛控制组——完整旋转倒立摆程序以前也想过要写博客,但是却一直没有付诸于实践,作为第一篇原创,我还是选择将以前电赛时的作品拿出来,毕竟当初可是花费了好多心血的,汗~旋转倒立摆是控制组校内赛练手的题目,需要对PID非常熟悉才能调好参数,以下代码是自己搭建好结构后调试出来的程序,其中的参数会根据不同的结构作出调整。结构组成:K60开发板(带液晶屏和按键),角度编码器,直流减速电机(带编码器),12V的电机驱动,金属摆臂,…

    2022年8月18日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号