消息队列
消息队列简介
消息队列(Message Queue) 是一种用于 进程间通信 或 同一进程内不同线程间 通信的数据结构,常用于消息的传输。它提供了一种在多个消息生产者和消息消费者之间传输消息的机制,而无需生产者和消费者同时处于活跃状态。消息队列在分布式系统中使用更为频繁。
基本概念
生产者(Producer) :也称消息生产者,负责创建并发送消息实体到消息队列。
消费者(Consumer) :也称消息消费者,负责从消息队列中接收并处理消息实体。
队列(Queue) :存储并管理消息的缓冲区,具备队列 先进先出(FIFO 的特点。
主题(Topic) :通常以主题的方式来区别消息类别。在发布-订阅模型中,消费者主要通过主题来订阅消息。
工作模式
发布/订阅模式(Publish/Subscribe) :消息由生产者生产并发送到消息队列,消费者通过订阅消息(主题)进行消息消费。多个消费者可以订阅同一消息(主题)然后消费消息副本。
点对点模式(Point-to-Point) :一个生产者对应一个消费者,一旦消息被消费,该消息将从消息队列中移除。
特点
异步通信 :允许生产者和消费者不同时在线,生产者亦无须等待消息被接收的确认。
持久化 :消息队列通常支持消息持久化存储,以确保消息离线消费或消费者空闲时消费以及消息复原。
可靠传输 :提供可靠传输机制,如确认,重传等。
负载均衡 :消息队列可平衡生产者和消费者的负载,提高系统吞吐量。
协议
AMQP(Advanced Message Queuing Protocol):一种网络协议,定义了消息的格式和传输规则,如
RabbitMQ
。MQTT(Message Queuing Telemetry Transport):一种轻量级的消息传输协议,适用于带宽有限和不稳定的网络环境。
STOMP(Simple Text Oriented Messaging Protocol):一种简单的文本导向的消息协议。
应用场景
应用解耦:降低系统间的直接依赖,提高系统的可维护性。
异步处理:将耗时的操作异步处理,提高系统的响应速度。
系统缓冲:在系统高峰期时,消息队列可以起到缓冲作用,防止系统过载。
数据分发:将数据从一个系统分发到多个系统,如日志收集、事件通知等。
常见消息队列实现对比
消息队列 | 持久化 | 可用性 | 吞吐量 | 延迟 | 应应用场景 |
---|---|---|---|---|---|
ActiveMQ | 二进制文件,插件,DB,内存 | 高(主从) | 万级 | ms级 | 需要支持多种协议的继承常见,消息吞吐两要求非极端的应用 |
RabbitMQ | 配置文件(.conf) | 高(主从) | 万级 | μs级 | 高可用,高可靠,灵活路由的应用 |
RocketMQ | CommitLog文件 | 极高(分布式) | 十万级 | ms级 | 高吞吐量,可靠消息,消息严格按序处理的应用 |
Apache Kafka | 日志文件 | 极高(分布式) | 十万级 | ms级内 | 大数据,流处理,高吞吐量,可扩展的应用 |
Apache Kafka
简介
Apache Kafka 是一个开源流处理平台,由 LinkedIn
开发,并于 2011 年成为 Apache 软件基金会的一部分。由于其极高的吞吐量,高性能,可扩展的特点,特别适合处理实时流数据,因此通常被用在大数据领域,实现各类流数据的汇总和传输。
Kafka的核心概念
Topics:
Kafka
中的消息是以主题作为分类的单位。生产者向主题发送消息,而消费者从主题读取消息。Producers:消息生产者,负责创建并发送消息到 Kafka。
Consumers:消息消费者,从 Kafka 读取消息并消费。
Brokers:Kafka 集群由多个 Broker 组成,每个 Broker 是一个Kafka服务器实例,负责存储数据并处理客户端(包括生产者和消费者)的请求。
ZooKeeper:Kafka 使用 ZooKeeper 来协调 Broker,并保持Kafka集群配置的一致性。
特性
高吞吐量:Kafka 能够处理大量的数据,支持每秒数百万条消息。
可扩展性:Kafka 支持水平扩展,可以通过添加更多的 Broker 来增加吞吐量。
持久性:Kafka 将消息存储在磁盘上,支持数据备份和恢复。
容错性:Kafka 支持数据副本,即使在 Broker 故障的情况下也能保证数据不丢失。
实时性:Kafka 能够实时处理数据流,延迟非常低。
流处理:Kafka 提供了 Kafka Streams API,允许用户在应用程序中直接进行流处理。
工作原理
待补充…
使用场景
实时数据处理:如实时分析、实时监控、实时报告等。
日志聚合:收集不同系统的日志数据,集中进行处理和分析。
流式处理:对实时数据流进行转换、聚合等操作。
事件源:存储可追溯的事件记录,用于审计、分析等目的。
Kafka 的优势
高吞吐量:适合处理大量数据。
可扩展性:支持集群扩展,能够处理更多的数据。
容错性:数据副本机制保证了数据的安全。
丰富的生态系统:有许多与 Kafka 集成的工具和框架,如 Apache Flink、Apache Spark、ELK Stack 等。