什么是RocketMQ
RocketMQ作为一款纯java、分布式、队列模型的开源消息中间件,支持事务消息、顺序消息、批量消息、定时消息、消息回溯等。主要功能是异步解耦和流量削峰:。
常见的MQ主要有:ActiveMQ、RabbitMQ、Kafka、RocketMQ
四种消息中间件的基本介绍:
消息中间件的使用场景:
异步与解耦:
当我们下了一个订单之后,订单系统会进行RPC同步调用支付系统、库存系统、物流系统等,那么系统之间就会有耦合性,耦合性越高的话,容错性就越低,比如我们的支付系统如果宕机了,就会导致我们整个交易的异常,从而影响用户的体验。
如果我们中间加入了消息中间件,不管是支付还是库存等系统,都是通过异步的方式进行调用的,如果其中一个系统宕机了,不会影响我们用户下单的使用。
本质上MQ第一步完成了异步,第二步完成了解耦。那么系统的容错性就越高。
流量削峰:
流量削峰也可以叫削峰填谷,比如一些互联网公司大促场景,双十一、店庆或者秒杀活动,都会使用到消息中间件。
如果在不使用消息中间件或者没有流量削峰,每秒是很高的并发,这个时候如果我们的A系统,如果要将数据写入到我们的MYSQL中,受限于MYSQL本身服务的上限,最大我们只能每秒处理请求,这个时候会有大量的消息进行堆积,从而导致A系统的奔溃。
这个时候我们可以将用户的请求消息通过MQ进行写入,因为消息中间件本身是对数据量处理比较高的一个系统,所以对于每秒0请求,消息中间件可以处理,然后A系统作为消息中间件的一个消费者,以固定的速度从MQ中拉取个消息,完成我们的业务操作,用时间换空间从而确保我们A系统的稳定性。
数据分发:
如果S系统,在对系统进行开发的时候,需要对接多个(A、B、C、D)系统,使用传统的接口调用,中间有改动就需要修改我们的代码,当新增了A系统,我们需要去修改代码去调用A系统来完成对应的业务逻辑,如果我们当中的D系统需要移除,同样也需要修改代码删除对应的接口调用。
如果S系统使用了消息中间件,我们S系统只要将消息交给MQ,剩下的不论是新增还是移除,还是原有的,他们都只是消息中间件的一个消费者,这个时候我们就便于数据的分发。
比如我们新增一个系统,我们只需要新增一个MQ的消费者,直接从MQ里面拿消息就可以,当我们需要移除一个系统的时候,只需要取消对MQ消息的监听即可。对于我们原有的S系统不需要进行额外的修改。如果使用MQ作为数据分发,减少数据的修改,提高开发的效率。
RocketMQ基本概念
RocketMQ主要有四大核心组成部分:NameServer、Broker、Producer以及Consumer四部分。这些角色通常以集群的方式存在,RocketMQ基于纯Java开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点。
对于RockerMQ而言,我们想要启动,必须首先启动NameServer,在启动Brober主机,Brober会向NameServer注册对应的路由和服务(Broker地址、主体和),Producer会进行路由的发现,向NameServer请求Broker路由信息,进行消息的发送。
作为Consumer要连通NameServer,获取到相关的路由信息,方便我们进行消息的订阅。
Broker也是一个很重要的角色,主要负责消息的存储,不管是生产消息还是订阅消息,消息的来源都是Broker,一般来说消息的发送(Producer)只会发到主节点,然后Broker会进行消息的同步,同步到从节点,作为消费者(Consumer)也只会优先从Master节点,获取消息,进行消费,除非主节点不可用或者非常繁忙,才会从从节点进行消费,Broker除了消息的中转,还负责消息的持久化以及主从数据之间的复制
NameServer:
NameServer是一个服务与注册的发现中心。也是整个RocketMQ的“大脑”,所以RocketMQ需要先启动NameServer再启动RocketMQ中的Broker
NameServer是一个几乎无状态节点,可集群部署,节点之间无任何信息同步。NameServer底层由Netty实现,是内存式存储,所以NameServer中的broker、topic不会持久化。
NameServer其角色类似Dubbo和zookeeper,主要负责Broker的动态注册与发现。为什么不使用zookeeper?rocketmq主要是在分布式情况下使用追求性能,因为zookeeper最求最终一致性,所以在性能上会有所折扣。
Broker:
消息服务器(Broker)是消息存储中心,主要作用是接收来自Producer的消息并存储,Consumer从这里取得消息。存储与消息相关的元数据,包括用户组、消费进度偏移量、队列信息等。从部署结构图中可以看出Broker有Master和Slave两种类型,Master既可以写又可以读,Slave不可以写只可以读。
Producer:
Producer也称为消息发布者(生产者),负责生产并发送消息至Topic。生产者向broker发送由业务应用程序系统生成的消息。RocketMQ提供了发送:同步、异步和单向(one-way)的多种范例。
Consumer:
也称为消息订阅者,负责从Topic接收并消费消息。消费者从brokers那里拉取信息并将其输入应用程序。从Master拿到消息,执行完成后,会发送一个消息给Broker进行确认,这个就是ACK确认
RocketMQ基本概念
分组(Group)
Group分为两个部分生产者和消费者
生产者:表示发送同一类消息的Producer,通常情况下发送逻辑是一致的。发送普通消息时,用于标识使用,没有特别的用处。
主要用来作用于事务消息,当事务消息中某条消息一直处于等待状态并超时,Broker会回查同一个Group下的其他producer,确定该消息是