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特性:
订单超过一定时间未支付取消订单。
- 定时任务扫描:
把当前时间-创建时间>15min订单取消
但是扫描时延很长
- Redis通过发布和订阅进行失效key事件的发布
但是不管收没收到,都只会发一次,存在订单不能被取消的可能
Redis工作模式为单线程,key大量失效工作不过来
service集群的话所有客户端都会收到失效消息,然后重复更新,所以需要分布式锁了。。。
- RocketMQ
保证消息不丢失,消息至少被投递一次。(ACK机制)
RocketMQ 延时消息,延迟队列,是其他队列不支持的。(放到中转队列,时间到了再投递到队列)
18个级别的延迟队列,
时间:1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h
延迟队列弊端:
延迟会有,延迟消息过多,消息积压,导致高延迟(开源MQ)
消息转运:从中转到投递只有一个线程搬运
想要支持秒级别任意时间延迟队列怎么做?开源版办不到
但是RocketMQ可定制,美团,滴滴等都有自己的定制。
网友评论