Apache Kafka 是最盛行的开放源码最新消息全权众所周知。它已经成为了大数据操作的重要共同重要组成部分,你能在几乎大部份的微服务项目环境中找到它。责任编辑对 Apache Kafka 进行了概要介绍,并提供更多了两个事例来展示它的使用方式。
你是不是Dharmapuri,电商互联网平台是怎样在处置巨大的互联网流量时,努力做到不能雅雷的呢?是不是Dharmapuri,OTT 互联网平台是怎样在同时向上百万使用者交货内容时,努力做到相对平稳运转的呢?其实,关键性就在于它的分布式控制系统构架。
采用分布式控制系统构架设计的控制系统由数个机能模块共同组成。那些机能模块通常分布在数个电脑上,它透过互联网,触发器地互换最新消息,从而同时实现互相合作。正是由于触发器最新消息的存有,模块间才能同时实现可伸缩式、无堵塞的通讯,整个控制系统才能相对平稳运转。
触发器最新消息
触发器最新消息的常用优点有:
最新消息的商品和服务项目producer和顾客consumer都不晓得彼此之间的存有。它在不晓得旁人的情况下,加入和离开控制系统。最新消息全权broker甘当了商品和服务项目和顾客间的中介机构。商品和服务项目把每一最新消息,都与两个“主轴topic”密切相关。主轴是两个简单的数组。商品和服务项目能在数个主轴上推送最新消息,不同的商品和服务项目也能在同一个主轴上推送最新消息。顾客向全权订户两个或数个主轴的最新消息。商品和服务项目只将最新消息推送到全权,而不推送到顾客。全权会把最新消息推送到订户该主轴的大部份顾客。全权将最新输入输出给针对该主轴注册登记的大部份顾客。商品和服务项目并不期许得到顾客的任何澄清。换言之,商品和服务项目和顾客不能互相堵塞。市场上的最新消息全权有很多,而 Apache Kafka 是其中最畅销的众所周知。
Apache Kafka
Apache Kafka 是两个全力支持INS13ZD处置的、开放源码的分布式控制系统最新消息控制系统,它由 Apache 应用软件促进会开发。在构架上,它是数个全权共同组成的应用软件产业,那些全权间透过 Apache ZooKeeper 服务项目来协同。在转交、长久化和推送最新消息时,那些全权分摊应用软件产业上的阻抗。
南区Kafka 将最新消息载入称为“南区partition”的桶中。两个某一南区只留存两个主轴上的最新消息。例如,Kafka 会把 heartbeats主轴上的最新消息载入名叫heartbeats-0的南区(假定它是个单南区主轴),这个过程和商品和服务项目毫无关系。
不过,为了利用 Kafka 应用软件产业所提供更多的并行处置能力,管理员通常会为指定主轴创建数个南区。举个例子,假定管理员为 heartbeats主轴创建了三个南区,Kafka 会将它分别命名叫heartbeats-0、heartbeats-1和heartbeats-2。Kafka 会以某种方式,把最新消息分配到这三个南区中,并使它均匀分布。
还有另一种可能的情况,商品和服务项目将每一最新消息与两个最新消息键key密切相关。例如,同样都是在 heartbeats主轴上推送最新消息,有个模块使用C1作为最新消息键,另两个则使用C2。在这种情况下,Kafka 会确保,在两个主轴中,带有相同最新消息键的最新消息,总是会被载入到同两个南区。不过,在两个分区中,最新消息的最新消息键却不一定相同。下面的图 2 显示了最新消息在不同南区中的一种可能分布。
Kafka 在(由数个全权共同组成的)应用软件产业中维护了数个南区。其中,负责维护南区的那个全权被称为“领导者leader”。只有领导者能在它的南区上转交和推送最新消息。
可是,万一南区的领导者发生故障了,又该怎么办呢?为了确保业务连续性,每个领导者(全权)都会把它的南区复制到其他全权上。此时,那些其他全权就称为该南区的同步副本in-sync-replicas(ISR)。一旦南区的领导者发生故障,ZooKeeper 就会发起一次选举,把选中的那个同步副本任命为新的领导者。此后,这个新的领导者将承担该南区的最新消息接受和推送任务。管理员能指定南区需要维护的同步副本的大小。
最新消息长久化全权会将每个南区都映射到两个指定的磁盘文件,从而同时实现长久化。默认情况下,最新消息会在磁盘上保留两个星期。当最新消息载入南区后,它的内容和顺序就不能更改了。管理员能配置一些策略,如最新消息的保留时长、压缩算法等。
与大多数其他最新消息控制系统不同,Kafka 不能主动将最新消息推送到顾客。相反,顾客应该监听主轴,并主动读取最新消息。两个顾客能从某个主轴的数个南区中读取最新消息。数个顾客也能读取来自同两个南区的最新消息。Kafka 保证了同一个条最新消息不能被同两个顾客重复读取。
Kafka 中的每个顾客都有两个组 ID。那些组 ID 相同的顾客们共同共同组成了两个顾客组。通常,为了从 N 个主轴南区读取最新消息,管理员会创建两个包含 N 个顾客的顾客组。这样一来,组内的每个顾客都能从它的指定南区中读取最新消息。如果组内的顾客比可用南区还要多,那么多出来的顾客就会处于闲置状态。
在任何情况下,Kafka 都保证:不管组内有多少个顾客,同一个条最新消息只会被该顾客组读取一次。这个构架提供更多了一致性、高性能、高可扩展性、准实时交货和最新消息长久性,以及零最新消息丢失。
安装、运转 Kafka
尽管在理论上,Kafka 应用软件产业能由任意数量的全权共同组成,但在生产环境中,大多数应用软件产业通常由三个或五个全权共同组成。
在这里,我们将搭建两个单全权应用软件产业,对于生产环境来说,它已经够用了。
在浏览器中访问
https://kafka.apache.org/downloads,下载 Kafka 的最新版本。在 Linux 终端中,我们也能使用下面的命令来下载它: wget https://www.apache.org/dyn/closer.cgi?path=/kafka/2.8.0/kafka_2.12–2.8.0.tgz如果需要的话,我们也能把下载来的档案文件 kafka_2.12-2.8.0.tgz移动到另两个目录下。解压这个档案,你会得到两个名叫kafka_2.12-2.8.0的目录,它就是之后我们要设置的KAFKA_HOME。
打开 KAFKA_HOME/config目录下的server.properties文件,取消注释下面这一行配置:
listeners=PLAINTEXT://:9092这行配置的作用是让 Kafka 在本机的 9092端口转交普通文本最新消息。我们也能配置 Kafka 透过安全通道secure channel转交最新消息,在生产环境中,我们也推荐这么做。
无论应用软件产业中有多少个全权,Kafka 都需要 ZooKeeper 来管理和协同它。即使是单代理应用软件产业,也是如此。Kafka 在安装时,会附带安装 ZooKeeper,因此,我们能在 KAFKA_HOME目录下,在命令行中使用下面的命令来启动它:
./bin/zookeeper-server-start.sh ./config/zookeeper.properties当 ZooKeeper 运转起来后,我们就能在另两个终端中启动 Kafka 了,命令如下:
./bin/kafka-server-start.sh ./config/server.properties到这里,两个单全权的 Kafka 应用软件产业就运转起来了。
验证 Kafka
让我们在 topic-1主轴上尝试下推送和转交最新消息吧!我们能使用下面的命令,在创建主轴时为它指定南区的个数:
./bin/kafka-topics.sh –create –topic topic-1 –zookeeper localhost:2181 –partitions 3 –replication-factor 1上述命令还同时指定了复制因子replication factor,它的值不能大于应用软件产业中全权的数量。我们使用的是单全权应用软件产业,因此,复制因子只能设置为 1。
当主轴创建完成后,商品和服务项目和顾客就能在上面互换最新消息了。Kafka 的发行版内附带了商品和服务项目和顾客的命令行工具,供测试时用。
打开第三个终端,运转下面的命令,启动商品和服务项目:
./bin/kafka-console-producer.sh –broker-list localhost:9092 –topic topic-1上述命令显示了两个提示符,我们能在后面输入简单文本最新消息。由于我们指定的命令选项,商品和服务项目会把 topic-1上的最新消息,推送到运转在本机的 9092 端口的 Kafka 中。
打开第四个终端,运转下面的命令,启动顾客:
./bin/kafka-console-consumer.sh –bootstrap-server localhost:9092 –topic topic-1 –-from-beginning上述命令启动了两个顾客,并指定它连接到本机 9092 端口的 Kafka。它订户了 topic-1主轴,以读取其中的最新消息。由于命令行的最后两个选项,这个顾客会从最开头的位置,开始读取该主轴的大部份最新消息。
我们注意到,商品和服务项目和顾客连接的是同两个全权,访问的是同两个主题,因此,顾客在收到最新消息后会把最新消息打印到终端上。
下面,让我们在实际应用场景中,尝试使用 Kafka 吧!
事例
假定有一家叫做 ABC 的公共汽车运输公司,它拥有一支客运车队,往返于全国不同城市间。由于 ABC 希望实时跟踪每辆客车,以提高其运营质量,因此,它提出了两个基于 Apache Kafka 的解决方案。
首先,ABC 公司为大部份公交车都配备了位置追踪设备。然后,它使用 Kafka 建立了一个操作中心,以转交来自数百辆客车的位置更新。它还开发了两个仪表盘dashboard,以显示任一时间点大部份客车的当前位置。图 5 展现了上述构架:
在这种构架下,客车上的设备扮演了最新消息商品和服务项目的角色。它会周期性地把当前位置推送到 Kafka 的 abc-bus-location主轴上。ABC 公司选择以客车的行程编号trip code作为最新消息键,以处置来自不同客车的最新消息。例如,对于从 Bengaluru 到 Hubballi 的客车,它的行程编号就会是BLRHL003,那么在这段旅程中,对于大部份来自该客车的最新消息,它的最新消息键都会是BLRHL003。
仪表盘应用扮演了最新消息顾客的角色。它在全权上注册登记了同两个主轴 abc-bus-location。如此,这个主轴就成为了商品和服务项目(客车)和顾客(仪表盘)间的虚拟通道。
存有。得益于这种构架,数百辆客车和操作中心间同时实现了非堵塞通讯。
同时实现假定 ABC 公司想要创建三个南区来维护位置更新。由于我们的开发环境只有两个全权,因此复制因子应设置为 1。
相应地,以下命令创建了符合需求的主轴:
./bin/kafka-topics.sh –create –topic abc-bus-location –zookeeper localhost:2181 –partitions 3 –replication-factor 1商品和服务项目和顾客应用能用多种语言编写,如 Java、Scala、Python 和 JavaScript 等。下面几节中的代码展现了它在 Java 中的编写方式,好让我们有两个初步了解。
Java 商品和服务项目下面的 Fleet类模拟了在 ABC 公司的 6 辆客车上运转的 Kafka 商品和服务项目应用。它会把位置更新推送到指定全权的abc-bus-location主轴上。请注意,简单起见,主轴名称、最新消息键、最新消息内容和全权地址等,都在代码里硬编码的。
public class Fleet { public static void main(String[] args) throwsException{ String broker = “localhost:9092”; Properties props = newProperties; props.setProperty(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, broker); props.setProperty(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName); props.setProperty(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName); ProducerJava 顾客下面的 Dashboard类同时实现了两个 Kafka 顾客应用,运转在 ABC 公司的操作中心。它会监听abc-bus-location主轴,并且它的顾客组 ID 是abc-dashboard。当收到最新消息后,它会立即显示来自客车的详细位置信息。我们本该配置那些详细位置信息,但简单起见,它也是在代码里硬编码的:
public static void main(String[] args) { String broker = “127.0.0.1:9092”; String groupId = “abc-dashboard”; Properties props = newProperties; props.setProperty(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, broker); props.setProperty(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName); props.setProperty(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName); props.setProperty(ConsumerConfig.GROUP_ID_CONFIG, groupId);@SuppressWarnings(“resource”) Consumer依赖为了编译和运转那些代码,我们需要 JDK 8 及以上版本。看到下面的 pom.xml文件中的 Maven 依赖了吗?它会把所需的 Kafka 客户端库下载并添加到类路径中:
部署由于 abc-bus-location主轴在创建时指定了 3 个南区,我们自然就会想要运转 3 个顾客,来让读取位置更新的过程更快一些。为此,我们需要同时在 3 个不同的终端中运转仪表盘。因为大部份这 3 个仪表盘都注册登记在同两个组 ID 下,它自然就构成了两个顾客组。Kafka 会为每个仪表盘都分配两个某一的南区(来消费)。
当大部份仪表盘实例都运转起来后,在另两个终端中启动 Fleet类。图 6、7、8 展现了仪表盘终端中的控制台示例输出。
仔细看看控制台最新消息,我们会发现第两个、第二个和第三个终端中的顾客,正在分别从 partition-2、partition-1和partition-0中读取最新消息。另外,我们还能发现,最新消息键为BLRHBL002、BLRHBL004和BLRHBL006的最新消息载入了partition-2,最新消息键为BLRHBL005的最新消息载入了partition-1,剩下的最新消息载入了partition-0。
使用 Kafka 的好处在于,只要应用软件产业设计得当,它就能水平扩展,从而全力支持大量客车和上百万条最新消息。
不止是最新消息
根据 Kafka 官网上的数据,在《财富》100 强企业中,超过 80% 都在使用 Kafka。它部署在许多垂直行业,如金融服务项目、娱乐等。虽然 Kafka 起初只是一种简单的最新消息服务项目,但它已凭借行业级的流处置能力,成为了大数据生态控制系统的一环。对于那些喜欢托管解决方案的企业,Confluent 提供更多了基于云的 Kafka 服务项目,只需支付订户费即可。(LCTT 译注:Confluent 是两个基于 Kafka 的商业公司,它提供更多的 Confluent Kafka 在 Apache Kafka 的基础上,增加了许多企业级优点,被认为是“更完整的 Kafka”。)
via: https://www.opensourceforu.com/2021/11/apache-kafka-asynchronous-messaging-for-seamless-systems/
作者:Krishna Mohan Koyya选题:lkxed译者:lkxed校对:wxy
责任编辑由 LCTT原创编译,Linux中国荣誉推出