走进消息队列| 青训营

70 阅读6分钟

情景问题:

四个场景,如何解决?
1.系统崩溃

image.png 2.服务处理能力有限

image.png 3.链路耗时长尾

image.png
4.日志如何处理

解决方法一:解耦

graph TD
客户 --> 搜索商品 --> 搜索行为记录 -->点击商品 -->  点击行为记录 
搜索行为记录 --> 消息队列
点击行为记录 --> 消息队列 -->  储存服务

解决方法二:削峰

image.png

解决方法三:异步

image.png

解决方法四:日志处理

graph TD
Log --> 消息队列 --> LogStash --> ES --> Kibana

什么是消息队列?

消息队列(MQ),指保存消息的一个容器,本质是个队列。但这个队列呢,需要支持高吞吐,高并发,并且高可用。

消息队列是一种在分布式系统中用于异步通信的中间件技术。它允许应用程序和服务之间通过发送和接收消息来进行通需要直接相互依赖或实时的连接。

简单来说,消息队列是一种存储消息的数据结构,消息发送方将消息发送到队列中,消息接收方则从队列中接收消息。消息队列中的消息按照先进先出(FIFO)的顺序进行处理,每个消息只被一个接收方处理一次。

消息队列的功能可以被用于处理以下情况:

  1. 异步通信:发送方将消息放入队列后就可以继续执行其他操作,而不需要等待接收方处理完毕。
  2. 应用解耦:不同的应用程序或服务之间可以通过消息队列进行通信,降低了它们之间的耦合性。
  3. 消息传递可靠性:消息队列通常具备数据持久化和可靠传递的能力,能够确保消息不会丢失。
  4. 削峰填谷:在系统负载高峰时,消息队列可以暂时存储请求,然后根据系统负载情况逐渐处理。
  5. 消息通知和订阅:消息队列可以支持发布-订阅模式,让多个接收方同时订阅同一消息。

常见的消息队列系统包括RabbitMQ、Apache Kafka、ActiveMQ等。它们提供了丰富的特性和API,可用于多种应用场景,如系统间通信、日志记录、异步任务处理等。

Kafka: 分布式的、分的、多副本的日志提交服务,在高吞吐场景下发挥较为出色
RocketMQ: 强一致、高性能、高可靠、万亿级容量和灵活的可扩展性,在一些 低延迟、实时场景中运用较广
Pulsar: 是下一代云原生分布式消息流平台,集消息、存储、轻量化函数式计算为一体采用存算分离的架构设计
BMQ: 和Pulsar架构类似,存算分离,初期定位是承接高吞吐的离线业务场景,逐步替换掉对应的Kafka集群

消息队列-Kafka

Kafka 是一个高吞吐量、分布式、可持久化的消息队列系统。它最初由LinkedIn开发,并后来开源。Kafka的设计目标是为了处理大规模的流数据。它的主要特点包括:

  • 高吞吐量:Kafka能够处理大量消息,每秒可以处理数百万条消息。
  • 持久性:消息在被处理后仍然存储在Kafka中,因此可以在需要时重新处理。
  • 分布式:Kafka允许将消息分布在多个服务器上,以实现可伸缩性和高可用性。
  • 发布/订阅模型:Kafka支持多个消费者订阅同一主题的消息,实现了松耦合的消息传递。

消息队列-BMQ

BMQ 是一个简单、轻量级的消息队列系统,用于异步任务处理。它的设计重点是易用性和快速设置。BMQ的主要特点包括:

  • 简单:BMQ提供了一个轻量级的队列系统,易于安装和配置。
  • 任务队列:BMQ通常用于处理异步任务,例如后台作业、邮件发送等。
  • 优先级:BMQ允许您为任务设置优先级,以确保重要任务被尽快处理。

消息队列- RocketMQ

RocketMQ 是一个分布式消息队列系统,最初由阿里巴巴开发。它旨在处理大规模的数据流和大量的事务性消息。RocketMQ的主要特点包括:

  • 分布式和高可用性:RocketMQ支持分布式部署,具有高可用性和故障恢复功能。
  • 事务消息:RocketMQ支持事务消息,确保消息的可靠传递和处理。
  • 批量处理:RocketMQ允许批量发送和消费消息,以提高性能和效率。
  • 支持多种编程语言:RocketMQ提供了多种客户端库,支持多种编程语言,包括Java、C++、Go等。

课后作业:

手动搭建一个kafka集群

要手动搭建一个Kafka集群,需要按照以下步骤进行操作:

  1. 安装Java环境:Kafka是用Java编写的,所以需要在每个服务器节点上安装Java运行时环境(JRE)或Java开发工具包(JDK)。

  2. 下载并解压Kafka:从Apache Kafka的官方网站(kafka.apache.org/)下载所需版本的Kaf…

  3. 配置Zookeeper集群:Kafka依赖Zookeeper来管理和维护集群的元数据信息。首先,需要安装和配置Zookeeper集群。在每个服务器节点上创建一个Zookeeper实例并确保所有实例在互联网络上可互相访问。

  4. 配置Kafka集群:编辑每个Kafka节点的server.properties文件,该文件位于Kafka安装目录下的config文件夹中。在配置文件中为每个Kafka节点指定以下参数:

    • broker.id:每个Kafka节点的唯一标识ID。

    • listeners:Kafka监听器的配置,指定节点之间的通信方式。

    • zookeeper.connect:Zookeeper集群的连接字符串。

    • log.dirs:Kafka日志文件的存储路径。

    • num.partitions:默认主题的分区数量。

    • offsets.topic.replication.factor:存储偏移量的主题的副本数。

    • 其他可选参数,如内存大小、线程数等。

  5. 启动Kafka节点:在每个服务器节点上打开一个终端窗口,并导航到Kafka的安装目录。运行以下命令启动Kafka节点:

    ./bin/kafka-server-start.sh config/server.properties
    

    确保每个节点上的Kafka进程成功启动,并且没有显示任何错误或异常。

  6. 创建主题和分区:使用Kafka提供的kafka-topics.sh脚本在集群中创建主题和分区。在任意一个节点上运行以下命令创建一个主题:

    ./bin/kafka-topics.sh --create --topic my-topic --partitions 3 --replication-factor 2 --bootstrap-server localhost:9092
    

    这将创建名为my-topic的主题,它将有3个分区,并在2个节点上复制。

  7. 运行生产者和消费者:使用Kafka提供的kafka-console-producer.shkafka-console-consumer.sh脚本运行生产者和消费者。在一个节点上启动消费者:

    ./bin/kafka-console-consumer.sh --topic my-topic --from-beginning --bootstrap-server localhost:9092
    

    在另一个节点上启动生产者:

    ./bin/kafka-console-producer.sh --topic my-topic --bootstrap-server localhost:9092
    

    这样,你就可以使用生产者向主题发送消息,然后消费者将接收并显示这些消息。

  8. 测试集群的可靠性和可伸缩性:尝试向主题发送更多的消息,并确保消息正确地复制到多个节点上。同时,你可以添加或删除Kafka节点来测试集群的可伸缩性和容错性。

参考

消息队列前世今生 - 掘金juejin.cn/course/byte…