为什么用消息队列?
Tip:异步、削峰、解耦
异步:
订单 优惠券/积分 等。
为什么不用线程?
不易于扩展,每加一个线程需要重新coding,发布。
削峰:
请求放到队列里面,然后至于每秒消费多少请求,就看自己的服务器处理能力去拿。
缺点:
1. 数据一致性
这个其实是分布式服务本身就存在的一个问题,不仅仅是消息队列的问题,但是放在这里说是因为用了消息队列这个问题会暴露得比较严重一点。
如何保证数据一致性? 答:分布式事务
2. 可用性
多了一个中间件
消息队列如何选型?
1.到各个mq的社区,看活跃程度。
2. 语言,是否同公司的技术栈匹配。
3. 可用性,是否为高可用
4. 功能性,不一定越丰富越好,还要考虑中间件重量。
消息队列如何保证高可用?
我了解的mq一种是普通集群的,
高可用,一种是镜像集群,将队列中的信息同步 。或者是多主备双写。
如何保障消息不被重复消费?
如何保证消息队列的幂等性。 在消费者消费后,正常会返回一个确认消息。
1. 内部, mq定期检查消费进度。
2. 外部,持久化mq 消费记录(加重mq),一般不会这么做,个人认为。服务端做校验,上下游有transition_id。
如何保证消息队列可靠传输?
- 生产者弄丢数据, 通过事务,来保障请求生命周期,如果数据丢失,则回滚。
- 消息队列弄丢数据, 持久化(不建议)
- 消费者弄丢数据,通过事务,来保障请求生命周期,如果数据丢失,则回滚。