什么是消息队列
- 简单来说就是保存消息的容器,其本质是队列,具有高并发、高吞吐、高可用的特点
- 主要由发送者、接收者和一个存储消息的缓存区组成
- 采用了队列的数据结构,新消息会被添加到队列的末尾,消息的消费者会从队列头部获取消息进行处理
- 提供了异步通信的能力,让生产者和消费者处理过程中解耦合,提高系统的可拓展性和健壮性
主流的消息队列
- Kafka:高性能、可伸缩、分布式的消息引擎,在高吞吐和低延迟的场景下发挥比较出色,主要用于大数据领域
- RocketMQ:具备可靠性、灵活性和拓展性等特显,相较于其他消息队列,它的可靠性和顺序消息的能力更加出色
- Pulsar:采用的是分层架构,提供了服务器端计算、多协议支持和多租户功能,是下一代云原生分布式消息流平台
- BMQ:同样支持高并发和大量数据的传输,提供了事务、消息确认、持久化等多种机制来保证消息传递的可靠性
Kafka
使用场景
- Kafka在用于构建大规模的实时流数据处理系统中,作为流数据的源和目的地,集成到流处理框架中,提供了可靠的数据传输、高吞吐量和低延迟,能够满足实时流数据处理的需求。
- Kafka可以将数据收集和分发到不同的消费者中,支持水平扩展,具有高可靠性、高容错性、高吞吐量和低延迟等特点,从而可以用于构建大规模日志收集和分析系统。
实现步骤
- 创建Topic:在Kafka中,消息通过Topic进行分类,需要创建一个Topic,并为其指定一个或多个Partition分片
- 编写Producer和Consumer:用某种编程语言编写Producer和Consumer程序,Producer将消息发送到Topic中,Consumer从Topic中读取和处理消息
- 运行Producer和Consumer:启动Producer和Consumer程序,并将消息发送到或接收从刚刚创建的Topic中
数据复制
Kafka采用数据复制机制来保证消息的高可靠性和容错性。在Kafka中,每一个Topic都可以有多个Partitions,每个Partition会有若干个Replicas,每个Replica就是一个数据的完整副本。当某一个Replica挂掉时,其他Replica可以接替它继续提供服务,从而实现高可用。
优化Producer
批量发送
当Producer发送消息时,不是立即将每条消息发送到Broker,而是将多条消息缓存在本地内存中,当积累到一定数量的消息或者等待一定时间后,再一起发送到Broker中。具体配置是修改Producer配置文件中的batch.size和linger.ms参数来配置批量发送的机制。
数据压缩
在批量发送消息之前,Producer可以对消息进行压缩。Kafka提供了多种压缩算法,如Gzip、Snappy、Lz4等。压缩后的消息可以减小消息的大小,从而降低网络带宽的使用和存储成本。具体实现通过compression.type参数来指定要使用的压缩算法。
Broker优化
顺序写
Kafka中的Broker使用顺序写来提高性能。顺序写是指将数据按照顺序写入磁盘,而不是随机写入。这种方式能够减少磁盘寻道时间,提高数据写入速度。
消息索引
Kafka中每个消息都有一个唯一的偏移量,用于标识这个消息在分区中的位置。Kafka使用消息索引来快速定位消息,提高读取速度。消息索引是基于分区的,每个分区都有一个独立的消息索引。
零拷贝
Kafka使用零拷贝技术来提高性能。零拷贝是指在数据传输过程中,避免将数据从一个缓冲区复制到另一个缓冲区,从而减少CPU和内存的开销。Kafka使用零拷贝技术来读取和写入数据,从而提高性能和降低延迟。
RocketMQ
基本组成
- Name Server:负责管理Broker的注册和发现,以及Topic的路由信息。
- Broker:消息的存储和传输的节点,每个Broker可以管理多个Topic,每个Topic可以分为多个Queue。
- Producer:消息的生产者,向Broker发送消息。
- Consumer:消息的消费者,从Broker订阅消息并进行消费。
高级特性
- 消息事务:RocketMQ支持消息事务,可以保证消息的原子性和一致性。Producer可以发送半消息,然后等待确认后再提交或回滚事务,确保消息的可靠性。
- 定时消息:RocketMQ支持定时消息,可以设置消息的发送时间,到指定时间后再发送消息,适用于定时任务等场景。
- 延迟消息:RocketMQ支持延迟消息,可以设置消息的延迟时间,到指定时间后再投递消息,适用于需要延迟处理的场景。
- 批量发送:RocketMQ支持批量发送消息,可以将多条消息合并成一条消息发送,减少网络传输开销,提高发送效率。
- 消息过滤:RocketMQ支持消息过滤,可以通过SQL表达式对消息进行过滤,只有符合条件的消息才会被消费。
- 消息轨迹:RocketMQ支持消息轨迹,可以记录消息的生产和消费过程,便于排查问题和追踪消息。
- 消息重试:RocketMQ支持消息重试,可以设置消息的最大重试次数和重试间隔时间,确保消息的可靠性。
- 高可用性:RocketMQ支持主从同步和故障转移,可以保证消息的高可用性和数据安全性。
- 分布式事务:RocketMQ支持分布式事务,可以与分布式事务框架(如TCC、XA)集成,实现分布式事务的一致性。