关于消息队列

消息队列(Message Queue):一种用于在应用程序间传递消息的通信方式,允许应用程序异步地发送和接收消息(不用直接连接对方)

消息(Message):在应用间传送的数据,消息可以非常简单(只包含文本字符串)也可以很复杂(包含嵌入对象)

队列(Queue):一个数据结构,可以存储数据,满足先进先出的顺序

消息队列的应用场景

  • 应用解耦:在多个系统中,合理使用MQ可以使得系统兼容性更好,扩展性更高的同时,减少原代码修改
  • 加快响应:异步处理请求,可以节省响应时间,优化体验
  • 削峰填谷:增大系统可用性,保证系统稳定性

消息队列缺点

  • 降低系统可用性:系统外部引入的依赖越多,越容易挂掉
  • 系统复杂度提高:使用MQ后需要额外考虑例如:消息是否被重复消费,处理消息丢失,保证消息传递顺序等问题
  • 一致性问题:在多个系统中,需要注意部分系统未能成功处理,导致数据不一致的问题

消息队列保证顺序性

  • 生产者有序:单线程消费来保证消息的顺序性
  • 生产者无序:对消息编号,消费者处理时根据编号进行判断。多个消费者时,可以考虑增加分布式锁

参考文章:如何保证消息队列的顺序性 (yuque.com)

消息队列不被重复消费

  • 生产者每发送一条数据,添加一个全局唯一id,消费者消费到消息后,先依据id去redis中查询,如果redis没有就处理消息,然后消息id写入redis。如果redis中存在,就说明已经消费,不在重复处理
  • 基于数据库唯一键,保证重复数据不会重复插入

常见的消息队列

  1. Apache Kafka:Apache Kafka 是一个高吞吐量的分布式消息系统,适用于处理大规模的实时数据流。它主要用于构建实时流处理应用和事件驱动架构,具有高性能、持久化、可扩展等特点。
  2. RabbitMQ:一种开源消息队列,RabbitMQ 支持多种消息传递模式,如点对点(Point-to-Point)和发布-订阅(Publish-Subscribe)
  3. Apache ActiveMQ:Apache ActiveMQ 是一个成熟的开源消息队列中间件,支持多种协议(如AMQP、STOMP、OpenWire)和消息模型。它具有强大的功能和灵活的路由规则,适用于构建可靠的企业级应用。
  4. Redis:Redis 是一个内存数据库,不仅可以用作缓存系统,还可以作为消息队列中间件使用。它通过提供发布-订阅模式和列表(List)数据结构来实现消息队列功能,并支持持久化存储,具有快速和低延迟的特点。
  5. Apache Pulsar:Apache Pulsar 是一个具有分层架构的分布式消息和流处理平台。它支持多租户和可插拔的存储,具有低延迟、高吞吐量和可伸缩性的特点,适合大规模实时数据处理。