【顺序消息】

顺序消费是指消息的产生顺序和消费顺序相同。

比如订单的生成、付款、发货,这三个消息必须按顺序处理才可以。

【顺序消息的分类】

全局顺序消息和部分顺序消息。

上面订单的例子,其实是部分顺序消息,只要保证同一个订单ID的三个消息能顺序消费即可。

【全局顺序消息】

【部分顺序消费】

在实际的场景中,更多的是像订单类消息那样,只需要部分有序即可。

[ MessageQueueSelector ]

Producer发送端使用MessageQueueSelector类来控制把消息发往哪个MessageQueue。

[ MessageListenerOrderly ]

Consumer消费端使用MesageListenerOrderly类来解决单MessageQueue的消息被并发处理的问题。

MessageListenerOrderly并不是简单地禁止并发处理,在MessageListenerOrderly的实现中,为每个Consumer Queue加个锁,消费每个消息前,需要获得这个消息对应的Consumer Queue所对应的锁,这样保证了同一时间,同一个Consumer Queue的消息不被并发消费,但不同的Consumer Queue的消息可以并发处理。

【消息重复问题】

消息重复一般情况下不会发生,但是消息量大、网络有波动的情况下,消息重复消费就是个大概率事件。

比如Producer有个方法setRetryTimesWhenSendFailed,是设置在消息发送失败时的自动重试次数,默认为2。

如果第一次发送消息时,Broker端收到了消息,但是没有正确返回发送成功的状态,就会造成消息重复。

[ 如何解决消息重复问题? ]

方法1:

确保消费逻辑的幂等性,即多次调用和一次调用的效果一样。

方法2:

维护一个已消费消息的记录,消费前查询这个消息是否被消费过。

【动态增减机器1——NameServer】

1.集群的各个组件从NameServer获取各种属性和地址信息。

2.各个Broker会定时上报自己的状态信息到NameServer。

为了提高可靠性,建议启动多个NameServer,NameServer占用的资源不多,可以和Broker部署在同一台机器上。有多个NameServer后,减少NameServer不会对其他组件产生影响。

[ 设置NameServer地址的四种方式,优先级由高到低 ]

1.通过代码设置,即通过 Producer.setNameSrvAddr("127.0.0.1:9876;127.0.0.2:9876") 来设置。

2.使用Java启动参数设置,对应的是option的rocketmq.namesrv.addr。

3.通过Linux环境变量来设置,在启动前设置变量:NAMESRV_ADDR。

4.通过HTTP服务来设置,(重点:这是唯一支持动态增加NameServer,无需重启其它组件的方式!)如果上述的3个优先级更高的方式没有使用,程序会向一个HTTP地址请求来获取NameServer地址,默认URL是http://jmenv.tbsite.net:8080/rocketmq/nsaddr。

通过roketmq.namesrv.domain参数来覆盖jmenv.tbsite.net;

通过rocketmq.namesrv.domain.subgroup参数来覆盖nsaddr;

[ 注:]

上面第4中方式是唯一支持动态增加NameServer,无需重启其他组件的方式,使用这种方式后其他组件会每隔2分钟请求一次该URL,获取最新的NameServer地址。

【动态增减机器2——Broker】

[ 动态增加Broker机器是否会对原来的Topic产生影响? ]

只增加Broker不会对原有的Topic产生影响,原来创建好的Topic中数据的读写依然在原来的那些Broker上进行。

[  集群扩容(新增Broker机器)后,怎么做? ]

1.把新建的Topic指定到新的Broker机器上,均衡利用资源。

2.另一种方式是通过updateTopic命令更改现有的Topic配置,在新加的Broker上创建新的队列。比如“TopicA”是现有的一个Topic,因为数据量增加后需要扩容,新增的一个Broker机器地址是127.0.0.3:10911,这个时候执行如下命令:

sh ./bin/mqadmin updateTopic -b 127.0.0.3: -t TopicA -n 127.0.0.1:

结果就是在新增的Broker机器上,为T“TopicA”创建了8个读写队列。

[ 如果需要减少Broker,怎么做? ]

减少Broker要看是否有持续运行的Producer,当一个Topic只有一个Master Broker,停掉这个Broker后,消息的发送必定会受影响,需要再停止Broker前,停止发消息。

[ 如果某个Topic下有多个Master Broker,停掉了其中一个,这时候是否会丢失消息呢? ]

和Producer使用的发消息的方式有关。

1.如果是同步方式发送:

在DefaultMQProducer内部有关而自动重试逻辑,其中一个Broker停了,会自动向另一个Broker发消息,不会出现丢消息的情况。

2.如果是异步方式或sendOneWay方式发送:

会丢失切换过程中的消息,因为在异步和sendOneWay方式下,Producer.setRetryTimesWhenSendFailed设置不会起作用,发送失败不会重试。

DefaultMQProducer默认每30S到NameServer请求最新的路由消息,Producer如果获取不到已停止的Broker下的队列消息,后续就自动不再想这些队列发送消息。

[ 如何置换Mster Broker机器? ]

如果Producer能够暂停,在有一个Master和一个Slave的情况下也可以顺利切换,可以关闭Producer后关闭Master Broker,这个时候所有的读取会被定向到Slave Broker机器,消费消息不受影响。把Master Broker机器置换完后,基于原来的数据启动这个Master Broker,然后再启动Producer程序正常发送消息。

【各种故障对消息的影响,针对各种故障的处理方式 】

可能出现的故障:

.Broker正常关闭,启动。

.Broker异常Crash,然后启动。

.OS Crash,重启。

.机器断电,当能马上恢复供电。

.磁盘损坏。

.CPU、主板、内存等关键设备损坏。

现有的RocketMQ集群,一般每个Topic都配有多Master角色的Broker写入,并且每个Master都至少有一个Slave机器。

[ 1. Broker正常关闭,启动 ]

这种情况内存中的数据不会丢失。

  如果重启过程中有持续运行的Consumer,Broker Master机器出故障后,Consumer会自动重连对应的Broker Slave机器,不会有消息丢失和偏差。

当Broker Master重启成功后,Consumer又会重现连接到Broker Master机器上。

  如果重启过程中有持续运行的Producer,一台Broker Master出故障后,Producer会向该Topic下的其他Master机器发送消息,如果Producer采用的是同步发送的方式,不会有消息丢失。

[ 第2,3,4种情况的处理 ]

2,3,4属于软件故障,内存的数据有可能会丢失。

刷盘的策略不同,造成的影响不同。

如果Broker Master和Broker Slave都配置成SYNC_FLUSH同步刷盘,可以达到消息不丢失。

[ 第5,6种情况的处理 ]

第5,6种情况属于硬件故障,原有机器的磁盘数据可能会丢失,如果Master和Slave机器间配置成同步复制方式,某一台机器发生这样的故障,也可以达到消息不丢失的效果,如果Master和Slave之间是异步复制的方式,两次Sync之间的消息会丢失。

【各种故障处理的总结】

1.多Master,每个Master都带有多个Slave。

2.主从之间设置成SYNC_MASTER。同步复制。

3.Producer设置成同步方式写。

4.刷盘策略设置成SYNC_FLUSH,同步刷盘。

RocketMQ读书笔记6——可靠性优先的使用场景的更多相关文章

  1. RocketMQ读书笔记7——吞吐量优先的场景

    [Broker端进行消息过滤] 在Broker端进行消息过滤,可以减少无效消息发送到Consumer,少占用网络宽带从而提高吞吐量. [过滤方式1——通过Tag过滤] [ 关于Tag和Key ] 对一 ...

  2. RocketMQ读书笔记5——消息队列的核心机制

    [Broker简述] Broker是RocketMQ的核心,大部分“重量级”的工作都是由Broker完成的,包括: 1.接受Producer发过来的消息: 2.处理Consumer的消费信息请求: 3 ...

  3. RocketMQ读书笔记4——NameServer(MQ的协调者)

    [NameServer简述] 对于一个消息队列集群来说,系统由很多机器组成,每个机器的角色.IP地址都不相同,而且这些信息是变动的(如在某些情况下,会有新的Producer或Consumer加入). ...

  4. RocketMQ读书笔记3——消费者

    [不同类型的消费者] DefaultMQPushConsumer 由系统控制读取操作,收到消息后自动调用传入的处理方法来处理. DefaultMQPullConsumer 读取操作中的大部分功能由使用 ...

  5. RocketMQ读书笔记2——生产者

    [生产者的不同写入策略] 生产者向消息队列里写入数据,不同的业务需要生产者采用不同的写入策略: 同步发送.异步发送.延迟发送.发送事务消息等. [DefaultMQProduce示例] public ...

  6. RocketMQ读书笔记1——简述

    [消息队列的功能介绍] 分布式消息队列可以提供应用解耦.流量削峰.消息分发.保证最终一致性.方便动态扩容等功能. [MQ使用场景1——应用解耦] 复杂的系统如电商系统,会存在多个子系统,如订单系统.库 ...

  7. [hadoop读书笔记] Hadoop下各技术应用场景

    1.数据采集 对于数据采集主要分为三类,即结构化数据库采集,日志和文件采集,网页采集. 对于结构化数据库,采用Sqoop是合适的,可以实现结构化数据库中数据并行批量入库到hdfs存储.对于网页采集,前 ...

  8. 《Apache kafka实战》读书笔记-管理Kafka集群安全之ACL篇

    <Apache kafka实战>读书笔记-管理Kafka集群安全之ACL篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 想必大家能看到这篇博客的小伙伴,估计你对kaf ...

  9. 【读书笔记】《Computer Organization and Design: The Hardware/Software Interface》(1)

    笔记前言: <Computer Organization and Design: The Hardware/Software Interface>,中文译名,<计算机组成与设计:硬件 ...

随机推荐

  1. CentOS 7 安装方式汇总

    U盘安装 通过U盘安装 CentOS 的过程和安装Windows非常相似,首先将 CentOS 镜像文件刻录到U盘(或者光盘),设置固件(BIOS或者UEFI)从U盘启动,然后逐步设置即可. 使用 V ...

  2. Centos7安装python3.7.1并与python2共存

    转自:http://www.cnblogs.com/JahanGu/p/7452527.html参考:https://www.jb51.net/article/104326.htm 1. 备份原来的p ...

  3. LINQ入门教程之各种标准查询操作符(一)

    好久之前就想系统的学习下LINQ,好久之前…… 本篇文章主要介绍LINQ等的标准查询操作符,内容取自<LINQ高级编程>,后续还会介绍LINQ to XML ,LINQ to SQL. L ...

  4. Jmeter创建一个点对点的 JMS 测试计划

    创建一个点对点的 JMS 测试计划 确保所需的jar文件位于JMeter lib目录中. 如果没有,关闭JMeter,复制jar文件并重新启动JMeter. 参见详细教程 在本节中,将学习如何创建测试 ...

  5. git --mixed --soft --hard之间的区别

    git reset --mixed:此为默认方式,不带任何参数的git reset,即时这种方式,它回退到某个版本,只保留源码,回退commit和add信息git reset --soft:回退到某个 ...

  6. 查看和修改mysql数据库的最大链接数据

    通常,mysql的最大连接数默认是100, 最大可以达到16384.1.查看最大连接数:show variables like '%max_connections%';2.修改最大连接数方法一:修改配 ...

  7. 深度学习(十五) TextCNN理解

    以下是阅读TextCNN后的理解 步骤: 1.先对句子进行分词,一般使用“jieba”库进行分词. 2.在原文中,用了6个卷积核对原词向量矩阵进行卷积. 3.6个卷积核大小:2个4*6.2个3*6和2 ...

  8. InnoDB索引概述,二分查找法,平衡二叉树

    索引是应用程序设计和开发的一个重要方面.如果索引太多,应用的性能可能会受到影响:如果索引太少,对查询性能又会产生影响.要找到一个合适的平衡点,这对应用的性能至关重要. 如果知道数据的使用,从一开始就应 ...

  9. python实例:快速找出多个字典中的公共键

    1.生成随机字典 # 从abcdefg 中随机取出 3-6个,作为key, 1-4 的随机数作为 value s1 = {x : randint(1, 4) for x in sample('abcd ...

  10. CentOS 7_64位系统下搭建Hadoop_2.8.0分布式环境

    准备条件: CentOS 7 64位操作系统 | 选择minimal版本即可(不带可视化桌面环境),也可以选择带完整版Hadoop-2.8.0 | 本文采用的是Hadoop-2.8.0版本.JDK1. ...