本文共 2500 字,大约阅读时间需要 8 分钟。
kafka是一款令人惊叹的消息队列系统,由LinkedIn于2010年开源,作为一款分布式的基于发布/订阅模式的消息系统,主要面向处理活跃的流式数据。传统的日志分析系统虽然提供了一种离线处理日志的可扩展方案,但在实时处理场景下往往会面临较大的延迟问题。kafka的出现正是为了应对这类挑战,能够在离线和在线应用中都表现出色。
解耦
Kafka通过解耦两边的处理过程,使得生产者和消费者只能通过统一的接口进行交互。这种设计允许我们独立扩展或修改任一侧的环节,而无需关心另一侧的具体实现细节。以手机维修为例,我们可以让手机系统和维修人员成为两个独立的模块,彼此间不需要实时交互。这样一来,维修人员可以在手机短缺期间进行其他任务,提高效率。可恢复性
Kafka的可恢复性体现在其分布式架构中。虽然系统中某些组件可能会失效,但其数据不会因为单点故障而丢失,并且通过队列机制,消息仍然能够在其他组件恢复后继续被处理。这种设计降低了系统间的耦合度,使得整个系统更加稳健和可靠。削峰
在突发流量或高峰期,传统系统往往会因资源紧张而崩溃,导致服务中断。Kafka通过对流量的调节,能够在关键节点顶住高峰流量而不至于完全瓶颈。这种削峰能力在处理大量并发请求的场景中尤为重要。Kafka提供了两种主要的消息系统模式:点对点消息系统和发布-订阅消息系统。
点对点消息系统
这种模式下,消息被保留在特定队列中,消息消费者可以通过拉取的方式获取消息数据。一旦消息被消费,它将立即从队列中删除。典型应用场景包括订单处理系统,每个订单由特定的处理器处理,但可以通过多实例来水平扩展。发布-订阅消息系统
这种模式下,发布者将消息写入主题中,多个订阅者可以同时消费同一主题中的消息。这种一对多的关系使得消息具有更强的灵活性和复用性。以 Dish电视为例,用户可以根据自己的需求订阅所需的频道,得到实时的电视内容。Kafka的架构采用了分布式设计,主要组件包括以下几类:
生产者(Producer)
负责向Kafka broker发送消息。生产者可能是传输数据的应用程序或系统。消费者(Consumer)
负责从Kafka broker读取消息,处理或存储相关数据。消费者通常采用拉取(pull)方式获取消息,不会频繁主动推送数据。消费者组(Consumer Group)
由多个消费者组成,所有消费者属于同一消费者组。一个消费者组负责消费特定分区的数据,多个消费者组之间互不影响。消费者组是逻辑上的订阅者,所有消息都通过消费者组来获取。代理(Broker)
Kafaka的核心是代理服务器,负责存储和分发消息。一个代理可以同时管理多个主题,集群中包含多个代理以实现负载均衡和数据分区。主题(Topic)
消息生产者和消费者都面向同一主题,主题相当于一个通道,消息在主题内传递。分区(Partition)
为应对数据量大和吞吐量高的场景,Kafka将主题划分为多个分区,每个分区是一个有序的队列。分区分布在不同的代理上,实现了数据的负载均衡。副本(Replica)
每个分区有一个主副本(Leader)和多个副本(Follower)。副本机制保证了数据的冗余和高可用性,确保集群中某个节点故障时,数据仍能继续被处理。元数据管理
Kafka依赖于Zookeeper来存储集群管理、消费者组状态和分区元数据。旧版本中Zookeeper负责消费状态和消费者组管理,新版本通过内部协议减少了对Zookeeper的依赖,但仍需依赖其进行集群管理。Kafka的设计理念体现在以下几个方面:
持久化存储
Kafka设计时就将消息持久化作为默认情况来考虑,保证消息不会因服务器异常或程序终止而丢失。性能优先
Kafka的设计目标是优化吞吐量,而非功能丰富。其架构从一开始就考虑了大规模的读写吞吐量。分布式架构
Kafka是一个显式的分布式系统,生产者、代理和消费者分布在不同的节点上,系统设计时就考虑了节点间的独立性和扩展性。状态外化
Kafka将系统状态外化,通过消费者的处理结果来存储状态信息,而不是将其留存在服务器上。这种设计减少了server的负载,并提高了系统的灵活性。尽管Kafka后续版本弱化了Zookeeper的依赖,Zookeeper仍在早期版本中扮演重要角色:
集群管理
Kafka集群的元数据和节点信息存储在Zookeeper中,包括代理节点的状态、分区等。生产者订阅
Zookeeper用于管理生产者与消费者的订阅关系,实现生产者的负载均衡和消费者组的动态调整。故障恢复
集群中的节点变化、分区状态变化等触发Zookeeper中的事件,Kafka系统能及时响应并进行相应操作。Zookeeper为Kafka提供了分布式协调功能,确保生产者、代理和消费者之间的高效运作。其流程如下:
注册服务
各节点(生产者、代理)通过Zookeeper进行注册,节点状态和配置信息存储在Zookeeper节点上。负载均衡
Zookeeper收集所有代理节点信息,基于负载均衡算法将消息请求分配到有能力的代理上。动态调整
任何节点变更事件(如节点失效、新的节点加入)都会触发Zookeeper的通知,Kafka系统能动态调整资源分配和数据路由。状态同步
协调机制确保分区数据在各个副本之间保持一致性,保证消费者能够收到正确的消息。Kafka作为一款高效的消息队列系统,不仅在实时数据处理中表现优异,还支持离线分析应用的扩展。其分布式架构、持久化特性以及高吞吐量设计,使其成为现代流数据处理的首选工具。此外,Zookeeper的协调机制为Kafka的弹性扩展和故障恢复提供了坚实基础。在生产环境中,Kafka通过削峰、解耦和可恢复性等特性,帮助系统应对突发流量和稳定运行挑战。
转载地址:http://fivgz.baihongyu.com/