0


消息队列(RocketMQ和Kafka)

一、常用的消息队列

二、应用场景

  • 应用解耦 :消息队列减少了服务之间的耦合性,不同的服务可以通过消息队列进行通信,而不用关心彼此的实现细节。
  • 异步处理 :消息队列本身是异步的,它允许接收者在消息发送很长时间后再取回消息。
  • 流量削锋 :当上下游系统处理能力存在差距的时候,利用消息队列做一个通用的”载体”,在下游有能力处理的时候,再进行分发与处理。
  • 日志处理 :日志处理是指将消息队列用在日志处理中,比如 Kafka 的应用,解决大量日志传输的问题。
  • 消息通讯 :消息队列一般都内置了高效的通信机制,因此也可以用在纯的消息通讯,比如实现点对点消息队列,或者聊天室等。
  • 消息广播 :如果没有消息队列,每当一个新的业务方接入,我们都要接入一次新接口。有了消息队列,我们只需要关心消息是否送达了队列,至于谁希望订阅,是下游的事情,无疑极大地减少了开发和联调的工作量。

三、缺点

  • 系统可用性降低
  • 系统复杂度提高
  • 一致性问题

四、RocketMQ

1、架构模式
  • RocketMQ的架构采用了分布式的Broker模式,其中NameServer负责维护路由信息,Broker负责存储消息,Producer负责发送消息,Consumer负责接收和处理消息。
2、核心组件
  • NameServer:负责维护整个RocketMQ集群的元数据信息,包括Topic和Broker的路由信息。
  • Broker:消息存储的核心组件,负责接收、存储和传递消息。
  • Producer:消息的生产者,负责产生并发送消息到Broker。
  • Consumer:消息的消费者,负责从Broker拉取消息并进行处理。
3、性能特点
  • 顺序消息处理能力:RocketMQ提供了强大的顺序消息处理能力,确保消息按照发送的顺序被消费。
  • 同步双写机制:RocketMQ采用同步双写机制来提高数据的可靠性和持久性。这意味着每一条消息都会被同步写入主节点和备份节点,从而大大降低了数据丢失的风险。
4、适用场景
  • 注重的是分布式的消息存储和传递能力,适用于高并发、低延迟,对消息传递速度和可靠性有较高要求的场景。

五、Kafka架构

1、架构模式
  • Kafka采用了分布式的发布-订阅模式,其中Zookeeper负责集群管理和协调,Broker负责消息的存储和传递,Producer负责生产消息,Consumer负责消费消息,Topic用于消息的分类和管理,Partition用于消息的分片存储。
2、核心组件
  • Broker:消息的存储和传递中心,多个 Kafka Broker 组成一个卡夫卡集群 Kafka Cluster
  • Zookeeper:负责集群的管理和协调。
  • Producer:生产消息的组件。
  • Consumer:订阅主题、消费信息的组件。
  • 主题Topic:消息队列, 生产者和消费者面向的都是一个 topic, Producer 将消息发送到特定的主题,Consumer 通过订阅特定的主题来消费消息。
  • 分区Partition:为了实现扩展性,一个非常大的 topic 可以分布到多个 broker(即服务器)上,一个 topic 可以分为多个 partition,每个 partition 是一个有序的队列。
  • 副本Replica为保证集群中的某个节点发生故障时,该节点上的 partition 数据不丢失,且 kafka 仍然能够继续工作,kafka 提供了副本机制,一个 topic 的每个分区都有若干个副本,一个 leader 和若干个 follower。
  • leader :每个分区多个副本的“主”,生产者发送数据的对象,以及消费者消费数据的对象都是 leader。
  • follower :每个分区多个副本中的“从”,实时从 leader 中同步数据,保持和 leader 数据的同步。leader 发生故障时,某个 follower 会成为新的 follower。
3、性能特点
  • 高吞吐量:Kafka以其出色的I/O性能和分布式架构设计,能够实现极高的吞吐量,每秒数百万的消息处理能力使其成为大数据领域的首选。
  • 日志压缩特性:Kafka支持消息的压缩存储,能够有效地减少存储成本和网络带宽使用,特别是在处理大量日志数据时,这一特性尤为有用。
4、适用场景
  • 大规模数据的流处理和分析,适用于大数据分析、实时监控、日志聚合等复杂场景。

六、如何保证消息消费的幂等性

在消费时需要做幂等性校验,防止重复消费

七、如何防止消息丢失

1、RocketMQ
  1. 生产者同步发生+事务消息+失败重试
  2. broker端同步刷盘+主从同步复制
  3. 消费端同步消费+失败重试
2、Kafka
  • 生产端同步发送
  • 消费端手动提交+幂等性消费
  • broker端同步刷盘+副本机制+ISR机制

八、如何保证消息的有序性

1、RocketMQ
  1. 生产端将顺序消息发送到同一个messageQueue中+分布式锁
  2. 消费的使用顺序消费模式
2、kafka
  1. 生产者将相关的消息发送到同一个分区,确保分区内消息的顺序。
  2. 每个分区只由一个消费者消费,这可以通过控制分区数和消费者数的关系来实现。
  3. 消费者处理完成后采用手动提交
  4. 消费失败时添加重试机制

九、消息大量积压如何解决

1、原因
    消费者的处理速度跟不上生产者的发送速度,或者消费者出现故障。
2、解决方案
  • 增加消费者数量。
  • 优化消费者消费消息的代码,提高消费者的处理速度。
  • 消息迁移或分流处理。根据消息的类型、优先级等特征将部分消息进行分流存储,通过编写专门的程序或部署专门的消费者来单独处理,达到快速缓存积压得消息。

本文转载自: https://blog.csdn.net/Hlizhen/article/details/143171296
版权归原作者 此间少年,向死而生 所有, 如有侵权,请联系我们删除。

“消息队列(RocketMQ和Kafka)”的评论:

还没有评论