【Kafka】 简介
【Kafka】 简介
Metadata
title: 【Kafka】 简介
date: 2023-02-14 12:32
tags:
- 行动阶段/完成
- 主题场景/组件
- 笔记空间/KnowladgeSpace/ProgramSpace/ModuleSpace
- 细化主题/Module/Kafka
categories:
- Kafka
keywords:
- Kafka
description: 【Kafka】 简介
【Kafka】 简介
什么是事件流
事件流相当于人体的中枢神经系统。它是“永远在线”世界的技术基础,在这个世界中,业务越来越多地由软件定义和自动化,软件的用户更多地是软件。
从技术上讲,事件流是指从事件源(如数据库、传感器、移动设备、云服务和软件应用程序)实时捕获数据,并以事件流的形式呈现。持久地存储这些事件流以供以后检索;实时地、回溯地操作、处理和响应事件流;并根据需要将事件流路由到不同的目标技术。因此,事件流确保了数据的连续流动和解释,以便正确的信息在正确的时间出现在正确的地方。
事件流的用途
事件流被应用于许多行业和组织的各种用例。它的许多例子包括:
- 实时处理支付和金融交易,如在证券交易所、银行和保险。
- 实时跟踪和监控汽车、卡车、车队和运输,如在物流和汽车行业。
- 持续捕获和分析来自物联网设备或其他设备的传感器数据,如工厂和风园区。
- 收集并立即对客户交互和订单做出反应,例如在零售、酒店和旅游业以及移动应用程序中。
- 监测住院病人,预测病情变化,确保在紧急情况下及时治疗。
- 连接、存储公司不同部门产生的数据,并使其可用。
- 作为数据平台、事件驱动架构和微服务的基础。
Apache Kafka®是一个事件流平台。这是什么意思?
Kafka结合了三个关键功能,因此您可以使用一个经过实战测试的解决方案来实现端到端的事件流用例:
- 发布(写入)和订阅(读取)事件流,包括从其他系统连续导入/导出数据。
- 持久可靠地存储事件流,想存储多久就存储多久。
- 回溯处理发生的或回溯的事件流
所有这些功能都以一种分布式、高度可扩展、弹性、容错和安全的方式提供。Kafka可以部署在裸机硬件、虚拟机和容器上,也可以部署在本地和云端。您可以选择自管理您的Kafka环境,还是使用由各种供应商提供的完全管理的服务。
简而言之,Kafka是如何运作的?
Kafka是一个分布式系统,由服务器和客户端组成,通过高性能TCP网络协议进行通信。它可以部署在裸金属硬件、虚拟机和内部环境中的容器以及云环境中。
服务端:Kafka作为一个集群运行,由一个或多个服务器组成,可以跨越多个数据中心或云区域。其中一些服务器形成存储层,称为代理。其他服务器运行Kafka Connect,以事件流的形式持续导入和导出数据,从而将Kafka与现有系统(如关系型数据库和其他Kafka集群)集成在一起。为了实现关键任务,Kafka集群具有高度的可扩展性和容错性:如果其中任何一台服务器发生故障,其他服务器将接管它们的工作,以确保连续运行,不会有任何数据丢失。
客户端:它们允许您编写分布式应用程序和微服务,以并行、大规模和容错的方式读取、写入和处理事件流,即使在网络问题或机器故障的情况下。Kafka附带了一些这样的客户端,这些客户端是由Kafka社区提供的数十种客户端扩展而来的:Java和Scala客户端,包括更高级的Kafka Streams库、Go、Python、C/ c++和许多其他编程语言以及REST api。
主要概念和术语
事件记录了世界上或您的业务中“发生了某事”的事实。在文档中也称为记录或消息。当你读取或写入数据到Kafka时,你以事件的形式做这件事。从概念上讲,事件具有键、值、时间戳和可选的元数据标头。下面是一个事件示例:
- Event key: “Alice”
- Event value: “Made a payment of $200 to Bob”
- Event timestamp: “Jun. 25, 2020 at 2:06 p.m.”
生产者是那些向Kafka发布(写入)事件的客户端应用程序,消费者是那些订阅(读取和处理)这些事件的客户端应用程序。在Kafka中,生产者和消费者彼此完全解耦且不可知,这是实现Kafka所熟知的高可伸缩性的关键设计元素。例如,生产者从不需要等待消费者。Kafka提供了各种保证,比如能够精确地一次处理事件。
事件被组织起来并持久存储在主题中。简单来说,主题类似于文件系统中的文件夹,而事件就是该文件夹中的文件。例如,主题名称可以是“payments”。Kafka中的主题总是多生产者和多订阅者:一个主题可以有0个、1个或多个生产者向它写入事件,也可以有0个、1个或多个消费者订阅这些事件。主题中的事件可以根据需要随时读取,与传统的消息系统不同,事件在使用后不会被删除。相反,你可以通过每个主题的配置设置来定义Kafka应该保留事件的时间,超过这个时间,旧的事件将被丢弃。Kafka的性能实际上与数据大小无关,因此长时间存储数据是完全没问题的。
主题是分区的,这意味着一个主题分布在位于不同Kafka broker上的许多“桶”中。数据的分布式放置对于可扩展性非常重要,因为它允许客户端应用程序同时从多个代理读取和写入数据。当一个新事件被发布到一个主题时,它实际上被附加到该主题的一个分区中。具有相同事件键的事件(例如,客户ID或车辆ID)被写入相同的分区,Kafka保证给定topic-partition的任何消费者总是以完全相同的顺序读取该分区的事件。
图:这个示例主题有四个分区P1-P4。两个不同的生产者客户端通过网络将事件写入主题的分区,从而相互独立地向主题发布新事件。具有相同键(在图中由它们的颜色表示)的事件被写入相同的分区。注意,如果合适的话,两个生产者都可以写入同一个分区。
为了使你的数据具有容错性和高可用性,每个主题都可以被复制,甚至可以跨地理区域或数据中心,这样总是有多个代理都有一份数据副本,以防出现问题,你想对代理进行维护,等等。一个常见的生产环境设置是复制因子3,也就是说,你的数据总是有三个副本。
这种复制是在主题分区级别上执行的。这篇入门文章足够做一个介绍了。如果你感兴趣,文档的设计部分详细解释了Kafka的各种概念。
Kafka APIs
除了用于管理和管理任务的命令行工具外,Kafka还为Java和Scala提供了五个核心api:
- 管理API,用于管理和检查主题、代理和其他Kafka对象。生产者API发布(写入)事件流到一个或多个Kafka主题。
- 消费者API,用于订阅(读取)一个或多个主题,并处理由此产生的事件流。
- Kafka Streams API实现流处理应用程序和微服务。它提供了处理事件流的高级函数,包括转换、有状态操作(如聚合和连接)、开窗、基于事件时间的处理,等等。从一个或多个主题中读取输入,以生成一个或多个主题的输出,有效地将输入流转换为输出流。
- Kafka Connect API用于构建和运行可重用的数据导入/导出连接器,这些连接器消费(读)或产生(写)来自外部系统和应用程序的事件流,以便与Kafka集成。例如,像PostgreSQL这样的关系数据库的连接器可能捕获对一组表的每一个更改。然而,在实践中,你通常不需要实现自己的连接器,因为Kafka社区已经提供了数百种现成的连接器。