这是我参与「第五届青训营 」伴学笔记创作活动的第 15 天
课程内容与选题缘由
今天系统地学习了一下go并发相关的知识,协程之间的通信让我想起了消息队列的概念,因此回去翻看之前消息队列有关的课程,并对课程内容进行总结
消息队列的概念
消息队列是一种通信模式,它允许不同的应用程序之间通过异步方式交换信息。在消息队列中,一个应用程序可以向队列中发送一条消息,而另一个应用程序可以从队列中读取并处理该消息。这种方式可以使应用程序之间的解耦,从而提高系统的可扩展性、可靠性和灵活性。
消息队列中保存消息的容器,本质上是个队列,但是这个队列支持高吞吐、高并发以及高可用。
消息队列能解决的问题
- 避免服务崩溃
- 应对巨量请求
- 链路耗时长
- 日志记录繁琐
避免服务崩溃——解耦
引入消息队列可以将不同服务或模块之间的耦合度降低,每个服务或模块只需关心自己负责的业务逻辑,将需要处理的消息发送到消息队列中,由消费者异步处理。这样,服务之间的通信不再是直接依赖,减少了依赖关系,**避免了一个服务应付不过来及时的大量请求,**提高了系统的灵活性和可扩展性,
应对巨量请求——削峰
引入消息队列可以有效缓解请求高峰时服务端的压力。当有大量请求涌入系统时,可以将请求转换为消息,发送到消息队列中,等待消费者处理。这样可以有效控制系统的请求处理速度,避免系统崩溃
链路耗时长——避免阻塞
在传统的同步通信模式中,当一个服务依赖于另一个服务时,必须等待另一个服务响应后才能进行下一步操作。
如果另一个服务响应时间过长,会导致整个请求链路耗时过长。而使用消息队列,则可以将请求异步转换为消息,发送到消息队列中,等待被消费者处理。这样,发送者和消费者之间的通信就是异步的,不会造成阻塞,从而可以减少链路耗时长的问题。
改善日志记录
在分布式应用系统中,为了追踪请求的调用链路,需要记录大量的日志信息。如果直接在应用程序中记录日志,会对系统的性能产生影响。而使用消息队列,则可以将需要记录的日志信息发送到消息队列中,由专门的消费者进行处理,减少对系统性能的影响。同时,使用消息队列还可以方便地将日志信息发送到日志收集器中,进行集中管理和分析。
常见的消息队列
常见的消息队列有如下三种:
- Kafka
- BMQ
- RocketMQ
Kafka
Kafka 的架构基于分布式的多副本复制机制,支持水平扩展,可以通过增加更多的 Broker 来提高集群的处理能力。Kafka 还提供了高可用性、数据持久化、消息压缩、消息批处理、流式处理和数据流转发等特性。
Kafka 的核心组成部分为:
- Topic(主题):消息的分类,每个主题由若干个分区组成。
- Partition(分区):消息的物理存储单元,每个分区存储一个主题的部分数据。
- Producer(生产者):向一个或多个主题发布消息的客户端。
- Consumer(消费者):从一个或多个主题订阅并处理消息的客户端。
- Broker(代理):Kafka 集群中的一台或多台服务器,负责消息存储和转发。
BMQ
BMQ 是字节跳动团队自主研发的一款高性能、低延迟、高可靠的消息队列系统,它借鉴了 Kafka、RocketMQ 等消息队列的设计理念,采用了分布式架构和多副本备份机制,具有高吞吐量、高并发和低延迟等优点。
BMQ 的核心组成部分为:
- Topic(主题):消息的分类,每个主题由若干个分区组成。
- Partition(分区):消息的物理存储单元,每个分区存储一个主题的部分数据。
- Producer(生产者):向一个或多个主题发布消息的客户端。
- Consumer(消费者):从一个或多个主题订阅并处理消息的客户端。
- Broker(代理):BMQ 集群中的一台或多台服务器,负责消息存储和转发。
- Group(消费组):多个消费者共同消费一个主题,称为一个消费组。
RocketMQ
RocketMQ 支持多种消息模式,包括同步发送、异步发送、单向发送和顺序发送。同时,RocketMQ 还提供了多种高级特性,如延迟消息、定时消息、事务消息、消息过滤和广播消费等。
RocketMQ 的核心组成部分为:
- Producer(生产者):将消息发送到消息队列中的客户端。
- Consumer(消费者):从消息队列中订阅并处理消息的客户端。
- Message(消息):消息的基本单位,由 Topic、Tags 和 Keys 等属性组成。
- Topic(主题):消息的分类,每个主题可以有多个消费者和生产者。
- Broker(代理):RocketMQ 集群中的消息中转站,负责消息的存储和转发。
- NameServer(命名服务器):用于管理 Broker 和 Topic 的元数据信息,并提供路由服务。