深入理解 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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Mysql和Hash作为数据库索引的优略

    Mysql和Hash作为数据库索引的优略1.hash表只能匹配是否相等,不能实现范围查找select * from xx where id > 23; 这时就没办法索引了2.当需要按照索引进行order by时,hash值没办法支持排序select * from xx order by score desc;如果score为建立索引的字段,hash值没办法辅助排序。3.组合索引可以支持部分索引查询,如(a,b,c)的组合索引,查询中只用到了阿和b也可以查询的,如果使用hash表,组合索引会将几个字段合并hash,没办法支持部分索引

    2022年8月9日
    7
  • 优先级队列默认最小值优先吗_低优先级队列要等几局

    优先级队列默认最小值优先吗_低优先级队列要等几局1.优先级队列是什么??首先,优先级队列是一个队列,队列所有的性质,它也有。其次,优先级队列每次取出的是优先级最高的元素。优先级队列的内部是用堆来维护的。将优先级最高的排在前面。2.什么时候用这个队列呢??看完优先级队列的定义,好像看懂了,又好像没看懂。这队列,什么用它呢?1)排序的对象和排序时比较的对象常见的排序方法(插入、快排等),排序的对象和比较的对象是一样的,根据数本身的大小进行排序。优先级队列可以对排序对象和比较对象相同的进行排序,也可以对排序的对象和排序时比较的对象不同的

    2022年9月23日
    4
  • java递归结束条件_方法递归必须有结束条件

    java递归结束条件_方法递归必须有结束条件需求:希望递归结束后去更新UI界面。那什么时候才是递归结束呢。网上有人去判断一个固定参数,然后结束,简直莫名其妙,这个固定参数居然是随便乱取的,不科学。思路:根据判断i=0,收集size的值。通过i=0,收集到循环的长度,因为每个循环都有i=0的时候,而且都只有唯一一个,根据num能收集到循环总长度。代码:for(inti=0;i<((List)data).size()

    2022年9月18日
    3
  • Linux如何切换到root用户(linux禁止用户切换root)

    Linux如何切换到root用户(linux禁止用户切换root)1.首先,我们输入pwd命令,查看当前用户目录:当前用户是xg其中我解释一下[xg@localhost~]$ 这个的含义,其中xg指的是当前的用户,localhost指的是本机服务,~指的是当前目录,后面的$符号指的是普通用户,如果是root用户的话,就会变成下图这样,其中的#符号指的就是root用户:2.这时我们分别输入su xg和su-,如下图所示:输入suxg命

    2022年4月18日
    188
  • PHP实现redis限制单ip、单用户的访问次数功能

    PHP实现redis限制单ip、单用户的访问次数功能

    2021年10月28日
    44
  • 【机器学习】彻底理解神经网络中的反向传播算法(BP)

    【机器学习】彻底理解神经网络中的反向传播算法(BP)目录1,前言2,例程Step1前向传播Step2反向传播3,代码实现1,前言最近在看机器学习神经网络方面的知识,也看了很多关于反向传播算法原理的介绍,有一篇文章写的很好,在这里记录下,并且加入自己的理解。反向传播法其实是神经网络的基础了,但是很多人在学的时候总是会遇到一些问题,或者看到大篇的公式觉得好像很难就退缩了,其实不难,就是一个链式求导法则反复用。如果不想…

    2022年5月3日
    56

发表回复

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

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