10分钟带你逆袭Kafka!( 三 )


 
由于认真对待存储并允许客户端控制其读取位置,因此您可以将 Kafka 视为一种专用于高性能,低延迟提交日志存储,复制和传播的专用分布式文件系统 。
 
②Kafka 作为消息传递系统:Kafka 的流概念与传统的企业消息传递系统相比如何? 
传统上,消息传递具有两种模型:排队和发布订阅 。在队列中,一组使用者可以从服务器中读取内容,并且每条记录都将转到其中一个 。
 
在发布-订阅记录中广播给所有消费者 。这两个模型中的每一个都有优点和缺点 。
 
排队的优势在于,它允许您将数据处理划分到多个使用者实例上,从而扩展处理量 。
 
不幸的是,队列不是多用户的—一次进程读取了丢失的数据 。发布-订阅允许您将数据广播到多个进程,但是由于每条消息都传递给每个订阅者,因此无法扩展处理 。
 
Kafka 的消费者群体概念概括了这两个概念 。与队列一样,使用者组允许您将处理划分为一组进程(使用者组的成员) 。与发布订阅一样,Kafka 允许您将消息广播到多个消费者组 。
 
Kafka 模型的优点在于,每个主题都具有这些属性-可以扩展处理范围,并且是多订阅者,无需选择其中一个 。
 
与传统的消息传递系统相比,Kafka 还具有更强的订购保证 。传统队列将记录按顺序保留在服务器上,如果多个使用者从队列中消费,则服务器将按记录的存储顺序分发记录 。
 
但是,尽管服务器按顺序分发记录,但是这些记录是异步传递给使用者的,因此它们可能在不同的使用者上乱序到达 。
 
这实际上意味着在并行使用的情况下会丢失记录的顺序 。消息传递系统通常通过“专有使用者”的概念来解决此问题,该概念仅允许一个进程从队列中使用,但是,这当然意味着在处理中没有并行性 。
 
Kafka 做得更好,通过在主题内具有并行性(即分区)的概念,Kafka 能够在用户进程池中提供排序保证和负载均衡 。
 
这是通过将主题中的分区分配给消费者组中的消费者来实现的,以便每个分区都由组中的一个消费者完全消费 。
 
通过这样做,我们确保使用者是该分区的唯一读取器,并按顺序使用数据 。由于存在许多分区,因此仍然可以平衡许多使用者实例上的负载 。但是请注意,使用者组中的使用者实例不能超过分区 。
 
③Kafka 用作流处理:仅读取,写入和存储数据流是不够的,目的是实现对流的实时处理 。 
在 Kafka 中,流处理器是指从输入主题中获取连续数据流,对该输入进行一些处理并生成连续数据流以输出主题的任何东西 。
 
例如,零售应用程序可以接受销售和装运的输入流,并输出根据此数据计算出的重新订购和价格调整流 。
 
可以直接使用生产者和消费者 API 进行简单处理 。但是,对于更复杂的转换,Kafka 提供了完全集成的 Streams API 。
 
这允许构建执行非重要处理的应用程序,这些应用程序计算流的聚合或将流连接在一起 。
 
该功能有助于解决此类应用程序所面临的难题:处理无序数据,在代码更改时重新处理输入,执行状态计算等 。
 
流 API 建立在 Kafka 提供的核心原语之上:它使用生产者和使用者 API 进行输入,使用 Kafka 进行状态存储,并使用相同的组机制来实现流处理器实例之间的容错 。
 
Kafka 中的关键术语解释
 
Topic:主题 。在 Kafka 中,使用一个类别属性来划分消息的所属类,划分消息的这个类称为 Topic 。Topic 相当于消息的分类标签,是一个逻辑概念 。 
物理上不同 Topic 的消息分开存储,逻辑上一个 Topic 的消息虽然保存于一个或多个 Broker 上但用户只需指定消息的 Topic 即可生产或消费数据而不必关心数据存于何处 。
 
Partition:分区 。Topic 中的消息被分割为一个或多个 Partition,其是一个物理概念,对应到系统上 就是一个或若干个目录 。Partition 内部的消息是有序的,但 Partition 间的消息是无序的 。
 
Segment 段 。将 Partition 进一步细分为了若干的 Segment,每个 Segment 文件的大小相等 。 Broker:Kafka 集群包含一个或多个服务器,每个服务器节点称为一个 Broker 。 
Broker 存储 Topic 的数据 。如果某 Topic 有 N 个 Partition,集群有 N 个 Broker,那么每个 Broker 存储该 Topic 的一个 Partition 。


推荐阅读