kafka入门学习(一)

Kafka

官网:http://kafka.apache.org/

简介 :

Kafka是一种高吞吐量的分布式发布订阅消息系统。

它通过高性能TCP网络协议进行通信的服务器客户端组成。可以部署在内部以及云环境中的裸机硬件,虚拟机和容器上。

服务器:

Kafka作为一台或多台服务器的集群运行,可以跨越多个数据中心或云区域。

其中一些服务器构成了存储层,称为Broker(代理)。其他服务器运行 Kafka Connect来连续导入和导出数据作为事件流,以将Kafka与现有系统集成在一起,例如关系数据库以及其他Kafka群集。为了实现关键任务用例,

Kafka群集具有高度的可扩展性容错能力:如果其任何服务器发生故障,其他服务器将接管其工作,以确保连续运行而不会丢失任何数据。

客户端:

它们使您可以编写分布式应用程序和微服务,即使在网络问题或机器故障的情况下,它们也可以并行,大规模且以容错的方式读取,写入和处理事件流。

Kafka附带了一些这样的客户端,由Kafka社区提供的数十个客户端进行了扩展 :客户端可用于Java和Scala,包括更高级别的 Kafka Streams库,Go,Python,C / C ++和许多其他编程语言以及REST AP。

主要概念和术语:

Kafka中有几个概念很重要
partition(分区)、topic(主题)、producer(生产者)、consumer(消费者)。partition要深入了解,因为它和msg order guarantee(消息顺序), fault tolerace(容错)关系很大!

Kafka is a distributed, partitioned, replicatedcommit log service.
像官方介绍的那样,Kafka是分布式、分区、可复制的提交日志服务。它采用独特的设计来实现消息服务系统.

当您向Kafka读取或写入数据时,您将以事件的形式进行操作。从概念上讲,事件具有键,值,时间戳和可选的元数据标题。

这是一个示例事件:

事件键:“爱丽丝”
赛事价值:“向Bob支付了$ 200”
活动时间戳记:“ 2020年6月25日,下午2:06”

kafka基本特性

  • 可扩展:
    在不需要下线的情况下进行扩容 数据流分区(partition)存储在多个机器上

  • 高性能:
    单个broker就能服务上千客户端
    单个broker每秒种读/写可达每秒几百兆字节
    多个brokers组成的集群将达到非常强的吞吐能力

  • 性能稳定,无论数据多大
    Kafka在底层摒弃了Java堆缓存机制,采用了操作系统级别的页缓存,同时将随机写操作改为顺序写,再结合Zero-Copy的特性极大地改善了IO性能。

  • 持久存储:
    存储在磁盘上
    冗余备份到其他服务器上以防止丢失。

Producer(生产者)与Consumers(消费者)

生产者: 是那些向Kafka发布(写入)事件的客户端应用程序
消费者: 是那些订阅(读取和处理)这些事件的客户端应用程序

在Kafka中,生产者和消费者之间完全脱钩且彼此不可知,这是实现Kafka众所周知的高可伸缩性的关键设计元素。例如,生产者永远不需要等待消费者。Kafka提供各种保证,例如能够一次准确地处理事件。

传统上有2中处理消息的方法:队列和发布/订阅机制。

  • 队列模式下,消费者池从一台服务器上读取消息,并且每条消息只能发送给消费者池中的一个消费者
  • 发布/订阅模式下,消息广播到所有的消费者。

consumer group(消费者组)

在这里插入图片描述

给一组consumers打标签,标签名即组名。

消费者用消费者组名来标记自己,发布到主题的每条消息都被传递给每个订阅消费者组中的一个消费者实例。使用者实例可以在单独的进程中,也可以在单独的机器上。

每个发送到topic的消息都会被发送给订阅这个topic的consumer group中的每一个consumer。consumer实例可以在不同的进程或机器中。

当所有consumers属于一个group,这时的发布/订阅模式等同于队列模式

当所有的consumer都属于不同的group时,这就是典型的发布/订阅模式,topic的消息发送给所有的consumer。

更一般的情况是每个topic有少量的groups,每个group都是topic的“逻辑订阅者”。此时每个group有多个consumer实现扩展性和容错。这里订阅者是sonsumer集群而不是单个进程。这里依然符合发布/订阅语义。

Topic(主题)

主题类似于文件系统中的文件夹,事件是该文件夹中的文件。示例主题名称可以是“付款”。

Kafka中的主题始终是多生产者和多用户的:
一个主题可以有零个,一个或多个向其写入事件的生产者,以及零个,一个或多个订阅这些事件的使用者。

可以根据需要随时读取主题中的事件-与传统的消息传递系统不同,使用后事件不会被删除。相反,您可以通过按主题配置设置来定义Kafka将事件保留多长时间,之后旧的事件将被丢弃。Kafka的性能相对于数据大小实际上是恒定的,因此长时间存储数据是完全可以的

Topic是目录或订阅源的名字,用来接受发布过的消息。对于每个topic,Kafka维护一个分区日志,看起来如下:

每个分区有序,不断附加不可变的消息,称之为a commit log,每个分区中的消息被分配连续的数字称之为offset,每个分区中消息的offset不同

Kafka集群维护所有已经发布的消息。当然我们可以配置时间来决定集群维护消息的时间长短。在可用时间内消息都可以被消费者消费,超过这个时间消息会被删除来节省时间。

Partitions(分区) && Distribution(分布)

主题已分区,这意味着主题分布在位于不同Kafka Broker 上的多个“存储桶”中。数据的这种分布式放置对于可伸缩性非常重要,因为它允许客户端应用程序同时从多个代理读取数据或向多个代理写入数据。将新事件发布到主题时,实际上会将其附加到主题的分区之一。

相比传统的消息系统,Kafka有健壮的顺序保证

Kafka提出了分区的设计,将不同topics下的不同分区的消息分配给consumer group下的consumers,确保每个分区都能够被唯一一个consumer按消息发送的顺序处理消息数据。根据情况设计多个分区实现负载均衡。note:consumer数量不能超过partition数量。
在这里插入图片描述

具有相同事件键(例如,客户或车辆ID)的事件将写入同一分区,并且Kafka保证,给定主题分区的任何使用者都将始终以与写入时完全相同的顺序读取该分区的事件。

partitions意义重大:

  • First, they allow the log to scale beyond a size that will fit on a single server. Each individual partition must fit on the servers that host it, but a topic may have many partitions so it can handle an arbitrary amount of data. - Second they act as the unit of parallelism—more on that in a bit.
    首先,它们允许日志扩展到超出单个服务器的大小。每个单独的分区必须适合承载它的服务器,但是一个主题可能有许多分区,因此它可以处理任意数量的数据。第二,它们是并行性的单位,这一点我们稍后再讲。

Each partition is replicated across a configurable number of servers for fault tolerance.每个分区(内容)都是可重复的,需要在承载分区的服务器上配置。这是实现容错的一种方案。

每个分区都有1个server作为leader,0/多个server作为followers leader处理分区的读写请求,followers服从leader,复制leader的操作。 若leader故障,自动选取followers为新的leader。

每个服务器作为其一些分区的领导者,另一些分区的追随者,这样集群内的负载就很好地平衡了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值