网站加速工具,学做卤菜网站,做网站的公司金坛,哪些网站是jsp做的点击关注故里学Java右上角设为星标好文章不错过关于消息队列#xff0c;相信大家都不陌生#xff0c;现在的中大型项目中或多或少都有使用到消息队列#xff0c;对于消息队列大家可能都有一定的了解#xff0c;使用消息队列可以解决什么样的问题故里学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的功能特性很多这里只简单介绍几个顺序消息指的是可以按照消息的发送顺序来消费有时候一组消息需要按照指定的顺序消费才有意义但是多个消费者是并行消费的RocketMQ可以严格的保证消息的有序。顺序消息可以分为两类全局顺序消息和分区顺序消息。全局顺序是指某个topic下所有的消息都要保证顺序部分顺序消息只要保证每一组消息被顺序消费。全局顺序消费对于指定的一个Topic所有的消息按照严格的先入先出的顺序依次进行发布和消费分区顺序消费对于指定的一个Topic所有的消息根据sharding key进行区块分区同一个分区的消息按照先入先出的顺序进行消费。性能较全局顺序高。事务消息RocketMQ事务消息是指应用本地事务和发送消息操作可以被定义在全局事务中要么同时成功要么同时失败RocketMQ的事务消息提供了类似X/Open XA的分布式事务功能通过事务消息能达到分布式事务的最终一致性。定时消息定时消息是指消息发送到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存入特定的queuequeueId delayTimeLevel – 1即一个queue只存相同延迟的消息保证具有相同发送延迟的消息能够顺序消费。broker会调度地消费SCHEDULE_TOPIC_XXXX将消息写入真实的topic。回溯消息回溯消息是指消费者以及消费成功由于业务需要需要重新消费如果要实现此功能Broker在向消费者投递成功消息后消息仍然需要保留。重新消费一般是有一定时间纬度的RocketMQ支持按照时间回溯消息时间维度可以精确到毫秒。消息重投生产者在发送消息时同步消费失败会重投异步消息有重试oneway没有任何保证。消息重投可以最大限度的保证消息发送成功、不丢失但是也会导致消息重复当消息量大、网络不好的时候消息重复的概率就会提高。我们可以根据需要设置消息重试策略retryTimesWhenSendFailed同步发送失败重投次数默认为2 在重投的时候不会发送给上次失败的broker会尝试向其他的broker发送尽可能的保证消息不丢失。retryTimesWhenSendAsyncFailed异步发送失败重试次数异步的重试还是选择上次的broker不会选择其他的broker不能保证消息不丢失。retryAnotherBrokerWhenNotStoreOK消费刷盘超时或者slave不可用是否尝试发送给其他的broker默认为false非常重要的消息我们可以开启。死 信队列死信队列用于处理消费失败的消息当消息消费失败的时候会自动进行消息重试如果达到最大重试次数后还是没有消费成功就说明正常情况下不能正确的消费该消息此时消息队列会把这个消息发送到该消费者对应的特殊队列中。RocketMQ将这种消息称为死信消息将这种存储死信消息的队列称为死信队列可以通过console控制台对死信队列中的消息进行重发。流量控制生产者流控一般是因为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模式为例我们可以看到RocketMQ架构上分为四部分分别为Producer、Consumer、NameServer、Broker。Producer消息发布的角色支持分布式集群方式部署。Producer通过MQ的负载均衡模块选择相应的Broker集群队列进行消息投递投递的过程支持快速失败并且低延迟。Consumer消息消费的角色支持分布式集群方式部署。支持以push推pull拉两种模式对消息进行消费。同时也支持集群方式和广播方式的消费它提供实时消息订阅机制可以满足大多数用户的需求。NameServerNameServer是一个非常简单的Topic路由注册中心其角色类似Dubbo中的zookeeper支持Broker的动态注册与发现。主要包括两个功能Broker管理NameServer接受Broker集群的注册信息并且保存下来作为路由信息的基本数据。然后提供心跳检测机制检查Broker是否还存活路由信息管理每个NameServer将保存关于Broker集群的整个路由信息和用于客户端查询的队列信息。然后Producer和Conumser通过NameServer就可以知道整个Broker集群的路由信息从而进行消息的投递和消费。NameServer通常也是集群的方式部署各实例间相互不进行信息通讯。Broker是向每一台NameServer注册自己的路由信息所以每一个NameServer实例上面都保存一份完整的路由信息。当某个NameServer因某种原因下线了Broker仍然可以向其它NameServer同步其路由信息Producer,Consumer仍然可以动态感知Broker的路由的信息。BrokerBroker主要负责消息的存储、投递和查询以及服务高可用保证为了实现这些功能Broker包含了以下几个重要子模块。RocketMQ部署架构以多Master多Slave模式为例集群的工作流程;启动NameServerNameServer起来后监听端口等待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 -往期回顾 大家好我是故里学Java公号作者你可以叫我故里。一直坚信技术能改变生活愿保持初心加油技术人点个赞证明你还爱我