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


相关推荐

  • mac goland2022永久激活码_最新在线免费激活[通俗易懂]

    (mac goland2022永久激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html1T…

    2022年3月31日
    707
  • 参数估计

    参数估计

    2021年11月19日
    59
  • 华为官网ensp安装包在哪?_手机安装华为路由器的步骤图解

    华为官网ensp安装包在哪?_手机安装华为路由器的步骤图解今天给小伙伴们详细介绍一下ensp的安装教程,附有安装包有,可自行下载目录一,安装包链接二,安装详细步骤1.安装OracleVMVirtualBox2.安装Wireshark3.安装ensp4.安装完成三,总结一,安装包链接链接:https://pan.baidu.com/s/1d-8dd9qBhpAwxc0UBL8vdg提取码:df6m二,安装详细步骤1.安装OracleVMVirtualBox下载好安装包后解压,打…

    2022年10月14日
    3
  • docker离线安装部署_docker官方中文文档

    docker离线安装部署_docker官方中文文档离线安装docker

    2022年9月26日
    3
  • 数据结构KMP_rsa算法例题

    数据结构KMP_rsa算法例题前言KMP算法是我们数据结构串中最难也是最重要的算法。难是因为KMP算法的代码很优美简洁干练,但里面包含着非常深的思维。真正理解代码的人可以说对KMP算法的了解已经相当深入了。而且这个算法的不少东西的确不容易讲懂,很多正规的书本把概念一摆出直接劝退无数人。这篇文章将尽量以最简单的方式介绍KMP算法以及他的改进,文章的开始我先对kmp算法的三位创始人Knuth,Morris,Pratt致敬,懂得这…

    2022年8月21日
    5
  • StretchBlt和StretchDIBits

    StretchBlt和StretchDIBitsStretchBlt:从源矩形中复制一个位图到目标矩形,必要时按目标设备设置的模式进行图像的拉伸或压缩,如果目标设备是窗口DC,则意味着在窗口绘制位图,大致的使用代码如下:1voidDrawImage(HDChdc,HBITMAPhbm,constRECTtarget_rect)2{3HDChdcMemory=::CreateCom…

    2022年6月15日
    42

发表回复

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

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