RocketMQ

标题RocketMQ基础知识点

一.MQ解决了系统中的哪些问题?

下单的时候,这个RocketMQ充当一个生产者,把商品的信息放到消息队列里面,比如说这个商品ID,价格。下完单了,redis就会做一个预减库存的操作,然后这个时候RocketMQ充当消费者,去扣减数据库里面的库存,RocketMQ起到了一个异步消费订单的作用,避免了缓存和数据库数据不一致的问题。

二.为什么要用MQ,优缺点

优点:

1.通过异步处理提高系统性能(削峰,减少响应所需时间):在项目中,使用消息队列可以有效的抵御大量订单涌入对系统的冲击。如果不使用消息队列的话,用户的请求数据直接写入数据库,在高并发的情况下,数据库的压力会很大,使得响应速度很慢,但如果使用消息队列的话,用户的请求数据会发送给消息队列,然后立即返回,再由消息队列的消费进程从消息队列中获取数据,异步写入数据库,并且消息队列的处理速度比数据库快,响应速度也得到了改善。

2.解耦:解除两个系统的耦合度(下单和库存)凭借中间层,减少两个系统直接调用的耦合度,使用发布-订阅模式工作,生产者发布,消费者订阅,生产者和消费者之间没有直接耦合。

缺点:

1.系统可用性降低:如果消息中间件宕机,或出现异常情况等,下面的消费者系统就会出现数据异常。

2.系统复杂度提高:要考虑加入消息中间件的一系列问题,消息传递的顺序性,消息有没有被重复消费,高可用等问题(这几个问题我下面会解答)

3.数据的一致性问题:消费者没有成功消费信息,导致消息遗漏,从而发生消息不一致的情况。比如:A系统成功就认为请求成功,但是BCD系统,BD成功了,C没成功,可能就导致数据的不一致。

简单说一下数据一致性问题:下单失败无法正确回补库存,因为整个下单是属于一个事务,若果下单成功,会进行减库存的操作(在Redis中),但是之后订单入库或返回前端的过程中失败,会进行事务回滚,之前操作失效,但是Redis异步写入数据库,会导致订单不出现,但是库存会减少,会导致少卖的现象,有可能造成库存堆积。

数据一致性问题解决方法:
1.JobController任务控制器定时去Redis查询延时任务列表。
2.有问题就将任务进行恢复。
3.任务执行成功,表示流程完成,否则下一个周期重试。

三.为什么不用Kafka、Activemq、Rabbitmq啊,这几个MQ的区别

国内采用的MQ有:ActiveMQ、Kafka、RabbitMQ、RocketMQ,但现在ActiveMQ用的越来越少了,所以我介绍一下其他三种MQ。
(一)Kafka:

1、开发语言:Scala开发
2、性能、吞吐量: 吞吐量所有MQ里最优秀,QPS十万级、性能毫秒级、支持集群部署
3、功能:功能单一
4、缺点:丢数据, 因为数据先写入磁盘缓冲区,未直接落盘。机器故障会造成数据丢失
5、应用场景:适当丢失数据没有关系、吞吐量要求高、不需要太多的高级功能的场景,比如大数据场景。

(二)RabbitMQ:

1、开发语言:Erlang开发
2、性能、吞吐量: 吞吐量比较低,QPS几万级、性能u秒级、主从架构
3、功能:功能单一
4、缺点: Erlang小众语言开发,吞吐量低,集群扩展麻烦
5、应用场景:中小公司对并发和吞吐量要求不高的场景。

(三)RocketMQ:

1、开发语言: java开发
2、性能、吞吐量: 吞吐量高,QPS十万级、性能毫秒级、支持集群部署
3、功能:支持各种高级功能,比如说 延迟消息、事务消息、消息回溯、死信队列、消息积压等等
4、缺点:官方文档相对简单可能是RocketMQ目前唯一的缺点
5、应用场景:适当丢失数据没有关系、吞吐量要求高、不需要太多的高级功能的场景,比如大数据场景。

四.既然你用到了MQ,虽然说达到了异步的目的,但是也出现了一些新的问题,怎么解决这些问题呢?

1. 首先说说消息中间件实现异步,首先你要

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值