rocketmq 消息指定_进大厂必备的RocketMQ你会吗?

点击关注"故里学Java"

右上角"设为星标"好文章不错过

关于消息队列,相信大家都不陌生,现在的中大型项目中或多或少都有使用到消息队列,对于消息队列大家可能都有一定的了解,使用消息队列可以解决什么样的问题,又会带来哪些问题相信也有了解,在前边的文章《消息队列(一)》中有介绍,感兴趣的小伙伴可以点击文章名直接打开。

今天我们主要介绍一下RocketMQ,关于RocketMQ很多人只知道是阿里开源的一款MQ中间件,实际工作中还是用的RabblitMQ,本文以及接下来几篇文章,我会分享一下RocketMQ相关的知识,详细的介绍一下RocketMQ,希望可以帮助到需要的朋友们。

RocketMQ基本概念


  • Producer:消息生产者,负责生产消息,一般由业务系统负责生产消息,消息生产者把业务应用产生的消息发送到broker服务器,
  • Consumer:消息消费者,从broker服务器拉取消息或者接收broker推送的消息进行消费处理。
  • Broker:消息中转的角色,负责存储消息、转发消息。
  • Name Server:充当路由消息的提供者,生产者或消费者可以通过名字查找所需broker的IP列表,集群部署的时候,各个NameServer实例是相互独立的,没有信息交换。
  • Topic:表示一类消息的集合,是RocketMQ进行消息订阅的基本单位。
  • Message Queue:用于存储消息的物理地址,每个Topic中是消息地址存储于多个Message Queue中。
  • Message:消息系统所传输信息的物理载体,生产和消费数据的最小单位,每条消息必须属于一个主题。

RocketMQ的特性


RocketMQ的功能特性很多,这里只简单介绍几个:

  1. 顺序消息

指的是可以按照消息的发送顺序来消费,有时候一组消息需要按照指定的顺序消费才有意义,但是多个消费者是并行消费的,RocketMQ可以严格的保证消息的有序。顺序消息可以分为两类:全局顺序消息和分区顺序消息。全局顺序是指某个topic下所有的消息都要保证顺序,部分顺序消息只要保证每一组消息被顺序消费。

  • 全局顺序消费:对于指定的一个Topic,所有的消息按照严格的先入先出的顺序依次进行发布和消费
  • 分区顺序消费:对于指定的一个Topic,所有的消息根据sharding key进行区块分区,同一个分区的消息按照先入先出的顺序进行消费。性能较全局顺序高。
  1. 事务消息

RocketMQ事务消息是指应用本地事务和发送消息操作可以被定义在全局事务中,要么同时成功,要么同时失败,RocketMQ的事务消息提供了类似X/Open XA的分布式事务功能,通过事务消息能达到分布式事务的最终一致性。

  1. 定时消息

定时消息是指消息发送到broker后,不会立即消费,等到设定的设定的实际才会投递给真正的topic。broker有配置项messageDelayLevel,默认值有1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h,也可以配置自定义的messageDelayLevel,在发送消息的时候,设置delayLevel等级即可:msg.setDelayLevel(level)

定时消息会暂存在名为SCHEDULE_TOPIC_XXXX的topic中,并根据delayTimeLevel存入特定的queue,queueId = delayTimeLevel – 1,即一个queue只存相同延迟的消息,保证具有相同发送延迟的消息能够顺序消费。broker会调度地消费SCHEDULE_TOPIC_XXXX,将消息写入真实的topic。

  1. 回溯消息

回溯消息是指消费者以及消费成功,由于业务需要,需要重新消费,如果要实现此功能,Broker在向消费者投递成功消息后,消息仍然需要保留。重新消费一般是有一定时间纬度的,RocketMQ支持按照时间回溯消息,时间维度可以精确到毫秒。

  1. 消息重投

生产者在发送消息时,同步消费失败会重投,异步消息有重试,oneway没有任何保证。消息重投可以最大限度的保证消息发送成功、不丢失,但是也会导致消息重复,当消息量大、网络不好的时候消息重复的概率就会提高。

我们可以根据需要设置消息重试策略:

  • retryTimesWhenSendFailed:同步发送失败重投次数,默认为2 ,在重投的时候不会发送给上次失败的broker,会尝试向其他的broker发送,尽可能的保证消息不丢失。
  • retryTimesWhenSendAsyncFailed:异步发送失败重试次数,异步的重试还是选择上次的broker,不会选择其他的broker,不能保证消息不丢失。
  • retryAnotherBrokerWhenNotStoreOK:消费刷盘超时或者slave不可用,是否尝试发送给其他的broker,默认为false,非常重要的消息我们可以开启。
  1. 死 信队列

死信队列用于处理消费失败的消息,当消息消费失败的时候,会自动进行消息重试,如果达到最大重试次数后,还是没有消费成功,就说明正常情况下不能正确的消费该消息,此时消息队列会把这个消息发送到该消费者对应的特殊队列中。RocketMQ将这种消息称为死信消息,将这种存储死信消息的队列称为死信队列,可以通过console控制台对死信队列中的消息进行重发。

  1. 流量控制

生产者流控,一般是因为broker处理能力达到了上限。消费者流控,一般是因为消费者消费能力达到了上限。

生产者流控:

  • commitLog文件被锁时间超过osPageCacheBusyTimeOutMills时,参数默认为1000ms,返回流控。
  • 如果开启transientStorePoolEnable == true,且broker为异步刷盘的主机,且transientStorePool中资源不足,拒绝当前send请求,返回流控。
  • broker每隔10ms检查send请求队列头部请求的等待时间,如果超过waitTimeMillsInSendQueue,默认200ms,拒绝当前send请求,返回流控。
  • broker通过拒绝send 请求方式实现流量控制。

生产者流控不会尝试消息重投。

消费者流控:

  • 消费者本地缓存消息数超过pullThresholdForQueue时,默认1000。
  • 消费者本地缓存消息大小超过pullThresholdSizeForQueue时,默认100MB。
  • 消费者本地缓存消息跨度超过consumeConcurrentlyMaxSpan时,默认2000。

消费者流控会降低拉取频率。

RocketMQ技术架构


以多Master多Slave模式为例:

85db21f237c3dbeaf13d649dd7d65673.png

我们可以看到,RocketMQ架构上分为四部分,分别为Producer、Consumer、NameServer、Broker。
  • Producer:消息发布的角色,支持分布式集群方式部署。Producer通过MQ的负载均衡模块选择相应的Broker集群队列进行消息投递,投递的过程支持快速失败并且低延迟。
  • Consumer:消息消费的角色,支持分布式集群方式部署。支持以push推,pull拉两种模式对消息进行消费。同时也支持集群方式和广播方式的消费,它提供实时消息订阅机制,可以满足大多数用户的需求。
  • NameServer:NameServer是一个非常简单的Topic路由注册中心,其角色类似Dubbo中的zookeeper,支持Broker的动态注册与发现。主要包括两个功能:Broker管理,NameServer接受Broker集群的注册信息并且保存下来作为路由信息的基本数据。然后提供心跳检测机制,检查Broker是否还存活;路由信息管理,每个NameServer将保存关于Broker集群的整个路由信息和用于客户端查询的队列信息。然后Producer和Conumser通过NameServer就可以知道整个Broker集群的路由信息,从而进行消息的投递和消费。NameServer通常也是集群的方式部署,各实例间相互不进行信息通讯。Broker是向每一台NameServer注册自己的路由信息,所以每一个NameServer实例上面都保存一份完整的路由信息。当某个NameServer因某种原因下线了,Broker仍然可以向其它NameServer同步其路由信息,Producer,Consumer仍然可以动态感知Broker的路由的信息。
  • Broker:Broker主要负责消息的存储、投递和查询以及服务高可用保证,为了实现这些功能,Broker包含了以下几个重要子模块。

RocketMQ部署架构


以多Master多Slave模式为例:

85db21f237c3dbeaf13d649dd7d65673.png

集群的工作流程;

  • 启动NameServer,NameServer起来后监听端口,等待Broker、Producer、Consumer连上来,相当于一个路由控制中心。
  • Broker启动,跟所有的NameServer保持长连接,定时发送心跳包。心跳包中包含当前Broker信息(IP+端口等)以及存储所有Topic信息。注册成功后,NameServer集群中就有Topic跟Broker的映射关系。
  • 收发消息前,先创建Topic,创建Topic时需要指定该Topic要存储在哪些Broker上,也可以在发送消息时自动创建Topic。
  • Producer发送消息,启动时先跟NameServer集群中的其中一台建立长连接,并从NameServer中获取当前发送的Topic存在哪些Broker上,轮询从队列列表中选择一个队列,然后与队列所在的Broker建立长连接从而向Broker发消息。
  • Consumer跟Producer类似,跟其中一台NameServer建立长连接,获取当前订阅Topic存在哪些Broker上,然后直接跟Broker建立连接通道,开始消费消息。

今天的分享暂时告一段落,后边还有多篇文章继续分享,理论分享结束会有一个demo来演示各个场景。

- END -

往期回顾

107b1c5046cf5a69ecabd9c12d44d7a8.png

11a847a1db3f842e938a2f53a5e9a925.png                                   

6e2669e25cec495e95c33ebe7a3ceb15.png                                

大家好,我是"故里学Java"公号作者,你可以叫我"故里"。

一直坚信技术能改变生活,愿保持初心,加油技术人!

7a2911d5a2fcd7a55c81acbda9d89b0f.png

e07e0bcac1192b27223a8eff94ecf2b5.png

点个赞,证明你还爱我

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/501986.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

秦丝软件的服务器稳定吗,强烈推荐 | 最好的五款服装进销存软件排名

随着企业的发展和市场的需要,传统的手工记录法复杂而繁琐,且错误较多费时费力,尤其是服装行业,涉及的品牌众多,需要管理的货品数量多,质量参差不齐,经营管理越来越困难。在此,小编为…

c语言putchar_C语言实现变色的心!连机器都会变心,呵,男人!

各位,今天我们用C语言来秀一把,给大家带来一个会自动变色的心:怎么样,效果还可以吧!其实这个实现的原理还是比较简单的,为了让窗口别跟控制台那样难看,我调用了system函数对窗口的大小、颜色和标…

git灰度发布版本_Git发布2.30版本

Git 2.30版本已于北京时间今天凌晨3点发布,是该广受欢迎的分布式修订版本控制系统的最新稳定版本更新,Git由Linux内核发明者Linus大神于2005年推出。2020年早些时候,Git 2.28版本带来了对可配置/默认分支名称的支持,以取代到目前为…

匿名的ftp服务器不允许用户上传文件对吗,FTP服务器匿名用户也能上传文件的配置...

FTP服务器匿名用户也能上传文件的配置[日期:2006-12-05]来源:作者:[字体:大 中 小]环境:RedHat 7.3 wu-ftp-2.6.2 proftpd-1.2.4步骤:1.wu-ftpa.从RedHat的光盘上安装wu-ftpd-2.6.2-5.i386.rpm和anonftp-4.0-9.i386.rpm这两个包# …

mongdb2008puls4.0.3安装_Mathematica 10.3安装教程

软件下载[软件名称]:Mathematica v10.3[软件语言]:简体中文 [软件大小]:2.26G[安装环境]:Win10/Win8/Win7[下载链接]:https://pan.baidu.com/s/1fDUUrR-W8IIj8Dem3YZMrQ[提取码]&…

python接口 同花顺_利用python探索股票市场数据指南

虽然同花顺之类的金融理财应用的数据足够好了,但还是有自己定制的冲动, 数据自然不会不会比前者好很多,但是按照自己的想法来定制还是不错的。目标通过免费的数据接口获取数据,每日增量更新标的历史交易数据, 然后通过Kibana做可视化及数据分…

java ee是什么_死磕 java集合之HashSet源码分析

问题(1)集合(Collection)和集合(Set)有什么区别?(2)HashSet怎么保证添加元素不重复?(3)HashSet是否允许null元素?&#xf…

ubuntu wifi固定ip_自制wifi遥控小车!ESP8266实践指南(二)

上次带大家利用ESP8266自制了wifi控制的LED点阵屏幕,大家觉得怎么样呢? 手把手教你用wifi控制显示屏!ESP8266实践指南(一)今天我们来做点更有意思的~ wifi遥控小车!一、所需材料ESP8266 NodeMCU开发板:这次我们使用CP2…

micopython 18b20_[MicroPython]stm32f407控制DS18B20检测温度

1.实验目的 1. 学习在PC机系统中扩展简单I/O 接口的方法。 2. 进一步学习编制数据输出程序的设计方法。 3. 学习DS18B20的接线方法,并利用DS18B20检测当前温度。 2.所需元器件 F407Micropython开发板1块 数据线1条 DS18b20温度传感器1个 DS18B20测温模块(不含DS18B2…

float php 运算_写给 PHP 程序员的 Python 学习指南

文 | 汤青松SegmentFault编辑 | EarlGrey推荐 | 编程派公众号(ID:codingpy)一、背景人工智能这几年一直都比较火,笔者一直想去学习一番;因为一直是从事PHP开发工作,对于Python接触并不算多,总是在关键时候面临着 基础不…

类似ftp文件服务器有哪些,FTP的替代品有哪些,你知道吗?

在某些情况下,需要从服务器上传(或下载)文件。多年来,最流行的文件传输方法是文件传输协议(FTP)。FTP的一大优点是它支持断点续传。FTP收获了方便性,却在安全性上有所欠缺。FTP未加密,这意味着格式是开放的,文件可能在…

case里面两个条件_Go语言条件语句之 switch 语句

点击上方蓝色 “铁匠学编程” 关注我,让我们一起学习!switch语句会根据传入条件不同,选择不同的分支执代码进行执行,他可以代替多个 if else 子句,Go 语言的分支语句和 PHP 的类似,Go 不需要显示的通过brea…

api 二次 开发 禅道_浅谈-软件开发流程

先直接放出我对软件开发的相关人员职责和流程:图一:软件开发的相关人员职责以下是截屏的开发流程泳道图:横轴是相关开发人员的工作模块;纵轴是从上至下开发时序周期。图二:软件开发的流程图从职责图和流程图对应到我们…

光遇安卓服务器维修,《光遇》渠道服更换手机解决办法

《光遇》游戏中渠道服更换手机怎么办?很多小伙伴更换手机后登陆游戏发现自己还需要重头开始,很多小伙伴表示不知道怎么找回之前的渠道服账号和数据?当然IOS玩家不用担心,如果更换IOS可以继续使用账号,但是IOS更换安卓是…

线程中task取消_Rust Async: async-task源码分析

async-std是rust异步生态中的基础运行时库之一,核心理念是合理的性能 用户友好的api体验。经过几个月密集的开发,前些天已经发布1.0稳定版本。因此是时候来一次深入的底层源码分析。async-std的核心是一个带工作窃取的多线程Executor,而其本…

extjs 方法执行顺序_TestNG之注解变压器amp;方法拦截器

一.注解变压器TestNG允许在执行期间修改所有注解的内容。当源代码中的注解大部分是正确的,但是有一些时刻你想要重写他们的值时,这个是非常有用的。可以使用注解变压器实现。注解变压器是一个实现了接口的类:public interface IAnnotationTra…

服务器升级中暂不可修改怎么回事,抖音服务器升级中,暂不支持本地区开播抖音怎么在法国直播?...

抖音服务器升级中,暂不支持本地区开播抖音怎么在法国直播?除了餐饮,腾讯自主研发的各种跨界开发节目也无人问津。至于年初腾讯app项目和资源,还没有整体发布,不过,神似的行业信息也有公布。这其中对爆红的博…

keil 查看 stm32 io波形_你知道 KEIL 自带示波器吗?

导读:很多时候我们并不满足于查看变量的值,可能还想看这个变量的历史变化,同时以波形的方式显示出来,这就需要了解 KEIL 另一个有趣的东西:逻辑分析仪。效果图:以 STM32F103RET6,外接 8M 晶振&a…

ai怎么取消颗粒效果_AI教程3个超实用设计技巧教程

1-AI教程-矢量颗粒墨点字体教程第一步选择自己需要图形第二步画一个一样大的黑白渐变,放上最上层。第三步效果-像素化-铜板雕刻第四步选择,粒状点,其他的也可以自己尝试。第五步对象-扩散-外观第六步图像描摹同时点击 扩展第七步选择图形&…

企业门户网站服务器,企业或个人门户网站对服务器前的重要准备 - 酷番云

互联网被称为继报纸、广播、杂志和电视之后的第五大数字媒体。因为传统媒体的高成本。而且还受到时间和地域的限制,除非你付出高昂代价,否则效果不太好。互联网是展示世界的窗口,也是信息交流的双向交流工具。成本低,回报丰厚。互联网已经成为越来越多企…