消息队列 | 青训营笔记

68 阅读13分钟

一、消息队列-kafka

1.kafka是什么?

Kafka是一个由Apache开发的分布式流处理平台,是一种高吞吐量的分布式发布订阅消息系统。Kafka的设计目标是处理大规模的实时数据流,支持数百万级别的消息传递,并具有可扩展性、高性能和容错性等特点。 Kafka将消息分成多个主题(Topic),并将每个主题分成多个分区(Partition),分布式存储在集群中的多台服务器上。生产者(Producer)发送消息到主题中的特定分区,消费者(Consumer)通过订阅某个主题来获取分区中的消息,并按照顺序进行处理。Kafka的Brokers则负责中转和存储消息。 

 Kafka的优点如下:

  •  高吞吐量:Kafka能够支持每秒数百万条消息的传递和处理,使其成为处理海量实时数据的理想工具。 
  •  可扩展性:Kafka的分布式架构和扩展性设计可以水平扩展,可以方便地增加或减少Broker节点。 
  •  高可靠性:Kafka采用多副本机制来确保数据冗余备份,从而支持高可用性和数据安全性
  • 灵活性:Kafka提供了通用性强、易于扩展的API接口,可以与其他系统集成使用。

Kafka是一种灵活、高扩展性的分布式流处理平台,可以方便地进行大规模数据的实时传递和处理,并在互联网企业、金融、电商等领域中得到广泛应用。

2.kafka的offset、replica

在Kafka中,Offset是指每个消息在一个分区(Partition)中的唯一标识符,它表示了消费者(Consumer)在分区中读取信息的位置。每个消费者都有自己的Offset,通过不断更新Offset可以读取分区中新的消息。 

 Kafka支持副本(Replica)机制,即分区的数据会被复制到多个Broker节点上,以保证数据的可靠性和高可用性。其中,每个分区可能包含多个副本,其中有一个是Leader,其他是Follower,Leader负责处理客户端请求、读写消息等操作。当Leader节点发生故障时,Follower会立即接替它成为新的Leader。

 副本机制在Kafka中非常重要,它能够确保消息的高可靠性和容错性。如果某个Broker节点失效,其上的副本可以继续提供服务,同时Leader节点也可以在其他副本中选出新的Leader节点。

Offset和Replica是Kafka中非常重要的两个概念。Offset用于标识每个消息的唯一标识符,而Replica机制可以保证数据的高可靠性和容错性,是Kafka实现高可用性的关键机制之一。

3.Kafka的架构

由四个核心组件组成:ZooKeeper、Producer、Broker和Consumer。其中,ZooKeeper是分布式协调服务,负责在Kafka集群中维护Broker和Topic等元数据信息;Producer负责将消息发送到Kafka集群;Broker是Kafka集群的核心组件,负责存储和传输消息;Consumer从Broker中订阅并消费消息。

 下面是Kafka架构的详细分类说明: 

  •  ZooKeeper ZooKeeper是Kafka集群中的一个重要组件,它用于管理Broker、Topic、Partition等元数据信息,并且为Kafka提供高可用性和故障转移机制。ZooKeeper会记录所有的Kafka Broker、Topic和Partition信息,并定期向Kafka发送心跳包以检查Broker的健康状态。如果Broker出现故障,ZooKeeper会通知客户端重新连接其他有效的Broker,从而实现Kafka的高可用性和容错性。 
  •  Producer Producer是Kafka集群中的消息发送者,负责向Broker中的Topic发送消息。当Producer发送消息时,可以指定消息的Key、Value、Topic以及消息发送的Partition,Kafka根据Partition的规则将消息分发到对应的Broker上。Producer还可以设置消息的压缩方式、批量发送参数、消息的序列化方式等。
  •  Broker Broker是Kafka集群中的核心组件,负责存储和传输消息。每个Broker都可以包含一个或多个Partition,每个Partition在集群中的所有Broker节点上都有多个副本(Replica),其中会选举出一个Leader副本作为当前分区的读写节点。当Producer发送消息到Broker时,消息会根据Partition的规则存储到对应的Broker上,并通过Broker之间的复制机制进行数据备份和容错。 
  •  Consumer Consumer是Kafka集群中的消息接收者,负责从Broker中订阅并消费消息。Consumer可以向Broker订阅一个或多个Topic,并通过Partition规则获取消息。每个Consumer都会维护自己的Offset来记录已经消费的消息位置,以便下次读取新的消息。Kafka支持同步和异步两种Consumer接口类型,同时还支持基于批量的Consumer和基于流的Consumer等方式。 

Kafka具有良好的设计,采用了分布式架构、多副本复制机制、高吞吐量等特点,这使得其在大规模实时数据处理、日志收集、事件处理等方面得到了广泛的应用。

4.kafka替换、扩容、缩容的流程

下面分别介绍这三个操作的流程: 

 1. 替换 替换操作在Kafka中通常是指将已经存在的Broker节点替换为新的节点。通常的流程如下: 

 (1)向ZooKeeper注册一个新的Broker节点,并为其分配一个唯一的ID号。 

 (2)将需要替换的旧Broker节点从Kafka集群中移除。 

 (3)将需要迁移的Partition从旧Broker节点迁移到新的Broker节点上,并在ZooKeeper中更新对应的Partition元数据信息。 

 (4)对于每个需要迁移的Partition,重启Producer和Consumer,以便它们可以重新连接到新的Broker节点上并读写数据。 

 2. 扩容 扩容操作在Kafka中通常是指增加新的Broker节点来处理更多的消息流量。通常的流程如下: 

 (1)向ZooKeeper注册一个新的Broker节点,并为其分配一个唯一的ID号。 

 (2)将需要增加Partition的Topic拆分成多个Partition,并按照一定的规则分配到新的Broker节点上。 

 (3)修改Producer和Consumer的配置文件,将新的Broker节点添加到集群中。 

 (4)向ZooKeeper中更新Topic的Partition元数据信息,以便新的Broker节点能够正常接收和处理消息。

 3. 缩容 缩容操作在Kafka中通常是指减少Broker节点的数量来降低成本。缩容操作比较复杂,需要注意以下几个步骤: 

 (1)将需要下线的Broker节点中的Partition迁移到其他节点上。 

 (2)在ZooKeeper中更新Partition的元数据信息,以便消费者可以连接到新的Broker节点上读取消息。 

 (3)重启Producer和Consumer,确保它们能够正常连接到剩余的Broker节点并读写数据。(4)等待一段时间,观察系统性能是否正常,如果发现问题需要及时处理。 

 需要注意的是,在进行扩缩容操作时,要确保原有集群的高可用性和数据完整性不受影响。因此,在进行任何变更之前,一定要对数据备份和恢复机制进行充分测试,并确保所有的Producer和Consumer都已经连接到了新的Broker节点上。

二、消息队列- RocketMQ

1.RocketMQ是什么?

RocketMQ是阿里巴巴开源的分布式消息队列系统,是完全基于Java实现的,具有高吞吐量、低延迟、高可靠性等优点。RocketMQ支持多种消息传输协议和编程语言,可以适应各种不同的应用场景。

 RocketMQ的架构由四个核心组件组成:Name Server、Broker、Producer和Consumer。其中,Name Server是消息队列的路由中心,负责维护Broker和Topic的路由关系;Broker是消息队列的存储中心,负责存储和传输消息;Producer是消息队列的发送者,负责将消息发送到Broker;Consumer是消息队列的接收者,负责从Broker订阅并消费消息。

 RocketMQ具有以下特点: 

  •  高可靠性:RocketMQ采用Master-Slave模式的数据复制机制和多副本数据保存机制,保证了消息的高可靠性和数据一致性。 
  •  高性能:RocketMQ采用零拷贝技术和多线程机制,可以实现高吞吐量和低延迟。
  • 可扩展性:RocketMQ支持水平扩展和动态负载均衡,可以非常方便地扩展集群规模。 
  •  简单易用:RocketMQ提供了完善的管理工具和API接口,使得使用和管理非常方便。 

RocketMQ是一款成熟的分布式消息队列系统,广泛应用于互联网、金融、电商等领域,并受到了社区和行业的广泛关注。

2.RocketMQ和Kafka的对比?

3.RocketMQ架构

RocketMQ是一个类似于Kafka的分布式消息队列系统,由阿里巴巴公司开发和维护。RocketMQ基于Java语言开发,通过分布式、高可用、低延迟的架构设计,在实时数据处理和大规模消息传输方面具有良好的表现。

 RocketMQ的架构包括以下四个核心组件: 

  •  NameServer NameServer是RocketMQ集群中的元数据管理服务,它负责保存Broker、Topic和Queue等元数据信息,并提供客户端路由服务。当Producer或Consumer需要发送或接收消息时,会首先向NameServer发送请求,获取最新的Broker和Topic信息。
  •  Broker Broker是RocketMQ消息队列的核心组件,负责存储和传输消息。每个Broker节点可以包含多个Topic和多个Queue,同时支持消息可靠性传输机制和消息顺序传输机制。当Producer发送消息时,消息会被存储到对应的Topic和Queue中,等待Consumer消费。当Consumer消费消息时,消息会从Queue中被移除。
  •  Producer Producer是RocketMQ集群中的消息发送者,负责向Broker中的Topic发送消息。当Producer发送消息时,可以指定消息的Key、Value、Topic以及消息发送的Queue,RocketMQ根据消息的Queue和路由规则将消息分发到对应的Broker上。Producer还可以设置消息的压缩方式、批量发送参数、消息的序列化方式等。 
  •  Consumer Consumer是RocketMQ集群中的消息接收者,负责从Broker中订阅并消费消息。Consumer可以向Broker订阅一个或多个Topic,并通过Queue规则获取消息。每个Consumer都会维护自己的Offset来记录已经消费的消息位置,以便下次读取新的消息。RocketMQ支持同步和异步两种Consumer接口类型,同时还支持基于批量的Consumer和基于流的Consumer等方式。 

 RocketMQ具有高可用性、低延迟、高吞吐量等特点,这使得其在大规模实时数据处理、日志收集、事件处理等方面得到了广泛的应用。

4.RocketMQ高级特性?

RocketMQ除了常见的消息队列功能以外,还提供了许多高级特性。以下是一些主要的高级特性: 

  •  消息事务 RocketMQ提供了原子消息事务机制,支持将消息的发送和数据库的操作作为一个事务进行提交或回滚。在RocketMQ中,Producer将消息发送到消息服务端时会返回一个半消息ID,此时消息还未提交,但已经预处理完成。然后Producer向业务系统发送事务确认请求,确认请求的结果会告诉Producer是否需要提交或回滚。如果是提交,则消息变成可靠消息,可以被Consumer消费;如果是回滚,则消息被删除。
  •  延迟消息 RocketMQ支持延迟消息,即在指定的时间之后才能被消息消费者接收到。这在某些场景下很有用,例如超时提醒、定时任务等。在RocketMQ中,可以通过在Producer端设置消息的延迟等级,在Broker端保存消息到指定的延迟队列中,然后在指定的时间之后才将该消息发送到对应的消费者。 
  •  过滤消息 RocketMQ支持按照SQL表达式来过滤消息。这使得消费者只接收到特定类型的消息,从而减少网络传输和存储压力。具体实现方法是在Producer端设置消息的属性,然后在Consumer端创建MQPullConsumer或MQPushConsumer时设置相应的过滤规则。 
  •  Batch消息 RocketMQ支持批量消息发送和消费,可以提高传输效率和降低网络负荷。在Producer端,可以将多个消息打包成一个消息集合,然后一次性将多个消息发送到队列中;在Consumer端,可以一次性接收多个消息,并对这些消息进行批量操作,提高消费的效率。 
  •  消息重试 当消息消费者出现问题时,RocketMQ可以自动进行消息重试,即将未处理成功的消息重新发送给一个新的消费者进行消费。在RocketMQ中,可以通过设置重试次数、重试时间间隔等参数来控制消息重试的行为。 
  •  广播模式 RocketMQ支持全局广播模式,即消息会同时发送到所有的消费者端,每个消费者都可以独立地进行消息的处理,不受其他消费者的影响。这种模式常用于实时数据分析和监控系统等场景。 

 RocketMQ除了基本的消息队列功能外,还提供了丰富的高级功能,使得其能够更好地应对各种复杂的场景需求。

三、Kafka的第一个HelloWorld

要在Kafka中完成一个HelloWorld示例,需要进行以下步骤:

1. 安装并启动Kafka

首先需要下载和安装Kafka,并启动Kafka服务。可以在官方网站下载适合自己操作系统的Kafka版本,然后按照官方文档进行安装和启动。

2. 创建一个Topic

在Kafka中,消息是以Topic为单位进行发送和接收的。因此首先需要创建一个Topic。可以使用命令行工具kafka-topics.sh来创建一个Topic,具体命令为:  


bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic test


以上命令将创建一个名为test的Topic,其中bootstrap-server指定了Kafka服务的地址和端口号。

3. 发送一条消息

用命令行工具kafka-console-producer.sh向刚刚创建的test Topic发送一条消息,命令为:


bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test


当命令运行之后,输入消息内容,回车即可发送消息。

4. 接收一条消息

用命令行工具kafka-console-consumer.sh从刚才创建的test Topic接收一条消息,命令为:


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


命令运行之后,即可接收到之前发送的消息。

这样就完成了一个简单的Kafka HelloWorld示例。总结起来,步骤为:创建Topic -> 发送消息 -> 接收消息。