kafka 详解

kafka 是由什么语言开发的

Kafka 最初是由 LinkedIn 开发,并于2011年开源。Kafka 的目标是为处理实时数据提供一个统一的平台。它使用 Java 开发,并利用 Scala 开发了一些构建工具。Kafka 的主要特点有:- 高性能、高吞吐的消息平台 - 支持海量数据持久化和实时处理 - 支持集群方式部署,分布式架构。 - 单机支持 100K/s 的消息吞吐。 - 支持多生产者、多消费者。Kafka 使用 Zookeeper 进行分布式协调和管理,Zookeeper 也是使用 Java 开发的。Kafka 客户端(Producer 和 Consumer)也提供了 Java 和 Scala 的 API,用于与 Kafka Broker 进行交互,发送和消费消息。所以,可以认为:- Kafka 的 Broker 是使用 Java 写的。 - Kafka 的构建工具使用 Scala 开发。 - Kafka 的客户端 API 提供了 Java 和 Scala 两种语言。 - Kafka 依赖 Zookeeper 进行管理,也是基于 Java 的。综上,虽然 Kafka 也使用了 Scala,但其主要的开发语言还是 Java。Java 几乎贯穿 Kafka 整个系统,包括 Kafka Broker、Zookeeper、大部分的客户端 API 等。所以,如果要深入研究 Kafka 的原理和源代码,需要比较熟练的 Java技能。当然,也需要掌握 Scala,才能理解如 Producer 和 Consumer 的源代码。所以,简单地说,Kafka 的开发语言主要是 Java。但也使用 Scala 开发了部分工具库和组件。两门语言的配合,使得 Kafka 既保持了 Java 的高性能,又获得了 Scala 的优雅语法

redis和kafka的区别

Redis和Kafka是两种不同类型的数据处理工具,虽然都属于数据处理的范畴,但它们的使用场景和用途有所不同。

Redis是一种基于内存的数据存储系统,常用于高速数据缓存和数据存储。Redis是一个支持多种数据结构的键值存储系统,它可以存储字符串、哈希表、列表、集合和有序集合等数据类型。Redis具有非常高的性能和可扩展性,能够快速处理高并发读写请求,因此它经常被用作分布式应用的缓存层或存储层。

Kafka是一种高吞吐量、分布式的消息队列系统,用于处理实时数据流。它具有高度的可靠性、可扩展性和容错性,适合用于构建实时数据处理系统和流式数据处理系统。Kafka可以将数据以消息的形式进行分区和存储,每个消息可以被多个消费者消费,支持消息的批量处理和多样化的消息传输协议,比如HTTP、WebSocket、AMQP等。

因此,Redis和Kafka的主要区别在于它们的应用场景和用途不同。Redis主要用于缓存和存储数据,而Kafka则用于处理实时数据流和消息传递。

一、kafka 架构和原理

1.1 相关概念

如图.1中,kafka 相关名词解释如下:
1.producer:
  消息生产者,发布消息到 kafka 集群的终端或服务。
2.broker:
  kafka 集群中包含的服务器。
3.topic:
  每条发布到 kafka 集群的消息属于的类别,即 kafka 是面向 topic 的。
4.partition:
  partition 是物理上的概念,每个 topic 包含一个或多个 partition。kafka 分配的单位是 partition。
5.consumer:
  从 kafka 集群中消费消息的终端或服务。
6.Consumer group:
  high-level consumer API 中,每个 consumer 都属于一个 consumer group,每条消息只能被 consumer group 中的一个 Consumer 消费,但可以被多个 consumer group 消费。
7.replica:
  partition 的副本,保障 partition 的高可用。
8.leader:
  replica 中的一个角色, producer 和 consumer 只跟 leader 交互。
9.follower:
  replica 中的一个角色,从 leader 中复制数据。
10.controller:
  kafka 集群中的其中一个服务器,用来进行 leader election 以及 各种 failover。
12.zookeeper:
  kafka 通过 zookeeper 来存储集群的 meta 信息

1.3、内部原理及实现

Kafka依赖zk,以集群方式工作,每台机器称为一个broker(与其他分布式环境不同的是,仅有1台blocker也能工作),并分别指定broker,kafka中同一类型数据以topic形式存在,可对topic进行分区,及指定副本数,例如可将 topic1 分区为3个partition:p0,p1,p2 ;每个分区副本数为3,则每个分区块会均匀的分布在broker中,对于每个partition,有多个副本,会选出一个leader partition对外接收请求(只有leader partition会接收外部请求,其他follower partition只负责同步leader数据,不接收外部请求,包括读请求,这里与zk不同,zk的follower会接收读请求)。集群有多个broker,会基于zk选择出一个Controller,来管理整个集群,包括brooker管理、topic管理,partition leader分配等。

每个broker只存储消息体,不存储元数据(topic信息;分区信息:topic有哪些分区,哪些副本,分别在哪台broker上,哪个是leader;consumer信息及读取消息后提交的偏移量数据等),元数据存储在zk中。

Controller主要功能:

(1)更新元数据

若blocker宕机,相关副本不可用,需要重新选择相关partition的leader,及更新ISR列表,选举完毕后,controller会更新zk中的元数据,并广播给其他brocker(每个brocker都可以对外提供元数据信息)

(2)topic管理

新增、删除topic

(3)分区重新分配

通过自带的 kafka-reassign-partitions 脚本可重新制定topic分区,由controller处理请求,重新分配并选择每个分区的leader。

(4)partition leader 分配

partition leader 选举的原理 :

  1. 在ZooKeeper上创建/admin/preferr

猜你喜欢

转载自blog.csdn.net/weixin_44815878/article/details/130831990