消息队列原理与实战 | 青训营笔记

84 阅读5分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 14 天

一、消息队列的前世今生

消息队列(Message Queue)是一种应用程序之间的通信机制,它允许独立的应用程序通过消息来协作工作。在消息队列中,生产者向队列发送消息,而消费者从队列中读取消息。

消息队列应用场景

  1. 异步处理:当一个请求的处理时间很长,但是不能阻塞用户请求时,可以使用消息队列进行异步处理。
  2. 解耦:在微服务架构中,不同的服务间可以通过消息队列来进行通信,从而解耦各个服务之间的耦合关系。
  3. 流量削顶:在高并发场景下,消息队列可以帮助系统缓解流量压力,防止系统瘫痪。

发展历史

消息队列技术最早出现在上世纪80年代,最初用于应用程序间的通信。随着分布式系统的兴起,消息队列技术也逐渐得到了广泛的应用。近年来,随着大数据和微服务架构的兴起,消息队列技术在解决分布式系统问题中发挥了更加重要的作用。

常见的消息队列类型

  1. RabbitMQ:是一个开源的消息代理服务器,支持多种消息协议,如AMQP等。
  2. Apache Kafka:是一个分布式流式平台,支持高吞吐量的数据处理。它可以作为消息队列,也可以作为数据存储系统。
  3. Redis:是一个内存数据库,可以作为消息队列使用。 ActiveMQ:是一个开源的消息代理服务器,支持多种消息协议。

二、消息队列kafka

Kafka是一个分布式流平台,主要用于存储和处理大量实时数据。其中,Kafka常用的三个场景是:业务日志、用户行为数据和metrics数据。

业务日志:Kafka可以用于处理业务系统的日志数据,便于数据分析和挖掘。

用户行为数据:Kafka可以用于收集和处理用户的行为数据,帮助企业更好地了解用户的需求和习惯。

metrics数据:Kafka可以用于存储和处理系统的运行指标数据,帮助企业更好地了解系统的运行情况。

一条消息从生产到消费的处理流程:

1.生产者发送消息:生产者将数据写入Kafka,将数据发布到指定的Topic中。

2.Broker存储消息:Kafka中的Broker负责存储生产者发送的消息,并维护消息的可靠性。

3.消费者读取消息:消费者从Kafka读取数据,对数据进行处理。

4.处理消息:消费者根据业务需求对读取的消息进行处理,如存储到数据库、进行数据分析等。

整个过程中,Kafka负责维护消息的顺序性和可靠性

三、消息队列BMQ

Kafka在使用中遇到的问题

1.分区数量限制:Kafka对单个Topic分区数量有限制,在实际应用中很难满足需求。

2.管理复杂:随着Kafka集群规模的增大,管理和维护成本也随之增加。

3.可靠性:Kafka的可靠性较差,在网络故障和节点故障的情况下,很容易导致消息丢失。

BMQ架构

BMQ是一种分布式消息队列架构,用于解决Kafka在使用中遇到的问题。它是一种基于分布式系统原理的架构,通过分布式集群来实现高性能、高可用性和高可靠性的消息服务。

BMQ各模块在实际应用中的工作:

1.生产者模块:负责生产消息并发送到消息队列中。

2.消费者模块:负责从消息队列中接收消息并进行处理。

3.消息代理模块:负责管理消息队列并保证消息的顺序性和可靠性。

4.存储模块:负责存储消息并保证消息的可靠性。

BMQ多机房容灾

BMQ支持多机房容灾,通过在多个机房部署BMQ集群来实现数据同步和备份。当某个机房出现故障时,可以通过其他机房的集群来继续提供服务,从而保证服务的高可用性。此外,BMQ还支持数据的实时备份和恢复,以确保数据的安全。

四、消息队列RocketMQ

RocketMQ是阿里巴巴开源的一个分布式消息中间件,提供高性能、高可用性和高可靠性的消息服务。

RocketMQ的使用场景:

1.分布式系统消息通信:RocketMQ可以作为分布式系统中的消息中间件,用于在不同的服务间进行消息通信。

2.数据同步:RocketMQ可以用于实现数据的同步,保证数据在不同系统之间的一致性。

3.异步处理:RocketMQ可以用于实现异步处理,提高系统的处理效率。

RocketMQ与Kafka的对比:

1.性能:RocketMQ的性能略高于Kafka,具体表现为QPS更高、消息延迟更低。

2.可用性:RocketMQ提供了高可用性的特性,在网络故障和节点故障的情况下仍然可以保证消息的可用性。

3.可靠性:RocketMQ与Kafka的可靠性相当,都支持消息的重试和确认机制。

4.部署:RocketMQ的部署更简单,支持一键部署和自动扩展;而Kafka的部署需要更多的配置和维护。

总体来说,RocketMQ更适合需要高性能和高可用性的场景,而Kafka更适合大规模的数据处理,特别是对于需要进行实时分析和处理的数据。此外,RocketMQ支持事务消息,可以保证消息的最终一致性,而Kafka不支持事务消息。 同时,RocketMQ的客户端支持多种语言,易于使用;Kafka的客户端相对来说要复杂一些,需要更多的研究和学习。