这是我参与「第五届青训营 」伴学笔记创作活动的第 10 天
庞大的请求量发起订单,处理订单只能同时处理10单请求,那么就可以考虑用消息队列。
常见消息队列
kafka,rocketMQ,Pulsar,BMQ
kafka
用于离线消息处理,比如日志信息,程序运行中程序状态采集的数据,用户行为,搜索点赞评论等。
首先,创建kafka集群,然后新增topic,编写生产者,消费者组从某个时间点消费,多个partition有容灾的作用。
消息可以做批量处理batch,减少io。通过压缩,减少消息大小。
kafka提高吞吐或者稳定性的功能:
- producer 批量发送,数据压缩
- broker 顺序写,消息索引,零拷贝
- consumer rebalance
kafka缺点:
数据复制问题,集群升级,重启,重新选leader,broker1重启时候broker2还在有新数据,就会数据不一致,出现负载均衡问题。
kafka替换,扩容,缩容
kafka会负载不均衡,迁走数据的时候又有了另一个io问题
-
运维成本高
-
负载不均衡场景,解决方案极其复杂
-
没有自己的缓存,完全依赖page cache
-
controller和coordinator和broker在同一进程中,大量IO会造成性能下降
BMQ
为了解决kafka的问题产生的。兼容kafka,存算分离。
rocketMQ(低延时,峰值秒杀场景)
针对电商业务线,业务涉及广泛,如注册,订单,库存,物流等;同时,也会涉及许多业务的峰值时刻,如秒杀活动,周年庆,定时特惠等。
高级特性
1.库存记录和消息队列的事务保证,事务在rocketMQ中的具体实现是
rocketMQ有回查机制,来确定是提交还是回滚,就是一个两阶段提交。
2.延迟发送
通过定时任务,线程不断调度,
3.处理失败
重试方案和定时方案有些类似,没到最大重试次数,重新投递,超过最大重试次数,发送到死信队列,可以看到消息。