中间件RocketMQ的异步解耦和削峰

Posted 西门阿浪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了中间件RocketMQ的异步解耦和削峰相关的知识,希望对你有一定的参考价值。

前言

随着分布式和微服务的发展,对于传统的单体结构项目带来颠覆式的改变。

MQ基础

MQ是一种非常常见的上下游 “逻辑解耦 + 物理解耦” 的消息通信服务。分布式应用的各个系统之间存在通信问题,有了消息队列,我们只需要关心消息是否送达了队列,至于谁希望订阅,接下来收到消息如何处理,是下游的事情,无疑极大地减少了开发和联调的工作量。

1、逻辑关系

消息上游(生产者):发送方将消息投递给MQ

消息下游(消费者):MQ将消息投递给接收方

2、常见问题

  • 1、重复消费

发送方发送失败了,然后执行重试,这样就可能产生重复的消息。或者我消费端处理失败了,请求重发,这样也会产生重复的消息。

  • 2、顺序消费

在发布订阅模型中,对于主题是无顺序的,那么这个时候就会导致消费消息的时候没有按照生产者的发送顺序消费。在同一个系统中可以使用事务来进行解决,例如Spring中添加@Transactional注解。不同系统就需要用到分布式事务。

  • 3、消息堆积

消费者如果消费很慢或者生产者生产消息很快,这样是不是会将消息堆积在消息队列中?

  • 4、高可用

采用集群,增加了程序的复杂度。

3、应用场景

1)、调用方实时依赖执行结果的业务场景,请使用调用,而不是MQ。

2)、数据驱动的任务依赖:既A3的执行需要A2的结果,A2的执行需要A1的结果。这种需要MQ,不要选择传统“cron排班表”。MQ只用来传递上游任务执行完成的消息,并不用于传递真正的输入输出数据。

task1准时开始,结束后发一个“task1-done”的消息,task2订阅“task1-done”的消息,收到消息后第一时间启动执行,结束后发一个“task2 done”的消息。以此类推

3)、上游不关心执行结果:上游需要关注执行结果时要用“调用”,上游不关注执行结果时,就可以使用MQ了。

4)、异步返回执行时间长:有时候上游需要关注执行结果,但执行结果时间很长(典型的是调用离线处理,或者跨公网调用),也经常使用回调网关+MQ来解耦

RocketMQ详解

RocketMQ是一个主题模型的消息中间件,具有高性能、高可靠、高实时、分布式 的特点。

RocketMQ通过使用在一个Topic中配置多个队列,并且每个队列维护每个消费者组的消费位置 实现了 主题模式/发布订阅模式

1、架构模型

  • 队列模型(点对点模型):

模型中有且只是一个队列,只能存在一个消息消费者。

  • 主题模型(发布/订阅模型):

在主题模型中,消息的生产者称为【发布者(Publisher)】,消息的消费者称为【订阅者(Subscriber)】,存放消息的容器称为【主题(Topic)】。发布者将消息发送到指定主题中,订阅者需要{提前订阅主题}才能接受特定主题的消息。可以进行消息广播,将一个消息发送给多个消费者。

RocketMQ主题中存在多个队列,生产者每次生产消息之后是指定主题中的某个队列发送消息的,一个队列只会被一个消费者消费。消费者组中的消费者个数和主题中队列个数决定了并发能力。

消费位移(offset):

发布订阅模式中一般会涉及到多个消费者组,消息被一个消费者组消费完之后是不会删除的,因为其它消费者组也需要。每次消费者组消费完会返回一个成功的响应,然后队列再把维护的消费位移加一,这样就不会出现重复消费问题了。

2、架构角色

  • NameServer(注册中心):

提供Broker管理和路由信息管理。Broker将自己的路由信息注册到NameServer中,消费者和生产者就从NameServer中获取路由表然后照着路由表的信息和对应的Broker进行通信。

存在的目的为了解决消费者和生产者直接和多个Broker相连产生的耦合问题。为了高可用,采用去中心化,没有设置主节点。通过单个Broker和所有NameServer保持长连接,并且在每隔30秒Broker会向所有Nameserver发送心跳,心跳包含了自身的 Topic 配置信息。

  • Broker(消息队列服务器):

主要负责消息的存储、投递和查询以及服务高可用保证。生产者生产消息到Broker,消费者从Broker拉取消息并消费。一个Topic分布在多个Broker上,一个Broker可以配置多个Topic,它们是多对多的关系。

Broker需要保证高可用,因此需要使用多个Broker来保证负载均衡。broker采用master/slave的结构,salve定时从 master同步数据,如果master宕机,则slave提供消费服务,但是不能写入消息。

  • Producer:

消息生产者,支持分布式集群方式部署。

  • Consumer:

消息消费者,支持分布式集群方式部署。存在两种启动模式广播(Broadcast)和集群(Cluster)。

广播模式:一条消息会发送给 同一个消费组中的所有消费者。
集群模式:消息只会发送给一个消费者。

异步

解耦

削峰

高效延时消息

高效定时任务

高效幂等性设计

待续。。。。

在此欢迎各位技术大佬指点小弟技术上的漏洞,也希望可以一起在技术上能有更多的交流。

微信:wxzhaojie777


以上是关于中间件RocketMQ的异步解耦和削峰的主要内容,如果未能解决你的问题,请参考以下文章

Windows安装RocketMQ

Windows安装RocketMQ

实战:消息中间件,解耦异步削峰,到底该如何使用

RocketMQ分布式消息队列

漫谈消息队列:以Kafka和RocketMQ为例

以Kafka和RocketMQ为例,漫谈消息队列