消息队列MQ
你们为什么使⽤mq?具体的使⽤场景是什么?
mq的作⽤很简单,削峰填⾕。以电商交易下单的场景来说,正向交易的过程可能涉及到创建订单、扣减库存、扣减活动预算、扣减积分等等。每个接⼝的耗时如果是100ms,那么理论上整个下单的链路就需要耗费400ms,这个时间显然是太⻓了。
如果这些操作全部同步处理的话,⾸先调⽤链路太⻓影响接⼝性能,其次分布式事务的问题很难处理,这时候像扣减预算和积分这种对实时⼀致性要求没有那么⾼的请求,完全就可以通过mq异步的⽅式去处理了。同时,考虑到异步带来的不⼀致的问题,我们可以通过job去重试保证接⼝调⽤成功,⽽且⼀般公
司都会有核对的平台,⽐如下单成功但是未扣减积分的这种问题可以通过核对作为兜底的处理⽅案。

使⽤mq之后我们的链路变简单了,同时异步发送消息我们的整个系统的抗压能⼒也上升了。
那你们使⽤什么mq?基于什么做的选型?
我们主要调研了⼏个主流的mq,kafka、rabbitmq、rocketmq、activemq,选型我们主要基于以下⼏个点去考虑:
1.由于我们系统的qps压⼒⽐较⼤,所以性能是⾸要考虑的要素。
2.开发语⾔,由于我们的开发语⾔是java,主要是为了⽅便⼆次开发。
3.对于⾼并发的业务场景是必须的,所以需要⽀持分布式架构的设计。
4.功能全⾯,由于不同的业务场景,可能会⽤到顺序消息、事务消息等。
基于以上⼏个考虑,我们最终选择了RocketMQ。

你上⾯提到异步发送,那消息可靠性怎么保证?
消息丢失可能发⽣在⽣产者发送消息、MQ本身丢失消息、消费者丢失消息3个⽅⾯。
⽣产者丢失
⽣产者丢失消息的可能点在于程序发送失败抛异常了没有重试处理,或者发送的过程成功但是过程中⽹络闪断MQ没收到,消息就丢失了。
由于同步发送的⼀般不会出现这样使⽤⽅式,所以我们就不考虑同步发送的问题,我们基于异步发送的场景来说。
异
654



被折叠的 条评论
为什么被折叠?



