消息队列学习笔记 | 青训营

46 阅读4分钟

为什么需要消息队列

解决异步通信和高并发场景问题。

  1. 异步通信:消息队列允许发送者发送消息而无需立即等待接收者处理。发送者可以将消息放入队列中,然后继续执行其他任务,而不必等待接收者的响应。这种异步通信模式对于解耦和提高系统的可伸缩性非常有用。
  2. 高并发处理:消息队列可以作为缓冲区,帮助处理高并发的情况。当系统面临突发的请求量增加时,消息队列可以暂时存储请求,然后按照处理能力的速度逐个处理它们,从而避免系统负载过大。
  3. 解耦系统组件:使用消息队列可以将系统的各个组件解耦。不同的组件可以通过消息队列进行通信,而不需要直接相互调用。这种解耦可以提高系统的可维护性和可扩展性,因为各组件可以独立地进行开发、部署和维护。
  4. 容错和可靠性:消息队列通常具有持久化机制,可以将消息持久化到磁盘中,从而提供容错和可靠性。即使在系统故障或重启后,之前的消息也不会丢失,可以继续处理。
  5. 流量控制和负载均衡:通过消息队列,可以实现流量控制和负载均衡。可以根据消费者的处理能力和系统的负载情况,动态调整消息的消费速度,从而平衡整个系统的负载。

为了满足上述场景,需要消息队列满足高可用、高吞吐和高并发。

消息队列的发展

随着开源社区的发达,一些开源的消息队列受到了关注。Apache Kafka是一个分布式流式处理平台,于2011年开发并开源,高吞吐和可收缩性使其成为了首选工具。随着云计算和容器化技术的兴起,消息队列系统也发展到了云原生时代。云服务提供商如Amazon Web Services(AWS)的Amazon Simple Queue Service(SQS)和Google Cloud的Cloud Pub/Sub提供了托管的消息队列服务,使得开发人员可以方便地将消息队列集成到云环境中。随着大数据、物联网和边缘计算等新兴技术的发展,出现了一些专门针对这些场景的消息队列系统。例如,Apache Pulsar是一个开源的分布式发布/订阅消息平台,专注于处理大规模的实时数据流。

Kafka

使用过程:

  • 创建kafka集群
  • 创建topic,并设置分片数量
  • 引入对应语言的SDK,配置好集群和topic的参数,初始化生产者调用send,发送消息
  • 引入对应语言的SDK,配置好集群和topic的参数,初始化消费者调用poll,接受消息 Replica:指的是partition的副本,维护一个ISR(In-Sync Replica)表示在同步中的replica,从中选取leader,然后leader对外负责服务,如果leader挂掉,那么就选一个升级成为leader,作为容灾的手段。
    在Producer阶段,通过批量发送消息,可以减少io次数,加强发送能力;通过数据压缩,减小消息大小,从而缓解带宽压力。
    在Broker阶段,通过顺序写的方式写入,提高写入的效率。
    在Consumer阶段,使用Rebalance分配分片。
    kafka存在一系列问题:
  • 运维成本高
  • 负载不均衡的解决方案复杂
  • 没有自己的缓存
  • 大量IO会造成性能下降

BMQ

兼容kafka的云原生消息队列。大大降低了运维成本,对于所有节点的变更操作,都是集群元数据的变化,都能在秒级内完成。
通过将副本随机分配到不同的节点上,负载均衡。
通过Databus简化了消息队列客户端的复杂度,解耦业务和topic,缓解集群压力。使用Mirror通过最终一致的方式,解决跨域读写问题。

RocketMQ

主要特点:

  1. 可靠的消息传递:RocketMQ提供消息持久化、高可靠性和强一致性,确保消息在发送和接收过程中不会丢失。
  2. 分布式架构:RocketMQ的架构设计支持分布式部署,可以通过添加更多的代理服务器实现横向扩展,以满足高吞吐量的需求。
  3. 高性能:RocketMQ具有低延迟和高吞吐量的特点,适用于处理大规模的消息流和实时数据。
  4. 多种消息模型:RocketMQ支持多种消息模型,包括点对点(P2P)和发布/订阅(Pub/Sub),以满足不同的应用需求。
  5. 丰富的特性和生态系统:RocketMQ提供了丰富的特性,如顺序消息、事务消息、定时消息、消息过滤等。此外,它还与其他阿里巴巴生态系统的组件(如Apache Flink、Apache Storm等)紧密集成。