RocketMQ
文章平均质量分 74
RocketMQ
程序员劝退师-TAO
没事敲两行代码
展开
-
RocketMQ-重试队列
重试队列介绍对于需要重试消费的消息,并不是Consumer在等待一个指定时长后再去拉取原来的消息进行消费,而是将这些需要重试的消息放入到一个特殊的Topic队列中,而后进行再次消费的,这个特殊的队列就是重试队列。当出现需要进行重试消费的消息时,Broker会为每个消费组都设置Topic名称,为%RETRY%consumerGroup@consumerGroup的重试队列。这个重试队列是针对消息才组的,而不是针对每个Topic设置的(一个Topic的消息可以让多个消费者进行消费,所以会为这些消费者组各创原创 2021-12-29 15:02:39 · 1753 阅读 · 0 评论 -
RocketMQ-事务消息
问题引入假设一个场景如下,工行用户A向建行用户B转账1万元,我们可以简单使用同步消息来处理需求,流程如下!工行系统发生一个给B加钱的同步消息M给Broker消息被Broker成功连接后,向工行系统发送成功ACK工行系统收到成功ACK后从用户A中扣款建行系统从Broker中获取到消息M建行系统消费消息M,即向用户B加钱这种模型其实存在很大问题,如第三步从用户A中扣款失败,或者第五步给用户A加钱失败,这个对于业务来说都是毁灭性的。解决思虑解决思路是将第1、2、3不具有原则性,要么全部成功原创 2021-12-27 00:56:10 · 1908 阅读 · 0 评论 -
RocketMQ-专题合集
搭建部分RocketMQ搭建RocketMQ集群搭建RocketMQ集群监控平台rocketmq-console搭建RocketMQ搭建双主双从同步复制报错RocketMQ报错:sendDefaultImpl call timeout、No route info of this topic理论部分RocketMQ消息类型RocketMQ-延迟消息RocketMQ-批量消息RocketMQ顺序消息RocketMQ消费幂等RocketMQ死信队列RocketMQ消息重试RocketM原创 2021-12-25 17:18:00 · 897 阅读 · 0 评论 -
JAVA整合阿里云ONS(RocketMQ)
前言关于阿里云ONS我这里不多介绍,用的话直接去看官网,这里提几个实际对接的问题问题一:TCP版的不支持本地调试,只支持公网链接问题二:ONS不支持批量消息问题三:ONS延迟消息的时间是可以自定义的,其内部实现和RocketMQ是不同的,这个可以查看往期文章RocketMQ-延迟消息整合关于ONS的API使用,其实并不是本文的重点,这个看看官方文档就行了阿里云ONS那么本文的重点在于整合,阿里云的ONS其实收费还是挺高的,有一条收费条款是API消耗,这个有点划不来,我们知道消费者需原创 2021-12-25 16:50:56 · 7765 阅读 · 7 评论 -
RocketMQ-批量消息
前言生产者进行消息发送的时候可以一次性发送多条消息,那么这样可以大大节省网络IO,也可以大大提升Producer的发送效率!注意批量消息必须使用相同的Topic批量消息必须使用相同的刷盘策略批量消息不能是延迟消息和事务消息批量消息不能4MB消息大小限制批量消息不能支持超过4MB大小,解决方案有如下两种方案一如果超过4MB,那么将消息切片即可方案二修改生产端与Broker的配置生产端在发送之前设置maxMessageSize属性Broker端修改配置文件中的maxMessag原创 2021-12-24 00:21:17 · 1741 阅读 · 0 评论 -
RocketMQ-延迟消息
前言延迟消息对于RocketMQ来说实现这个操作挺简单的,不用像RabbitMQ那样需要设置死信队列,简化了客户端操作,但是对于RocketMQ开源版(也就是RocketMQ)的是不支持自定义延迟时间的,只能使用RocketMQ提供的1-18个延迟级别,但是阿里云ONS是可以设置自定义时间的,收费版的还是牛逼!延迟消息实现原理首先生产者发送一条消息费Broker,那么发送一条延迟消息是需要设置延迟等级的,然后这条消息会被写入到CommitLog中,那么写入到CommitLog中后会分发到相应的Que原创 2021-12-23 23:58:32 · 1244 阅读 · 1 评论 -
RocketMQ-消息清理
介绍消息被消费过后会被清理掉吗?这个RocketMQ是不会的。消息是被顺序存储在commitlog文件中的,且消息大小不定长,所以消息的清理是不可能以消息为单位进行清理的,而是以commitlog文件为单位进行清理的,否则会急剧下降清理效率,并实现逻辑复杂,commotlog文件存在一个过期时间,默认为72小时,即三天,除了用户手动清理外,在一下情况下也会自动清理,无论文件中的消息是否被消费过文件过期,且达到清理时间点(默认为凌晨4点)后自动清理过期文件文件过期,且磁盘空间占用率达到清理接线(默认原创 2021-12-23 00:26:59 · 1756 阅读 · 0 评论 -
Rocket-消息堆积与消息积压
概念消息处理流程中,如果Consumer的消费速度跟不上Producer的发送速度,MQ中未处理的消息会越来越多,这部分消息就被称为堆积消息,消息出现堆积进而造成消息的消费延迟,一下场景需要重点关注消息堆积和消费延迟问题业务系统上下游能力不匹配造成的持续堆积,且无法自行恢复。业务系统对消息的消费实时性要求较高,即使是短暂的堆积造成的消息延迟也无法接受产生原因分析Consumer使用长轮询Pull模式消息时,分为下两个阶段:拉取消息Consumer通过长轮询Pull模式批量拉取的方式从服务原创 2021-12-23 00:14:59 · 444 阅读 · 0 评论 -
RocketMQ-offset管理
前言这里offset是指的是Consumer的消息进度offset,消费进度offset是用来记录每个Queue的不同消费组的消息进度的,根据消费进度记录器的不同,可以分为两种模式,本地模式和远程模式offset本地管理模式当消费模式为广播模式时,offset使用本地模式存储,因为每条消息会被所有消费者消费,每个消费者管理自己的消费进度,各个消费者之间不存在进度交集。Consumer在广播模式下offset相关数据以json的形式持久化到Consumer本地磁盘文件中,默认文件为当前用户目录下的.ro原创 2021-12-21 00:44:08 · 1843 阅读 · 0 评论 -
RocketMQ-订阅关系一致性
介绍订阅关系一致性是指,同一个消费组(Group Id相同)下所有Consumer实例所订阅的Topic与Tag以及对消息的逻辑处理必须完全一致,否则,消费逻辑会混乱,甚至消息丢失!正确的订阅关系多个消费者订阅多个Topic,并且每个消费组里的多个消费者实例订阅关系保持一致。错误的订阅关系实际上也就是是同一个Group Id下的消费者订阅的Topic 和Tag不一致...原创 2021-12-21 00:13:03 · 297 阅读 · 0 评论 -
RocketMQ-Queue分配算法
介绍一个Topic中的Queue只能有Consumer Group中的一个Consumer进行消费,那么他们之间的配对关系如何确定的,即Queue要分配给那个Consumer进行消费?也就是算法策略,常见有4中策略,这些策略通过创建Consumer时的构造器传进去的。平均分配策略该算法是根据avg=QueueCount / ConsumerCount 的计算结果进行分配的,如果能够整除,则按顺序将avg个Queue逐个分配,如果不能整除,则将多余出的Queue按照Consumer顺序逐个分配环形平原创 2021-12-21 00:02:30 · 1038 阅读 · 0 评论 -
RocketMQ-Rebalance限制与危害
Rebalance机制何为Rebalance,Rebalance即再均衡,是指,将一个Topic下的多个Queue在同一个ConsumerCroup(消费者集群)中的多个Consumer间进行从新分配的过程,实际上如下消费者集群中有两个消费者时,consumer1订阅Queue0、1、2,consumer2订阅Queue3、4当我们消费者集群中新加了一个消费者,那么订阅关系如下,即consumer1订阅Queue0、1,consumer2订阅Queue2、3,consumer3订阅Queue3当原创 2021-12-20 23:22:44 · 782 阅读 · 0 评论 -
RocketMQ-消息消费
前言消费者从Broker中获取消息方式有两种,pull拉取方式和push推送方式,消费者组对于消息消费的模式又分为两种,集群消费Clustering和广播消费BroadcastingPull/Push消费类型Pull拉取模式Consumer主动从Broker中拉取消息,主动权在Consumer控制。一旦获取了批量消息,就会启动消费国成,不过,该方式的实时性较弱,即Broker中有了新的消息时消费者并不能即使发现并消费者Push推送模式该模式下Broker收到数据后悔主动推送给Consumer,该原创 2021-12-19 23:00:58 · 605 阅读 · 0 评论 -
RocketMQ-消息读写
前言之前写过一篇关于RockerMQ的消息存储,本文接上文,这里是详细介绍RocketMQ是怎么完成消息读写的!消息写一条消息进入到Broker后经历一下几个过程才最终被持久化Broker更具QueueId,获取到该消息对应索引条目在consumerqueue目录中的写入偏移量,即QueueOffset将queueId、queueOffset等数据,与消息一起封装为消息单元将消息写入到commitLog形成消息索引条目将消息索引条目拆分到相应的consumerqueue消息读当Co原创 2021-12-19 18:01:22 · 605 阅读 · 0 评论 -
RocketMQ-集群模式
单Master只有一个Broker(其本质上不能称为集群),这种方式也只能在测试环境使用,生产环境最好不要使用!多MasterBroker集群仅由多个MasterBroker构成,不存在Salve,同一个Topic的各个Queue会平均分布各个Master节点上优点:配置简单,单个Master宕机或则重启维护对应用无影响,在磁盘配置为RAID10时,即使机器宕机不可恢复情况下,由于RAID10磁盘非常可靠,消息也不会丢失,(异步刷盘丢失少量消息,同步刷盘一条不丢失),性能最高。缺点单机机器宕机原创 2021-12-18 17:25:54 · 608 阅读 · 0 评论 -
RocketMQ-数据复制与刷盘策略
数据复制概念引入数据复制是指BrokerServer集群中的概念,通常RockerMQ集群搭建就是指BrokerServer集群的搭建,NameServer集群搭建特别简单,在搭建BrokerServer集群之前,先要搞明白数据复制这个概念!复制策略复制策略是指Broker的Master和Slave间的数据同步方式,分为同步复制和异步复制同步复制:消息写入到Master后,Master会等待Salve同步数据成功后才向Producer返回ACK异步复制:消息写入到Master后,Master原创 2021-12-18 16:20:31 · 380 阅读 · 0 评论 -
RocketMQ-Topic创建
手动创建我们打开控制台,有一个主题的table,点击新增这里创建Topic分为集群模式,和Broker模式,二者区别如下集群模式:该模式下创建的Topic是指当前集群下,所有的Broker中的Queue数量是相同的Broker模式:该模式下创建的Topic在集群中,每隔Broker中的Queue数量可以不同自动创建自动创建Topic时,默认采用的是Broker模式,会为每个Broker默认创建4个Queue,这个可以再配置文件中配置。读/写队列介绍读写队列实际上在物理概念上是同一个队原创 2021-12-18 13:00:08 · 3967 阅读 · 1 评论 -
RocketMQ工作流程
一:启动NameServer启动NameServer,NameServer启动后开始监听端口,等待BrokerServer、Producer、Consumer连接二:启动BrokerServer启动BrokerServer的时候,BrokerServer会与配置好的NameServer列表的所有节点建立长链接,然后每隔30秒想NameServer定时发送心跳包三:创建Topic可以先创建Topic,创建Topic是需要指定Topic要存储在那些BrokerServer上,当然在创建Topic时也会原创 2021-12-18 01:15:35 · 457 阅读 · 0 评论 -
RocketMQ-BrokerServer
介绍功能介绍BrokerServer充当消息中转角色,负责存储消息转发消息,BrokerServer在RocketMQ系统中负责接收并存储从生产者发来的消息,同时为消费者的拉取请求作准备,BrokerServer同时也存储这消息相关的元数据,包括消费者消息偏移offset、主题、队列等!模块构成下图为BrokerServer的功能模块示意图Remoting Module:整个Broker的实体,负责处理来自clients端的请求,而这个Broker实体则又一下模块构成Client Manag原创 2021-12-18 01:00:04 · 380 阅读 · 0 评论 -
RocketMQ-NameServer
介绍功能介绍NameServer是一个Broker与Topic路由的注册中心,支持Broker的动态注册与发现,主要功能如下Broker管理:接受Broker集群的注册信息并且保存下来作为路由信息的基本数据,提供心跳监测机制,检查Broker是否还存活路由信息管理:每个NameServer中都保存Broker集群的整个路由信息可用于客户端查询队列信息,Producer和Consumer通过NameServer可以获取真个Broker集群路由信息从而进行消息投递和消费在RockerMQ的早期版原创 2021-12-18 00:37:45 · 1029 阅读 · 0 评论 -
springboot使用rocketmq-spring-boot-starter整合RocketMQ
前言前面写过一片文章使用rocketmq-client整合RocketMQ的,这篇文章也不讲这些理论,理论还是前往RocketMQ消息类型或者其他往期文章,本文就如标题,纯粹的操一下rocketmq-spring-boot-starter这个玩意!依赖 <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-spri原创 2021-12-16 01:02:22 · 6334 阅读 · 0 评论 -
JAVA使用rocketmq-client整合RocketMQ
前言理论部分请前往这个专题的其他文章查看,本文接RocketMQ消息类型文章,本文使用rocketmq-client操作RocketMQ发送接受各种消息的案例!依赖 <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-client</artifactId> </dependenc原创 2021-12-09 19:36:44 · 5881 阅读 · 0 评论 -
RocketMQ消息类型
前言前段时间给公司开发消息中台的时候使用到了阿里云的ONS,也就是RocketMQ的收费plus版本吧,可以这么理解,然后发现对接阿里的ONS需要从新对接一套SDK,与我们常用的方式不同,如下 <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-client</artifactId> &原创 2021-12-09 16:29:13 · 812 阅读 · 0 评论 -
RocketMQ顺序消息
介绍消息有序指的是可以按照消息的发送顺序来消费(FIFO), RocketMQ可以严格的保证消息有序,可以分为分区有序或者全局有序。顺序消费的原理解析,在默认的情况下消息发送会采取Round Robin轮询方式把消息发送到不同的queue(分区队列);而消费消息的时,候从多个queue上拉取消息,这种情况发送和消费是不能保证顺序。但是如果控制发送的顺序消息只依次发送到同一个queue中,消费的时候只从这个queue上依次拉取,则就保证了顺序。当发送和消费参与的queue只有一个,则是全局有序;如果多个qu原创 2021-08-30 23:49:19 · 532 阅读 · 0 评论 -
RocketMQ源码分析-Consumer
消息消费概述消息消费以组的模式开展,一个消费组内可以包含多个消费者,每一个消费者组可订阅多个主题,消费组之间有ff式和广播模式两种消费模式。集群模式,主题下的同一条消息只允许被其中一个消费者消费。广播模式,主题下的同一条消息,将被集群内的所有消费者消费一次。消息服务器与消费者之间的消息传递也有两种模式:推模式、拉模式。所谓的拉模式,是消费端主动拉起拉消息请求,而推模式是消息达到消息服务器后,推送给消息消费者。RocketMQ消息推模式的实现基于拉模式,在拉模式上包装一层,一个拉取任务完成后开始下一个拉取任原创 2021-01-19 19:56:18 · 213 阅读 · 0 评论 -
RocketMQ源码分析-消息存储
消息存储核心类private final MessageStoreConfig messageStoreConfig; //消息配置属性private final CommitLog commitLog; //CommitLog文件存储的实现类private final ConcurrentMap<String/* topic */, ConcurrentMap<Integer/* queueId */, ConsumeQueue>> consumeQueueTable;原创 2021-01-18 21:13:27 · 343 阅读 · 0 评论 -
RocketMQ源码分析-Producer
前言消息生产者的代码都在client模块中,相对于RocketMQ来讲,消息生产者就是客户端,也是消息的提供者。主要方法介绍//创建主题void createTopic(final String key, final String newTopic, final int queueNum) throws MQClientException;//根据时间戳从队列中查找消息偏移量long searchOffset(final MessageQueue mq, final long timesta原创 2021-01-18 20:40:20 · 161 阅读 · 0 评论 -
RocketMQ源码分析-NameServer
架构设计消息中间件的设计思路一般是基于主题订阅发布的机制,消息生产者(Producer)发送某一个主题到消息服务器,消息服务器负责将消息持久化存储,消息消费者(Consumer)订阅该兴趣的主题,消息服务器根据订阅信息(路由信息)将消息推送到消费者(Push模式)或者消费者主动向消息服务器拉去(Pull模式),从而实现消息生产者与消息消费者解耦。为了避免消息服务器的单点故障导致的整个系统瘫痪,通常会部署多台消息服务器共同承担消息的存储。那消息生产者如何知道消息要发送到哪台消息服务器呢?如果某一台消息服务器原创 2021-01-18 20:22:59 · 238 阅读 · 0 评论 -
RocketMQ源码分析-环境搭建
环境依赖JDK :1.8+MavenIntelliJ IDEA源码拉取从官方仓库 https://github.com/apache/rocketmq clone或者download源码。源码目录结构:broker: broker 模块(broke 启动进程)client :消息客户端,包含消息生产者、消息消费者相关类common :公共包dev :开发者信息(非源代码)distribution :部署实例文件夹(非源代码)example: Rocket原创 2021-01-18 18:46:54 · 292 阅读 · 0 评论 -
RocketMQ消费幂等
前言消息队列 RocketMQ 消费者在接收到消息以后,有必要根据业务上的唯一 Key 对消息做幂等处理的必要性。消费幂等的必要性在互联网应用中,尤其在网络不稳定的情况下,消息队列 RocketMQ 的消息有可能会出现重复,这个重复简单可以概括为以下情况:发送时消息重复当一条消息已被成功发送到服务端并完成持久化,此时出现了网络闪断或者客户端宕机,导致服务端对客户端应答失败。 如果此时生产者意识到消息发送失败并尝试再次发送消息,消费者后续会收到两条内容相同并且 Message ID 也相同的消息原创 2021-01-18 16:09:01 · 558 阅读 · 1 评论 -
RocketMQ死信队列
前言当一条消息初次消费失败,消息队列 RocketMQ 会自动进行消息重试;达到最大重试次数后,若消费依然失败,则表明消费者在正常情况下无法正确地消费该消息,此时,消息队列 RocketMQ 不会立刻将消息丢弃,而是将其发送到该消费者对应的特殊队列中。在消息队列 RocketMQ 中,这种正常情况下无法被消费的消息称为死信消息(Dead-Letter Message),存储死信消息的特殊队列称为死信队列(Dead-Letter Queue)。死信特性死信消息具有以下特性不会再被消费者正常消费。原创 2021-01-18 16:07:08 · 6649 阅读 · 0 评论 -
RocketMQ消息重试
顺序消息的重试对于顺序消息,当消费者消费消息失败后,消息队列 RocketMQ 会自动不断进行消息重试(每次间隔时间为 1 秒),这时,应用会出现消息消费被阻塞的情况。因此,在使用顺序消息时,务必保证应用能够及时监控并处理消费失败的情况,避免阻塞现象的发生。无序消息的重试对于无序消息(普通、定时、延时、事务消息),当消费者消费消息失败时,您可以通过设置返回状态达到消息重试的结果。无序消息的重试只针对集群消费方式生效;广播方式不提供失败重试特性,即消费失败后,失败消息不再重试,继续消费新的消息。重试原创 2021-01-18 16:04:29 · 1319 阅读 · 0 评论 -
RocketMQ负载均衡
Producer负载均衡Producer端,每个实例在发消息的时候,默认会轮询所有的message queue发送,以达到让消息平均落在不同的queue上。而由于queue可以散落在不同的broker,所以消息就发送到不同的broker下,如下图:图中箭头线条上的标号代表顺序,发布方会把第一条消息发送至 Queue 0,然后第二条消息发送至 Queue 1,以此类推。整个的这个过程RocketMq的内部已经实现了,对于我们来说我们只需要发就完事了!Consumer负载均衡集群模式在集群消费模式下原创 2021-01-18 16:00:17 · 163 阅读 · 0 评论 -
RocketMQ高可用性机制
前言RocketMQ分布式集群是通过Master和Slave的配合达到高可用性的。Master和Slave的区别:在Broker的配置文件中,参数 brokerId的值为0表明这个Broker是Master,大于0表明这个Broker是 Slave,同时brokerRole参数也会说明这个Broker是Master还是Slave。Master角色的Broker支持读和写,Slave角色的Broker仅支持读,也就是 Producer只能和Master角色的Broker连接写入消息;Consumer可以原创 2021-01-18 15:51:18 · 164 阅读 · 0 评论 -
RocketMQ消息存储
前言分布式队列因为有高可靠性的要求,所以数据要进行持久化存储。消息生成者发送消息MQ收到消息,将消息进行持久化,在存储中新增一条记录返回ACK给生产者MQ push 消息给对应的消费者,然后等待消费者返回ACK如果消息消费者在指定时间内成功返回ack,那么MQ认为消息消费成功,在存储中删除消息,即执行第6步;如果MQ在指定时间内没有收到ACK,则认为消息消费失败,会尝试重新push消息,重复执行4、5、6步骤MQ删除消息存储介质关系型数据库DBApache下开源的另外一款MQ—原创 2021-01-18 15:15:12 · 765 阅读 · 0 评论 -
RocketMQ报错:sendDefaultImpl call timeout、No route info of this topic
Rocket搭建完成后开始整个java代码的时候启动程序后报错如下org.apache.rocketmq.remoting.exception.RemotingTooMuchRequestException: sendDefaultImpl call timeout at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendDefaultImpl(DefaultMQProducerImpl.java:588) at or原创 2021-01-14 21:37:42 · 469 阅读 · 0 评论 -
RocketMQ集群监控平台rocketmq-console搭建
前言RocketMQ有一个对其扩展的开源项目incubator-rocketmq-externals,这个项目中有一个子模块叫rocketmq-console,这个便是管理控制台项目了,先将incubator-rocketmq-externals拉到本地,因为我们需要自己对rocketmq-console进行编译打包运行。下载并编译打包git clone https://github.com/apache/rocketmq-externalscd rocketmq-consolemvn clea原创 2021-01-14 20:41:13 · 417 阅读 · 0 评论 -
RocketMQ搭建双主双从同步复制报错
前言最近在整合RocketMQ,想丰富一下自己的技术栈!在整合RocketMQ的时候有些问题,特意拎出这篇文章把一些问题解决一下!环境准备1.防火墙关闭或者端口开放# 关闭防火墙systemctl stop firewalld.service # 查看防火墙的状态firewall-cmd --state # 禁止firewall开机启动systemctl disable firewalld.service# 开放name server默认端口firewall-cmd --remove原创 2021-01-14 19:07:42 · 1007 阅读 · 1 评论 -
RocketMQ集群搭建
各角色介绍Producer:消息的发送者;举例:发信者Consumer:消息接收者;举例:收信者Broker:暂存和传输消息;举例:邮局NameServer:管理Broker;举例:各个邮局的管理机构Topic:区分消息的种类;一个发送者可以发送消息给一个或者多个Topic;一个消息的接收者可以订阅一个或者多个Topic消息Message Queue:相当于是Topic的分区;用于并行发送和接收消息Producer将消息发送给Broker,会先询问NameServer,让NameServe原创 2021-01-14 20:15:26 · 300 阅读 · 0 评论 -
RocketMQ搭建
介绍RocketMQ是阿里巴巴2016年MQ中间件,使用Java语言开发,在阿里内部,RocketMQ承接了例如“双11”等高并发场景的消息流转,能够处理万亿级别的消息。下载RocketMQ下载地址反应有点慢点击后等一下就好了!下载后解压我们将下载后的程序包上传Linux服务器运行1.启动NameServer# 1.启动NameServer,后台启动nohup sh bin/mqnamesrv &# 2.查看启动日志tail -f ~/logs/rocketmqlogs原创 2021-01-12 22:10:33 · 282 阅读 · 2 评论