现代的互联网漫衍式系统,只要稍微大一些,就必然逃不开3类中间件:长途挪用(RPC)框架、动静行列、数据库会见中间件。Kafka 是动静行列中间件的代表产物,用 Scala 语言实现,本文回收的是 Kafka_2.11 0.10.0.0 版本举办尝试。
根基观念
首先,Kafka 中有一些根基的观念需要熟悉 1 2。
出格说明,Broker 是指单个动静处事历程,一般环境下,Kafka 是集群运行的,Broker 只是集群中的一个处事历程,而非代指整个 Kafka 处事,可以简朴将 Broker 领略成处事器(Server)。Kafka 引入的术语都较量常见,从字面上领略相对直观。Kafka 的大抵布局图是这样:
Kafka 是 Pull 模式的动静行列,即 Consumer 连到动静行列处事上,主动请求新动静,假如要做到及时性,需要回收长轮询,Kafka 在0.8的时候已经支持长轮询模式。上图中 Consumer 的毗连箭头偏向大概会让读者误觉得是 Push 模式,特此注明。更多关于 Kafka 设计的文章可以参考官方文档,可能一些较量好的博客文章 3。
关于顺序和分区
Kafka 是一个力争保持动静顺序性的动静行列,但不是完全担保,其担保的是 Partition 级此外顺序性,如下图:
此图是 Topic 的分区 log 的示意图,可见,每个分区上的 log 都是一个有序的行列,所以,Kafka 是分区级别有序的。假如,某个 Topic 只有一个分区,那么这个 Topic 下的动静就都是有序的。
分区是为了晋升动静处理惩罚的吞吐率而发生的,将一个 Topic 中的动静分成几份,别离给差异的 Broker 处理惩罚。如下图:
此图中有2个 Broker,Server 1 和 Server 2,每个 Broker 上有2个分区,总共4个分区,P0 ~ P3;有2个 Consumer Group,Consumer Group A 有2个 Consumer,Consumer Group B 有4个 Consumer。Kafka 的实现是,在不变的环境下,维持牢靠的毗连,每个 Consumer 不变的消费个中某几个分区的动静,以上图举例,Consumer Group A 中的 C1 不变消费 P0、P3,C2 不变消费 P1、P2。这样的毗连分派大概会导致动静消费的不匀称漫衍,但长处是较量容易担保顺序性。
维持完全的顺序性在漫衍式系统看来险些是无意义的。因为,假如需要维持顺序性,那么就只能有一条线程阻塞的处理惩罚顺序动静,即,Producer -> MQ -> Consumer 必需线程上一一对应。这与漫衍式系统的初志是相违背的。可是局部的有序性,是可以维持的。好比,劳务派遣管理系统,有30000条动静,每3条之间有关联,昆山软件公司,1->2->3,4->5->6,……,可是全局范畴来看,并不需要担保 1->4->7,可以 7->4->1 的顺序来执行,这样可以到达最大并行度10000,而这凡是是现实中我们面临的环境。凡是应用中,将有先后干系的动静发送到沟通的分区上,即可办理大部门问题。
关于副本
副本是高可用 Kafka 集群的实现方法。假设集群中有3个 Broker,那么可以指定3个副本,这3个副本是对等的,对付某个 Topic 的分区来说,个中一个是 Leader,即主节点,别的2个副本是 Follower,即从节点,每个副本在一个 Broker 上。当 Leader 收到动静的时候,会将动静写一份到副本中,凡是环境,只有 Leader 处于事情状态。在 Leader 产生妨碍宕机的时候,Follwer 会代替 Leader 继承传送动静,而不会产活跃静丢失。Kafka 的副本是以分区为单元的,也就是说,纵然是同一个 Topic,其差异分区的 Leader 节点也差异。甚至,Kafka 倾向于用差异的 Broker 来做分区的 Leader,因为这样能做到更好的负载平衡。