简介
- 什么是消息队列
消息队列是在消息的传输过程中保存消息的容器,简单点理解就是传递消息的队列,具备先进先出的特点,一般用于异步、解耦、流量 削锋等问题,实现高性能、高可用、高扩展的架构
- 主要概念
Producer:消息生产者,负责产生和发送消息到 Broker。
Broker:消息处理中心,负责消息存储、确认、重试等,一般其中会包含多个 Queue。
Consumer:消息消费者,负责从 Broker中获取消息,并进行相应处理
- 应用场景
应用解耦:消息队列减少了服务之间的耦合性,不同的服务可以通过消息队列进行通信,而不用关心彼此的实现细节。
异步处理:消息队列本身是异步的,它允许接收者在消息发送很长时间后再取回消息。
流量削锋:当上下游系统处理能力存在差距的时候,利用消息队列做一个通用的”载体”,在下游有能力处理的时候,再进行分发与处理。
日志处理:将消息队列用在日志处理中,比如 Kafka 的应用,解决大量日志传输的问题。
消息通讯:消息队列一般都内置了高效的通信机制,因此也可以用在纯消息通讯,比如实现聊天室等。
消息广播:如果没有消息队列,每当一个新业务方接入,都要接入一次新接口。有了消息队列,我们只需要关心消息是否送达了队列,至于谁订阅,是下游的事,无疑极大地减少了开发和联调的工作量
解决方案
目前主流的消息队列解决方案 :kafka、rocketMq、rabbitmq、redis
- Kafka:
适用于高吞吐量、持久性、分布式的消息处理。
提供分布式、可扩展、高容错性的消息发布与订阅机制。
仅提供基本的消息传递,没有高级的消息处理和排队机制。
适用于大规模数据流处理和实时数据管道。
- RocketMQ:
适用于大规模、高吞吐量、可靠性、顺序消息传递。
提供丰富的消息处理功能,包括事务消息、延迟消息等。
具有分布式、高容错性、低延迟、高可靠性的特点。
适用于金融行业等业务场景
- RabbitMQ:
适用于灵活、可靠、异步的消息通信。
提供广泛的消息传递模式(如发布/订阅、点对点)和通道管理功能。
支持多种协议(如AMQP、STOMP、MQTT等)。
适用于任务队列、工作流、事件驱动等异步消息处理场景。
- Redis:
Redis使用内存存储,支持快速读写,适用于消息量较大、消息较小、读写频繁的系统
- 总结
吞吐量高(十万级)、可靠性高 可以选择rokcetMq
吞吐量高(十万级)、可靠性相对较高 可以选择kafka 比如日志场景
吞吐量小(万级) 、可靠性相对低(有较低的概率丢失数据),中小企业可以用
redis 一般用于实时性较高的场景,比如解决聊天消息分布式问题,就可以用redis来解决
可靠性
- 生产者
确认机制
对于没有确认或者失败,进行兜底处理,比如记录在数据中,或者改变数据库某个字段的状态 - 消息队列
持久化数据 - 消息者
消费失败,进行重试或者消息确认,进行再次消费
消息重复
-
redis去重
-
mysql唯一去重
-
分布式锁
注:以上图片来源于网络,如侵权,速告知