消息队列
-
- 优缺点
- 特点
- 解耦
- 异步
- 削峰
- 缺点
- 系统可用性降低
- 兜底:代码中try、catch 异常捕捉后直接进行数据库操作,或者 搭建高可用集群,Kafka集群、RocketMQ集群
- 提高复杂度
- 消息重复(消费端的幂等性设计)、消息丢失(主要集中RabbitMQ)、消息的顺序(业务:1,下单 2,支付 3,发送物流 4,通知)
- 一致性问题
- a,b,c三个系统,a、b两个写入数据库成功了,c系统写库失败?使用分布式事务来控制。RocketMQ提供了,其他的seta方式
- 系统可用性降低
- 特点
- 解耦
- 异步
- 削峰
- 缺点
- 系统可用性降低
- 兜底:代码中try、catch 异常捕捉后直接进行数据库操作,或者 搭建高可用集群,Kafka集群、RocketMQ集群
- 提高复杂度
- 消息重复(消费端的幂等性设计)、消息丢失(主要集中RabbitMQ)、消息的顺序(业务:1,下单 2,支付 3,发送物流 4,通知)
- 一致性问题
- a,b,c三个系统,a、b两个写入数据库成功了,c系统写库失败?使用分布式事务来控制。RocketMQ提供了,其他的seta方式
- 系统可用性降低
- 特点
- RabbitMQ、Kafka、RocketMQ 对比
- 性能角度
- RabbitMQ 1.2w
- Kafka 100w
- Rocket MQ 10w
- 集群扩展支持
- Rabbit MQ集群很弱(确保高可用 不能扩展性能)
- Kafka 天生分布式,支持动态扩展
- Rocket MQ 天生分布式,支持动态扩展
- 功能
- Rabbit MQ比较丰富(死信消息、延迟消息)
- Kafka比较弱
- Rocket MQ比较丰富(死信、延迟、消息回溯、消息过滤)
- 性能角度
- 常见问题及解决方案
- 重复消费
- 死信消息
- MVCC(多版本控制)
- 对整体业务改动较大,使用很不便利,代价较高
- 去重表(MySQL、Redis)
- 表上构建唯一性索引
- try{处理业务:插入数据/判断是否存在}catch(exception e){return
- 重复消费
- 优缺点