故里学Java

进大厂必备的RocketMQ你会吗?

2020-11-18  本文已影响0人  故里学Java

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

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

RocketMQ基本概念

RocketMQ的特性

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

  1. 顺序消息

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

  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没有任何保证。消息重投可以最大限度的保证消息发送成功、不丢失,但是也会导致消息重复,当消息量大、网络不好的时候消息重复的概率就会提高。

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

  1. 死 信队列

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

  1. 流量控制

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

生产者流控:

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

消费者流控:

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

RocketMQ技术架构

我们可以看到,RocketMQ架构上分为四部分,分别为Producer、Consumer、NameServer、Broker。

RocketMQ部署架构

以多Master多Slave模式为例:

集群的工作流程;

上一篇 下一篇

猜你喜欢

热点阅读