文章

消息队列的问题记录

为什么要使用消息队列

  • 系统解耦,减少服务间的依赖。
  • 异步性
  • 流量的削峰填谷,可以让后端服务更加从容的应对流量压力

在使用消息队列的过程中,可能遇到哪些问题

  • 降低了系统的可用性,mq挂掉,可能会导致系统不可用,所以需要搭建集群保证消息队列的高可用。
  • 增加了系统的复杂度,需要考虑消息重复/丢失等问题。
  • 数据一致性问题。如何保证数据的最终一致性。

消息队列中积压几百万条消息,应该如何处理

  • 首先对消息价值进行评估,按价值的优先级顺序处理,没有价值可以直接删除。
  • 确认消费堆积是否由于消费端bug引起,如果是优先解决bug。
  • 对消费端进行临时扩容。

系统中引入消息队列后,如何保证系统上下游的数据一致性

  • 生产端可采用发布确认机制,即失败重试。也可以采用本地消息表方案,用数据库事务+重试机制保证消息发布成功。
  • Broker端需要保证队列的元数据以及数据持久化,防止MQ重启后消息丢失。
  • 消费端需要开启Ack确认机制,在业务处理成功后,再向Broker返回Ack。

Kafka具有哪些特性

Kafka相比与传统的消息队列中间件有三个角色:

  1. 消息系统,Kafka是高性能的消息队列,单机吞吐量可到达百万级别。同时有主题/分区,集群,多副本,回溯消费,消费组等功能。
  2. 数据存储系统,通过参数配置,Kafka可以永久存储消息。
  3. 流式处理平台,Kafka不仅为每个流行的流处理框架提供了可靠的数据源,还提供了一个完整的流式处理类库,比如窗口,连接,变换,聚合等各类操作。

RabbitMQ中的vhost有什么作用

vhost对rabbitMQ中的环境进行了隔离,每个vhost下面都有独立的交换机,队列以及绑定关系。

几种主流消息队列对比

名称单机吞吐量集群支持多客户端支持扩展性特点
ActiveMQ6k/s支持支持大部分主流语言
RabbitMQ1.2w/s支持支持大部分主流语言支持AMQP,多租户,界面友好
RocketMQ10w+/s支持java语言分布式事务
Kafka100w/s支持支持大部分主流语言回溯消费,主题分区多副本,数据持久化保存
本文由作者按照 CC BY 4.0 进行授权