RocketMQ

作者: isuntong | 来源:发表于2020-02-22 22:11 被阅读0次

Message Queue

常用:RocketMQ、RabbitMQ(金融)、ActiveMQ(Apache开源)、Kafka(日志读取解析存储)、ZeroMQ

RabbitMQ:AMQP协议,接口复杂
RocketMQ:自然java接口,简单,底层用的是Netty

都支持JMS(java message service)

想象成消息邮局

应用场合:
异步
解耦
削峰

异步:
前端-后端-数据库-后端-前端
前端-MQ-前端 MQ-Consumer

解耦:在两个系统中设置MQ,不用直接关联

削峰:

前端可以动静分离、缓存系统、负载均衡,但是数据库扛不住

RocketMQ将消息放到内存和硬盘

Redis主要用作缓存

业务中台:微服务的聚合

如交易中台:订单确认时调用多个微服务
包括收获地址服务、产品服务、库存服务、优惠服务、积分服务、交易服务等等,相当于一个聚合层。

营销中台、内容中台等等

但是中台是强依赖,强耦合

通过MQ解耦中台和下游服务


kafka 单机百万并发,用在日志收集领域

RocketMQ 单机50w tps,通过配置优化可以做到消息0丢失,但是不能保证消息重复消费

RabbitMQ,性能较差<=10w tps,但是社区活跃,会与消息丢失

ActiveMQ,传统公司可能用,性能差

RocketMQ特性:

订单超过一定时间未支付取消订单。

  1. 定时任务扫描:

把当前时间-创建时间>15min订单取消

但是扫描时延很长

  1. Redis通过发布和订阅进行失效key事件的发布

但是不管收没收到,都只会发一次,存在订单不能被取消的可能

Redis工作模式为单线程,key大量失效工作不过来

service集群的话所有客户端都会收到失效消息,然后重复更新,所以需要分布式锁了。。。

  1. RocketMQ

保证消息不丢失,消息至少被投递一次。(ACK机制)

RocketMQ 延时消息,延迟队列,是其他队列不支持的。(放到中转队列,时间到了再投递到队列)

18个级别的延迟队列,
时间:1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h

延迟队列弊端:

延迟会有,延迟消息过多,消息积压,导致高延迟(开源MQ)

消息转运:从中转到投递只有一个线程搬运

想要支持秒级别任意时间延迟队列怎么做?开源版办不到

但是RocketMQ可定制,美团,滴滴等都有自己的定制。

相关文章

网友评论

      本文标题:RocketMQ

      本文链接:https://www.haomeiwen.com/subject/nzkrqhtx.html