1、RocketMQ有什么作用?
- 异步:数据的产生方不需要关心谁来使用数据,只需要将数据发送到broker,后续需要管消费流程,Rocket也有保证消息可靠性的方案
- 消峰:正常业务系统当流量激增时,有可能会将系统压垮,有了消息队列可以将大量请求缓存起来,慢慢进行消费处理
- 解耦:系统的耦合性越高,容错性就越低,以电商应用为例,用户创建订单后,如果耦合调用库存系统、物流系统、支付系统,任何一个子系统出了故障或者因为升级等原因暂时不可用。这时可以用MQ进行解耦,生产者向broker投递消息,即使子系统出现故障也会先保存在broker中,当故障恢复时,消费者会通过消费队列获取消息
2.RoctetMQ的架构
- NameServer:类似于注册中心,管理组件的注册实例信息,不参与消息的传输
- produce:生产者,消息的发送方
- Consumer:消费者,消息消费方
- broker:暂存和传输消息(包含:commitLog、ConsumeQueue、IndexFile)
- Topic:区分消息的种类,一个发送者可以发送消息给一个或者多个Topic;一个消息的接收者可以订阅一个或者多个Topic消息
- commitLog:CommitLog是存储消息的主体;borker接收到生产者投递来的消息,会存储到commitLog文件中
- ConsumeQueue:逻辑消费队列;可以看成基于topic的commitLog的索引文件因为CommitLog是按照顺序写入的,不同的topic消息都会混淆在一起,而Consumer又是按照topic来消费消息的,这样的话势必会去遍历commitLog文件来过滤topic,这样性能肯定会非常差,所以rocketMq采用ConsumeQueue来提高消费性能。即每个Topic下的每个queueId对应一个Consumequeue
- IndexFile:IndexFile提供了一种可以通过key(topic+msgId)或时间区间来查询消息的方法
3、 RoctetMQ的优缺点
3.1消息堆积的问题:
如果生产者大量发送消息,消费者消费能力不够,会造成broker消息堆积,需要根据实际场景制定解决方案。
3.2系统复杂度提高
MQ的加入大大增加了系统的复杂度,以前系统间是同步的远程调用,现在是通过MQ进行异步调用。如何保证消息没有被重复消费?怎么处理消息丢失情况?那么保证消息传递的顺序性?
3.3一致性问题
A系统处理完业务,通过MQ给B、C、D三个系统发消息数据,如果B系统、C系统处理成功,D系统处理失败。如何保证消息数据处理的一致性?