01 MQ作用、种类、选型

为什么要使用消息队列?消息队列的好处?用途?

消息队列用来解决系统之间的通信问题,主要功能就是收发消息,使用消息队列有几个好处:

  1. 解耦:减少了系统之间的依赖关系,如果在一个系统A中直接调用另一个系统B的接口,如果B执行失败,A也会执行失败,两个系统高度耦合,不利于代码的扩展和维护。
  2. 异步:提高系统响应速度,减少用户的等待时间。举例:假设我现在有一个下单功能,它包含了锁定库存,订单入库,给用户发短信3个操作,需要等这3个操作完成后才能给用户返回结果,用户需要等待较长的时间。我可以这样优化,在我这个下单功能中决定下单是否成功的操作是锁定库存,等锁定库存操作完成后就立刻返回结果给用户,然后将请求的数据放到消息队列中,由消息队列异步进行后续2步操作。好处是减少了用户等待的时间,充分利用了服务器的资源在短时间内处理了更多的请求。
  3. 削峰限流:比如说秒杀系统秒杀时一秒钟有5000并发量,但是服务器每秒钟只能请求1000并发量,那多出来的4000个请求,可能会使系统崩溃,解决办法是把多出来的请求到消息队列里中,秒杀系统根据自己能够处理的请求数去消息对队列里拿数据。这样系统就不会崩溃。缺点是增加了系统调用链环节,导致总体响应时延变长。另外上下游系统需要将同步调用改为异步消息,增加了系统的复杂度。
使用消息队列有什么缺点?
  1. 消息队列时延问题
  2. 降低系统的可用性:系统引入的外部依赖越多,越容易挂掉。
  3. 系统复杂度提高:使用 MQ 后可能需要保证消息没有被重复消费、消息没有丢失、保证消息传递的顺序性 等问题;
  4. 一致性问题:A 系统处理完直接返回成功了,通过消息队列通知BCD执行,而且 B 和 D 两个系统也写库成功了,但 C 系统写库失败了,就造成数据不一致了。
你还了解哪些消息队列?
  • ActiveMQ:早期用的比较多,现在基本上没什么人用,社区也不是很活跃。吞吐量是万级,时延ms级别,有较低的概率会丢失消息。
  • RabbitMQ:使用简单,开箱即用。性能也很好,社区活跃度高,吞吐量万级,是用erlang语言开发的,对于java开发者来说很难看懂,所以很难做扩展和二次开发,对于消息堆积的支持不是很好,消息堆积时,性能会急剧下降。如果对性能要求不高,用RabbitMQ即可。
  • RocketMQ:吞吐量很高,达到了几十万级别,经过配置,消息可以做到0丢失,用java语言开发的,比较容易做扩展或二次开发,是目前比较多的消息队列。
  • Kafka:吞吐量很高,达到了几十万级别,也可以做到消息0丢失,功能简单,一般用于大数据领域做实时计算和日志采集。
为什么你这两个项目分别使用了RocketMQ和Kafka?
  • RocketMQ它的吞吐量很高,时延低,稳定性高。适合处理在线业务,比如在交易系统中传递订单。所以我在秒杀系统中使用了它。
  • 而Kafka采用了异步批量设计,这种设计使得它的性能很高,但是带来的问题是它的响应时延比较高,当客户端发送一条消息时,Kafka 并不会立即发送出去,而是攒一批了再发送,所以 Kafka 不太适合在线业务的场景。在我的讨论社区项目中,如果有点赞,评论或者关注等操作,我需要去异步进行消息通知,对实时性要求不高,所以Kafka比较合适。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值