还不会Kafka吗?你真的成OUT慢了

1、定义

Apache Kafka 是一款开源的消息系统。能够在系统中起到“肖峰填谷”的做用,也能够用于异构、分布式系统中海量数据的异步化处理。
系统包括四个主要API:
在这里插入图片描述服务器

  • Producer API
    容许一个应用推送流记录经过一个或多个Kafka topics ;并发

  • Consumer API
    容许一个应用订阅一个或多个topics 而且处理这些流记录;负载均衡

  • Streams API
    容许一个应用做为一个流处理者,经过topics 输入或输出流数据 ;框架

  • Connector API
    绑定并运行 Producer 或 Consumer 链接Kafka topics 到 到已经存在的系统或存储上;异步

2、功能介绍

1) Topics and log

Topic 是发布记录的类别或订阅源名称。Kafka 的topic 会关联用户;一个topic 能够有 0个或多个Consumer 订阅写入它的数据。
对于每一个topic ,kafka 集群都会维护一个分区日志,以下图:
在这里插入图片描述
每一个分区都是一个有序的, 不可变的记录序列, 不断附加到结构化的提交日志中。 分区中的记录每一个都被分配一个称为偏移的顺序ID号,它惟一标识分区中的每条记录。
Kafka 集群能够持久的保存全部已发布的记录-不管它们是否被消费-能够易配置保留期限。
每一个consumer 会保留消费者在日志中消费的偏移或位置。一般消费者在读取记录的时候会线性提升偏移量,同时消费者也能够按照本身喜欢的顺序消费记录。
在这里插入图片描述
Kafka 三层消息框架:
第一层:主题层,每一个主题能够配置N个分区,每一个分区能够配置M个副本。
第二层:分区层,每一个分区的M个副本, 只能有一个lender副本,其对外提供服务,其它M-1 个副本是 追随者副本,只是提供数据冗余之用(客户端只会与分区中的leader副本进行交互)。
第三层:消息层,分区中包含若干条消息,每条消息的位移从0开始,依次递增。分布式

2)Distribution(消息分配)

日志的分区分布在Kafka 集群中的服务器上,每台服务器均可以处理请求数据。每一个分区都在可配置数量的服务器上进行复制,以实现容错。
每一个分区只有一个服务器充当“leader”,0个或多个服务器充当“followers”,leader 节点处理分区全部的记录读取和写入,followers节点 复制 leader 节点 的数据。 若是 leader 节点 异常,其中一个 followers 节点会被选举为 leader 节点。每一个服务器均可以充当某些分区的 leader 节点 和其它服务器的 followers 节点,所以负载均衡在集群中获得很好的平衡。ide

3)Geo-Replication(异地复制)

Kafka MirrorMaker为您的群集提供地理复制支持。使用MirrorMaker,能够跨多个数据中心或云区域复制数据。您能够在主动/被动方案中使用它进行备份和恢复; 或者在主动/主动方案中,使数据更接近用户,或支持数据位置要求。高并发

4)Producers

生产者将数据发布到他们选择的主题。生产者负责选择分配给主题中哪一个分区的记录。这能够经过循环方式完成,只是为了平衡负载,或者能够根据一些语义分区功能(例如基于记录中的某些键)来完成。工具

5)Consumers

消费者使用消费者组名称标记本身,而且发布到主题的每一个记录被传递到每一个订阅消费者组中的一个消费者实例。消费者实例能够在单独的进程中,也能够在不一样的机器。
若是全部使用者实例具备相同的使用者组,则记录将有效地在使用者实例上进行负载平衡。
若是全部消费者实例具备不一样的消费者组,则每一个记录将广播到全部消费者进程。
在这里插入图片描述
两个服务器Kafka群集,托管四个分区(P0-P3),包含两个使用者组。消费者组A有两个消费者实例,B组有四个消费者实例。
在Kafka中实现消费的方式是经过在消费者实例上划分日志中的分区,以便每一个实例在任什么时候间点都是分配的“公平份额”的独占消费者。维护组中成员资格的过程由Kafka协议动态处理。若是新实例加入该组,他们将从该组的其余成员接管一些分区; 若是实例死亡,其分区将分发给其他实例。分区实现了Kafka 的高并发。性能

6)Guarantees(可靠性)

  • 生产者发送到特定主题分区的消息将按其发送顺序附加。也就是说,若是记录M1由与记录M2相同的生产者发送,而且首先发送M1,则M1将具备比M2更低的偏移而且在日志中更早出现。

  • 消费者实例按照它们存储在日志中的顺序查看记录。

  • 对于具备复制因子N的主题,咱们将容忍最多N-1个服务器故障,而不会丢失任何提交到日志的记录。

3、实践应用

1) Kafka 做为消息系统

通用消息系统中有两种消息模型:队列 和 发布-订阅 。

  • 队列:队列中的数据被一个消费节点读取。它的优点在于容许在多个消费者实例上划分数据处理。缺点是,队列不支持多租户,多个实例状况下没法读取被其它实例消费的记录。

  • 发布-订阅:记录被广播给全部消费者,容许将数据广播到多个消费者实例。

  • 消息顺序性:在通用队列的模式里,服务器上按顺序保存记录,若是有多个消费者从队列中消费,则服务器按存储顺序分发记录,但消息是异步传递给消费者的,
    所以他们可能会存在不一样消费者上的无序传送。

  • 消息传递系统一般经过具备“独占消费者”的概念来解决这个问题,该概念只容许一个进程从队列中消耗,但这固然意味着处理中没有并行性。

kafka 经过在主题中具备并行性概念 - 分区 - ,Kafka可以在消费者流程池中提供订购保证和负载平衡。这是经过将主题中的分区分配给使用者组中的使用者来实现的,以便每一个分区仅由该组中的一个使用者使用。经过这样作,咱们确保使用者是该分区的惟一读者并按顺序使用数据。因为有许多分区,这仍然能够平衡许多消费者实例的负载。但请注意,消费者组中的消费者实例不能超过度区。

2)Kafka做为存储系统

任何容许发布与消费它们分离的消息的消息队列实际上充当了正在进行的消息的存储系统。Kafka的不一样之处在于它是一个很是好的存储系统。

写入Kafka的数据将写入磁盘并进行复制以实现容错。Kafka容许生产者等待确认,以便在彻底复制以前写入不被认为是完整的,而且即便写入的服务器失败也保证写入仍然存在。

磁盘结构Kafka很好地使用了规模 - 不管服务器上有50 KB仍是50 TB的持久数据,Kafka都会执行相同的操做。

因为认真对待存储并容许客户端控制其读取位置,您能够将Kafka视为一种专用于高性能,低延迟提交日志存储,复制和传播的专用分布式文件系统。

3)Kafka用于流处理
仅仅读取,写入和存储数据流是不够的,目的是实现流的实时处理。

在Kafka中,流处理器是指从输入主题获取连续数据流,对此输入执行某些处理以及生成连续数据流以输出主题的任何内容。

例如,零售应用程序可能会接收销售和发货的输入流,并输出从新排序流和根据此数据计算的价格调整。

可使用生产者和消费者API直接进行简单处理。可是,对于更复杂的转换,Kafka提供了彻底集成的Streams API。这容许构建执行非平凡处理的应用程序,这些应用程序能够计算流的聚合或将流链接在一块儿。

此工具备助于解决此类应用程序面临的难题:处理无序数据,在代码更改时从新处理输入,执行有状态计算等。

流API构建在Kafka提供的核心原语上:它使用生产者和消费者API进行输入,使用Kafka进行有状态存储,并在流处理器实例之间使用相同的组机制来实现容错。

4、名词解释

  • 消息:Record。Kafka是消息引擎,这里的消息就是Kafka处理的主要对象。

  • 主体:Topic。主题就是承载消息的逻辑容器,在实际应用中多用于区分具体业务。

  • 消息位移:Offset。表示分区中每条消息的位置信息,是一个单调递增不变的值。

  • 副本:Replica。Kafka中一条消息可以被拷贝到多个地方以提供数据冗余,这些地方就是所谓的副本。副本还分为领导者副本和追随者副本,各自有不一样的角色划分。副本是在分区层级下的,即每一个分区可配置多个副本实现高可用。

  • 生产者:Producer 。 向主题发布新消息的应用程序。

  • 消费者:Consumer。从主题订阅新消息的应用程序。

  • 消费者位移:Consumer Offset 。表示消费者消费进度,每一个消费者都有本身的消费者位移。

  • 消费者组:Consumer Group 。多个消费者实例共同组成的一个组,同时消费多个分区实现高吞吐。

  • 重平衡:Rebalance。消费者组内某个消费者实例挂掉后,其它消费者实例自动从新分配订阅主题分区的过程。Rebalance 是kafka消费者端实现高可用的重要手段。