消息队列的问题记录
为什么要使用消息队列
- 系统解耦,减少服务间的依赖。
- 异步性
- 流量的削峰填谷,可以让后端服务更加从容的应对流量压力
在使用消息队列的过程中,可能遇到哪些问题
- 降低了系统的可用性,mq挂掉,可能会导致系统不可用,所以需要搭建集群保证消息队列的高可用。
- 增加了系统的复杂度,需要考虑消息重复/丢失等问题。
- 数据一致性问题。如何保证数据的最终一致性。
消息队列中积压几百万条消息,应该如何处理
- 首先对消息价值进行评估,按价值的优先级顺序处理,没有价值可以直接删除。
- 确认消费堆积是否由于消费端bug引起,如果是优先解决bug。
- 对消费端进行临时扩容。
系统中引入消息队列后,如何保证系统上下游的数据一致性
- 生产端可采用发布确认机制,即失败重试。也可以采用本地消息表方案,用数据库事务+重试机制保证消息发布成功。
- Broker端需要保证队列的元数据以及数据持久化,防止MQ重启后消息丢失。
- 消费端需要开启Ack确认机制,在业务处理成功后,再向Broker返回Ack。
Kafka具有哪些特性
Kafka相比与传统的消息队列中间件有三个角色:
- 消息系统,Kafka是高性能的消息队列,单机吞吐量可到达百万级别。同时有主题/分区,集群,多副本,回溯消费,消费组等功能。
- 数据存储系统,通过参数配置,Kafka可以永久存储消息。
- 流式处理平台,Kafka不仅为每个流行的流处理框架提供了可靠的数据源,还提供了一个完整的流式处理类库,比如窗口,连接,变换,聚合等各类操作。
RabbitMQ中的vhost有什么作用
vhost对rabbitMQ中的环境进行了隔离,每个vhost下面都有独立的交换机,队列以及绑定关系。
几种主流消息队列对比
名称 | 单机吞吐量 | 集群支持 | 多客户端支持 | 扩展性 | 特点 |
---|---|---|---|---|---|
ActiveMQ | 6k/s | 支持 | 支持大部分主流语言 | 差 | 无 |
RabbitMQ | 1.2w/s | 支持 | 支持大部分主流语言 | 差 | 支持AMQP,多租户,界面友好 |
RocketMQ | 10w+/s | 支持 | java语言 | 好 | 分布式事务 |
Kafka | 100w/s | 支持 | 支持大部分主流语言 | 好 | 回溯消费,主题分区多副本,数据持久化保存 |
本文由作者按照 CC BY 4.0 进行授权