最近项目关系了解到了Kafka,一下被这个神奇的物种折服,它代表着无限扩展,发布/订阅,随时在线并且连通万物。所以必须要进一步了解它,欢迎同道的朋友一起讨论学习。
参考:
https://kafka.apache.org/documentation.html#introduction
https://www.confluent.io/blog/microservices-apache-kafka-domain-driven-design/
https://www.confluent.io/hub/
https://www.confluent.io/apache-kafka-vs-confluent/
https://www.kai-waehner.de/blog/2019/11/22/apache-kafka-automotive-industry-industrial-iot-iiot/
https://www.jianshu.com/p/f13844f815f0
https://www.jianshu.com/p/894549cd2068
https://www.jianshu.com/p/fa307ecc1eeb
https://www.orchome.com/343
https://www.jianshu.com/p/1136f37cc419
https://blog.51cto.com/quantfabric/2499090
https://blog.csdn.net/xiaoyu_BD/article/details/81783076
https://blogs.sap.com/2021/03/16/cloud-integration-what-you-need-to-know-about-the-kafka-adapter/
https://assets.cdn.sap.com/sapcom/docs/2017/06/66673acb-c37c-0010-82c7-eda71af511fa.pdf
https://help.sap.com/docs/SAP_NETWEAVER_750/6522d0462aeb4909a79c3462b090ec51/d90da4dd2c4743948e3f018c90a235d7.html?locale=en-US&version=7.5.17
https://help.sap.com/saphelp_nwes72/helpdata/EN/4a/1415a4174f0452e10000000a421937/content.htm?no_cache=true
https://www.sap.com/products/data-intelligence.html?btp=5dbe7fa2-8f01-4b3c-bf38-e3d7788ea06b
https://blogs.sap.com/2018/11/11/sap-data-hub-2.3-hello-kafka-world/
https://blog.csdn.net/i042416/article/details/105289270/
首先要搞清楚什么是事件,然后什么是事件流?
对于关系型数据库,它的数据日志机制就是时间流,我们对数据库做的CUD操作(查询不修改状态 ),会写两个日志,一个是redo log,一个是bin log,而日志中记录的就是驱动数据库系统状态变化的事件(日志),比如把表t的id为5的记录年龄+1。
一个例子说明什么是事件流:
从上边购买图书的例子中,笔者特别强调这7个步骤的动作,其实每个步骤都会产生事件,而这些时间按照时间就组成了购买图书这个业务的事件流,而对于用户来讲,我只在天猫上做了下单购买的操作而已。考虑到天猫或者淘宝在国内占据统治地位的电商平台每天的订单量,你大概能测算出来每天会产生多少数量的事件,可以说是数以亿计。
事件流之后,是事件流平台
Kafka是一个事件流平台。它通常被描述为发布/订阅消息传递系统或分布式提交日志。Kafka在可以分区的主题中存储键值消息(记录)。每个分区使用增量偏移量(记录在分区中的位置)按顺序存储这些记录。记录在使用时不会被删除,但它们会一直保留,直到代理满足保留时间或保留大小。在此之前,消息可以由一个或多个(不同的)消费者一次又一次地重新处理。
为了优化效率,底层消息传递协议是基于tcp的。消息通常被分组在一起以减少网络开销,这将导致更大的网络包。
Kafka运行在一个或多个服务器(代理)的集群上,所有的主题和分区都分布(和复制)在这些代理上。这种体系结构允许您分配负载并提高容错能力。集群中的每个代理充当某些分区的leader,并充当由其他代理领导的分区的副本。
Kafka是一款开源的消息处理引擎,通常我们称之为消息中间件,与之齐名的还有阿里巴巴开源的RocketMQ。汽车行业中,奥迪、宝马、保时捷和特斯拉等汽车制造商,以及优步、Lyft和Here Technologies等移动服务公司都在使用Kafka。
Kafka除了提供消息中间件所必须的消息发送,Borker,分区,消费者端,高可用和高可靠等机制外,还提供了事件流模式所需要的核心组件和能力。站在事件流模式的角度,我们可以把Kafka提供的能力分为三类:1,消息的发布和订阅模式;2,持久化存储机制;3,消息处理引擎。
一个例子对比显示使用Kafka的效果
使用前:
使用后:
从Kafka体系结构来看,Kafka是一套分布式的系统,由客户端和服务器端组成,服务器端也叫Broker,客户端负责生产和消费事件数据。接下来我们分别介绍一下Kafka的核心组件以及事件流组件。
【Kafka Broker】
Broker的最主要的工作就是持久化生产者客户端发送的消息数据,消息被按照key-value的格式进行存储。由于消息是以字节码的格式被保存在磁盘上,因此这些消息数据对于Broker来说就如同黑盒子,因为Broker其实也不知道消息中具体有什么内容,并且Borker也不关心。
【Schema registry】
基于消息队列通信的两个系统,消息格式非常重要,因为消息格式就如同两个做生意实体签订的合同,业务往来必须按照约定的模式进行。而Schema在消费者端和生产者端建立了这种约束。Kafka的Sechema Registry机制为生产者端和消费者端提供Schema管理,版本控制,序列化和反序列等机制,来加速基于事件流模式的应用落地实施。
【Kafka Connect】
Kafka Connect基于客户端对象模型进行了抽象,来提供Kafka数据的接入和输出的能力。Connect是和外部数据源集成的核心,并且提供了轻量级的数据转换机制。如下图所示:
【Kafka Streams】
Kafka Streams是一套原生的流数据处理框架,Streams框架基于Java语言编写。Streams组件并不是运行在Broker上,提供了事件数据的操作,包括数据转换的能力,以及数据连接和聚合操作。从这个角度看,我们的大部分工作都将会集中在Streams组件上。
【Kafka ksqlDB】
ksqlDB是一套事件流持久化数据库,并对事件流数据提供了类SQL的查询接口,从具体实现的角度来看,ksqlDB使用Kafka Streams来进行事件流数据的各种操作。ksqlDB最大的优势就是提供了一套类SQL的查询接口,让熟悉关系型数据的业务人员可以无缝切换到流数据的分析场景。
kafka的工作原理
MQ 系统都有两个比较通用的缺陷:一是当消费者出现,无法及时消费的时候,数据就会丢掉;二是可延展性问题,MQ 系统很难很好地配合数据的波峰或波谷。这些需求正好对应当时的消息队列系统不能解决的一些问题:「横向拓展、持久化、高吞吐、高性能、甚至是低成本」。因此Kafka这一流处理系统出现后,瞬间成为大数据流处理系统的事实标准。
简单讲就是上面的 横向拓展、持久化、高吞吐、高性能、甚至是低成本
参考 https://www.jianshu.com/p/894549cd2068
这里写的只是低版本出现的问题,高版本中可能已经不存在?
参考 https://www.jianshu.com/p/59cb3e8a93e9
Kafka Connect是到0.9版本才提供的并极大的简化了其他系统与Kafka的集成。Kafka Connect运用用户快速定义并实现各种Connector(File,Jdbc,Hdfs等),这些功能让大批量数据导入/导出Kafka很方便。
如图中所示,左侧的Sources负责从其他异构系统中读取数据并导入到Kafka中;右侧的Sinks是把Kafka中的数据写入到其他的系统中。
Kafka Connect 是一个可扩展、可靠的在Kafka和其他系统之间流传输的数据工具。它可以通过connectors(连接器)简单、快速的将大集合数据导入和导出kafka。Kafka Connect可以接收整个数据库或收集来自所有的应用程序的消息到Kafka Topic。使这些数据可用于低延迟流处理。导出可以把topic的数据发送到secondary storage(辅助存储也叫二级存储)也可以发送到查询系统或批处理系统做离线分析。
Kafka Connect功能包括:
Kafka连接器通用框架:Kafka Connect 规范了kafka与其他数据系统集成,简化了connector的开发、部署和管理。
分布式和单机模式
- 扩展到大型支持整个organization(公司、组织)的集中管理服务,也可缩小到开发,测试和小规模生产部署。
REST 接口
- 使用REST API来提交并管理Kafka Connect集群。
自动的offset管理
- 从connector获取少量的信息,Kafka Connect来管理offset的提交,所以connector的开发者不需要担心这个容易出错的部分。
分布式和默认扩展
- Kafka Connect建立在现有的组管理协议上。更多的工作可以添加扩展到Kafka Connect集群。
流/批量集成
- 利用kafka现有的能力,Kafka Connect是一个桥接流和批量数据系统的理想解决方案。
Kafka Connector很多,包括开源和商业版本的。如下列表中是常用的开源Connector
Connectors | References |
---|---|
Jdbc | Source, Sink |
Elastic Search | Sink1, Sink2, Sink3 |
Cassandra | Source1, Source 2, Sink1, Sink2 |
MongoDB | Source |
HBase | Sink |
Syslog | Source |
MQTT (Source) | Source |
Twitter (Source) | Source, Sink |
S3 | Sink1,Sink2 |
商业版的可以通过Confluent.io获得
2014 年的时候,Kafka 的三个主要开发人员从 LinkedIn 出来创业,开了一家叫作 Confluent 的公司。和其他大数据公司类似,Confluent 的产品叫作 Confluent Platform。这个产品的核心是 Kafka,分为三个版本:Confluent Open Source、Confluent Enterprise 和 Confluent Cloud。
Confluent的介绍是:
超过70%的财富500强使用了Apache Kafka,它已经成为动态数据的基础平台,但是自给自足的开源项目将你带到了管理底层数据基础设施的业务中。这就是现代企业选择Confluent的原因,这样他们就可以把重点放在重要的地方。以Kafka为核心,Confluent提供了一个更完整的、云原生的平台来设置你的数据,在你的数据和应用驻留的任何地方都可以使用。
可以理解为confluent是Kafda为核心,包了一些方便使用的管理功能和控件。
具体的对比参考Apache Kafka VS Confluent
Confluent Open Source 是 Confluent 公司在 Kafka 上的一个增强版本,其主要增强的地方是:增加了一个 REST 代理,以便客户端可以使用 HTTP 连接;增加了对 Java 以外的语言的支持,比如 C++、Python 和.NET;增加了对 Hadoop 文件系统、亚马逊 S3 存储、JDBC 等的连接的支持;最重要的是一个 Schema Registry,这是对 Kafka 一个比较大的增强,它使得 Kafka 的数据流必须符合注册的 Schema,从而增强了可用性。所有这些东西本身也都是开源的,这使得其他第三方在这个上面继续开发新功能成为了可能。
Confluent Enterprise 是 Confluent 面向企业级应用的产品,里面增加了一个叫作 Confluent Control Center 的非开源产品。Confluent Control Center 是一个对整个产品进行管理的控制中心,最主要的功能对这个 Kafka 里面各个生产者和消费者的性能监控。
Confluent Cloud 是 Confluent Enterprise 的云端托管服务,它增加了一个叫作云端管理控制台的组件。除此之外,按照 Confluent 的说法,其实没有什么差别。但是对于想要省心的用户来说,这个产品无疑是更好的选择。
Confluent Kafka开源版特性如下:
(1)Confluent Kafka Connectors:支持Kafka Connect JDBC Connector、Kafka Connect HDFS Connector、Kafka Connect Elasticsearch Connector、Kafka Connect S3 Connector。
(2)多客户端支持:支持C/C++、Python、Go、.Net、Java客户端。
(3)Confluent Schema Registry
(4)Confluent Kafka REST Proxy
Confluent Kafka企业版特性如下:
(1)Automatic Data Balancing
(2)Multi-DataCenter Replication
(3)Confluent Control Center
(4)JMS Client
当通过网络发送数据或将数据存储在文件中时,需要对数据进行序列化。常见跨语言的序列化库如Avro、Thrift和Protocol buffer,存在两个明显的缺点:
(1)数据生产者和数据消费者间缺乏契约。如果上游生产者随意更改数据格式,很难确保下游消费者能够正确解释数据。
(2)开销和冗余。所有消息都会显示保存相同字段名和类型信息,存在大量冗余数据。
无论是使用传统的Avro API自定义序列化类和反序列化类还是使用Twitter的Bijection类库实现Avro的序列化与反序列化,都会在每条Kafka记录里都嵌入schema,会让记录的大小成倍地增加。在读取记录时需要用到整个schema,Schema Registry可以让所有记录共用一个schema。
Confluent Control Center是一个对整个产品进行管理的控制中心,最主要的功能对Kafka集群的各个生产者和消费者的进行性能监控,同时可以很容易地管理Kafka的连接、创建、编辑和管理与其它系统的连接。
Confluent Control Center只在Confluent Kafk企业版提供支持
KSQL是面向Apache Kafka的一种流式SQL引擎,为使用Kafka处理数据提供了一种简单的、完全交互的SQL界面,支持众多功能强大的数据流处理操作,包括聚合、连接、加窗(windowing)和sessionization(捕获单一访问者的网站会话时间范围内所有的点击流事件)等等。
KSQL目前还无法执行查询,KSQL提供的是对Kafka中的数据流执行连续查询,即随着新数据不断流入,转换在连续进行。
Confluent Platform可以轻松地在多个数据中心内维护多个Kafka群集。Confluent Replicator提供了管理数据中心之间的数据复制和topic配置的功能,应用场景如下:
(1)ative-active地理定位部署:允许用户访问最近(附近)的数据中心,以优化其架构,实现低延迟和高性能。
(2)集中分析:将来自多个Kafka集群的数据聚合到一个地方,以进行组织范围的分析。
(3)云迁移:可以使用Kafka完成本地应用与云之间的数据迁移。
随着集群的增长,topic和partition以不同的速度增长,随着时间的推移,添加和删除会导致跨数据中心资源的工作负载不平衡(数据倾斜)。Confluent Auto Data Balancer会监控集群中的Broker数量、partition大小、partition数量,允许转移数据以在整个群集中创建均匀的工作负载,同时限制重新平衡流量,以最大限度地减少重新平衡时对生产工作负载的影响。
Kafka Connect是Kafka的一个开源组件,是用来将Kafka与数据库、key-value存储系统、搜索系统、文件系统等外部系统连接起来的基础框架。
通过使用Kafka Connect框架以及现有的Connector可以实现从源数据读入消息到Kafka,再从Kafka读出消息到目的地的功能。
Confluent在Kafka Connect基础上提供了对多种常用系统的支持:
具体以官网为准
MQTT Proxy提供了允许MQTT客户端以Kafka原生方式直接向Kafka发送消息的可伸缩的轻量级接口。
MQTT Proxy用于把基于物联网(IoT)的应用程序和Kafka 集成,可以用于联网汽车、制造业生产线和预测性维护应用程序中。
MQTT Proxy使用传输层安全(TLS)加密和基本身份验证,支持 MQTT 3.1.1 协议,可以发布所有三个MQTT服务质量级别的消息,服务级别包括把消息发送给消费者:1)最多一次(即发即弃);2)至少一次(需要确认);3)恰好一次
CPI中有Kafka适配器。 既有Sender Adapter也有Receiver Adapter。
Kafka发送器适配器从一个或多个主题中批量获取Kafka记录。配置
下面几个配置截图方便理解
Kafka接收适配器发送Kafka记录(或批)到一个主题(或分区)。配置
web服务用于构建面向服务的体系结构(SOA)来集成应用程序,web服务通常使用SOAP或REST / HTTP作为技术。大多数中间件工具都对构建HTTP服务提供了适当的支持。SAP一些产品并不提供HTTP开放接口,但可以用一些工具来实现,比如PI, PO ,CPI,SAP Cloud Integration。
对于与Kafka的直接HTTP(S)通信,**Confluent Rest Proxy**是一个很好的选择,可以从任何Kafka客户端(包括自定义的SAP应用程序)生产、消费和管理。例如,SAP云平台集成(CPI)可以使用这种集成模式在SAP和Kafka之间进行集成。
除了SAP自己做的集成工具之外,很多第三方也在做SAP的集成工具,比如:
Kafka Connect是Apache Kafka的一个开源组件,是一个框架,用于连接Kafka和外部系统,如数据库、键值存储、搜索索引和文件系统。
Kafka Connect连接器适用于SAP ERP数据库:
这只是几个例子。还有许多用于与不同的SAP产品和接口进行内部集成、云计算和混合集成。
这种类型的连接器有以下优点:
缺点是:
2021年1月后,Kafka-native集成可以与INIT的ODP连接器一起使用。它消除了上述缺点,对于某些用例来说,它可能是一个很棒的第三方选择。
Kafka Connect是一个很棒的框架,在大多数Kafka架构中都有使用。对于SAP集成,情况有所不同,因为没有可用的连接器(除了直接数据库访问)。第三方供应商花了很多年的时间来实现RFC/BAPI/iDoc与他们的工具的集成。这样的实现可能不会在Kafka中再次发生,因为它非常复杂,而且这些专有的遗留接口无论如何都会消亡。对于现代的SAP接口,情况是不同的:一些第三方供应商在他们的产品中使用Kafka Connect。例如,INIT Software的Kafka Connect ODP连接器。
使用Java客户端为SAP云平台企业消息传递提供Kafka Connect连接器将是一个可行且最佳的选择。我认为我们迟早会在市场上看到这样的连接器。
上面我们已经看到了SAP和Kafka之间的各种集成选项。不幸的是,所有这些都是基于“静止数据”的原则,而不是Kafka处理的“动态数据”。在此之前,最合适的集成方式是通过SAP云平台企业消息传递进行集成,因为您至少可以利用异步消息传递API。
当Kafka不仅用于实时消息传递,还用于事件流时,真正的附加值就来了。Kafka使用它的分布式存储基础设施提供了消息、数据集成、数据处理和真正的解耦的组合。
SAP收购的产品中有的也使用的kafka,比如财务报销软件SAP Concur和体验管理平台SAP Qualtrics。
显然,人们也在等待kafka原生的SAP S4/Hana接口,这样他们就可以利用实时事件来处理动态数据,并将实时数据和历史数据关联在一起。Kafka与SAP S4/Hana的本地集成应该是SAP的下一步!HERE Technologies提供了一个很好的例子来说明如何为他们的产品提供一个Kafka-native接口(以及一个可选的REST选项)。
目前原生接口方面,除了上面提到直接访问数据库的接口外没有太好的原生连接器,未来一定会有,现在有的供应商会提出两步走的策略:首先为外部提供一个kafka本地接口(在SAP术语中,就是在bapi之上提供一个kafka接口)。然后等技术成熟后,再重新设计内部架构,将不可伸缩的技术转移到Kafka(在SAP术语中,你可以用一个更可伸缩的Kafka原生版本替换RFC / BAPI函数——即使使用相同的API接口和消息结构)。
存在多个流产品时,往往采用的是流复制,而不是用API集成的方式。
想想看:如果你在不同的应用基础设施中使用Kafka,但接口只是一个web服务或数据库,那么所有的好处可能会消失,因为可伸缩性和/或实时数据相关性消失了。这里我理解是如果有同的产品之间,比如SAP ERP和SAP CRM之间如果是用的API或是SOAP接口集成,那就没什么优势了,即使其中一个产品用了可伸缩的Kafka,也体现不出优势了。不需要数字化转型和工业4.0的需求了。
因此,越来越多的公司不仅在内部使用Kafka,而且在部门之间甚至不同的公司之间使用。通过MirrorMaker 2.0或Confluent Replicator等工具,可以实现公司之间的流复制。或者你可以使用来自Confluent的更简单的集群链接,它可以使用Kafka协议在混合、多云或第三方集成之间进行集成。
在全球范围内,将SAP应用程序与Apache Kafka集成在一起以实现实时消息、数据集成和大规模数据处理的需求是巨大的。SAP ERP (ECC和S4/Hana)的需求是真实的,SAP众多产品组合中的大多数其他产品也是如此。
下面重点研究了Confulent的连接器,和INIT的连接器
其中,搜索SAP发现有三个,属于partner级别的
分别是:
这三个都可以做为source的connector,最后一个可以做为sink也就是消费端的连接器。
除此之外JDBC Connector可以做为通用的连接器,JDBC源和接收连接器允许你在关系数据库和Kafka之间交换数据。JDBC源连接器允许你用JDBC驱动从任何关系数据库导入数据到Kafka主题。
ODP Source Connector连接器用于将数据从支持增量的SAP运营数据供应数据源中获取到Apache Kafka中。它实现了SAP ODP API v2,它为以完全模式和增量模式从各种SAP产品和模块中提取和复制业务数据提供了技术基础设施
Operational Data Provisioning提供了一个技术基础设施,主要用在支持两个应用程序场景。第一个是 操作性分析,用于业务流程中的决策制定。另一种是 数据提取和复制。
来自应用程序的数据源在联合建模环境中建模,以便使用搜索和Operational Analytics的概念进行搜索分析,并相互链接。搜索和分析模型是为此目的而定义的。在搜索和分析模型中,分析所需的属性是通过定义操作数据提供者(ODP)来设置的。ODP是复制和OLAP分析的基础。InfoProvider由一个ODP及其关联的ODP衍生而来。您可以为这些“TransientProviders”定义和运行分析查询。数据源特别适合作为分析的数据源,但是应用程序中的其他数据源也可以用于操作数据提供。Operational Data Provisioning支持事务数据和主数据(属性、文本、层次结构)的搜索和分析模型。SAP提供了搜索和分析模型,为各种业务应用程序提供了广泛的业务内容。增强概念允许对基于数据源的模型进行特定于客户的增强。对于特定于客户的数据源,可以创建特定于客户的odp以及搜索和分析模型。
以下是最常见的ODP集成场景的概述(不常见的场景是灰色的——Operational Analytics用例没在这个文档里,忽略)
2.8 版本以后,可以在没有 ZooKeeper 的情况下运行 Kafka,前后对比:
**SAP Open Hub Service
**