Apache Kafka不适用于Event Sourcing

2023-10-24 08:18

本文主要是介绍Apache Kafka不适用于Event Sourcing,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

     前段时间着手分布式事务,初布研究方向是基于消息总线事件数据一致性方案,消息总线考虑到之前应用的rabbitMQ,但想到分布式事务锁机制zookeeper有很好的实现,同时Kafka也是基于zookeeper实现的消息队列机制,最近正好看到这相关博文,特此引荐,以观后效.

Eventuate是建立高扩展的事件溯源event sourcing和使用因果一致性建立事件协助的开源服务框架。基于事件驱动和事件溯源的服务能够给予因果顺序的事件流通讯,服务可位于单个服务器本地也可以分布到全球规模,使用因果一致性复制,保持网络分区之间的写操作高可用性。

Eventuate有Java和Scala两个API,基于Akka编写。

具体特性如下:
1.提供建立有态事件溯源服务、持久化和内存查询数据库和事件处理管道。
2.激活服务通过一个可靠分区冗余事件总线通讯,该总线基于因果事件顺序,可分布到大型分布式系统。
3.支持使用因果一致性进行有态服务复制,使用自动和互动的冲突解决方案实现当前状态更新。
4.提供基于操作的CRDTs(Conflict-free replicated data types )实现。
5.允许服务跨多个区域分布开发运行
6.支持用于更新查询数据库的分布式服务的事件聚合
7.提供适配第三方流处理框架用于事件流分析。

基于操作的CRDTs
CRDTs是免冲突复制数据类型Conflict-free replicated data types 的简称。是一种可复制的数据类型,在发生更新时,所有数据类型最终会收敛到相同状态。一个CRDT在更新时无需进行复制协调,因此节约了协调成本,提高效率。这使得CRDT对于写操作高可用,CRDT能够被分类成基于状态的CRDTs和基于操作的CRDTs,简称CvRDTs和CmRDTs。基于状态的CRDTs是于传播状态的复制,而基于操作的CRDTs则是传播操作。

如果操作是通过一个可靠的因果(RCB)中间件广播传播就会保证Cmrdt复制最终一致收敛,他们设计用于并行操作交换。

CvRDTs不需要对底层消息中间件有特别要求,但是状态传播需要增加带宽或降低状态大小。

CmRDT操作分为两个阶段:prepare和effect,prepare在本地节点上执行。它着眼于操作和(可选)当前状态,并产生一个代表操作的消息,然后分发给所有的其他节点。effect适用于所有节点上的传播操作。

与事件溯源有关
CmRDT两个更新阶段:prepare和effect和事件溯源实体的更新阶段(命令处理和事件处理)有关:

1.在命令处理中,传入命令(可选)对实体的当前状态进行了验证,如果验证成功,则表示代表该命令效果的事件可被写入事件日志中。这相当于在cmrdt的prepare阶段产生的操作。

2.在事件处理中,写入事件日志中的写入事件被拿出使用,用于更新实体的当前状态。这相当于将产生cmrdt的effect效果。

Eventuate提供 EventsourcedActor实现定制命令和事件处理。

可靠的因果广播
大多数CmRDT需要更新操作的因果传输顺序,因果传输可通过事件日志提供的前后顺序轻松完成,但是,如果事件日志本身被复制(例如在Kafka集群中的一个分区topic),或它一点也不复制的,这样的事件日志的可用性是有限的,因为它必须协调所有复制备份的更新。

因此,让cmrdts共享一个完全有序的事件日志会受限制于底层的事件日志的可用性,这不是我们想要的。

我们需要的是将cmrdt复制跨分布地理位置(或可用性区域)分布,每个本地都有其自己的本地事件日志,仍然保持可以写入,即使与其他地方分区分开来。在一个本地写入的事件通过异步和可靠地复制到其他位置。能够在这样一个网络复制本地事件日志以达到最强的全局秩序才满足的cmrdts规定的因果关系。

在Eventuate 中本地事件日志称为可复制的event log,可复制的event lg中因果跟踪通过向量时钟实现,向量时钟是作为潜在的因果关系代表,是一种部分顺序。

CRDT服务框架
之前介绍了如何将CmRDT继承到Eventuate的事件溯源和事件协调底层设施,为了解放CmRDT开发者,Eventuate提供CmRDT服务开发框架隐藏了这些底层细节。

详细原理见:https://krasserm.github.io/2016/10/19/operation-based-crdt-framework/

Eventuate项目:
GitHub - RBMHTechnology/eventuate: Global-scale ev

这篇关于Apache Kafka不适用于Event Sourcing的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/273893

相关文章

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

Kafka拦截器的神奇操作方法

《Kafka拦截器的神奇操作方法》Kafka拦截器是一种强大的机制,用于在消息发送和接收过程中插入自定义逻辑,它们可以用于消息定制、日志记录、监控、业务逻辑集成、性能统计和异常处理等,本文介绍Kafk... 目录前言拦截器的基本概念Kafka 拦截器的定义和基本原理:拦截器是 Kafka 消息传递的不可或缺

Apache Tomcat服务器版本号隐藏的几种方法

《ApacheTomcat服务器版本号隐藏的几种方法》本文主要介绍了ApacheTomcat服务器版本号隐藏的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需... 目录1. 隐藏HTTP响应头中的Server信息编辑 server.XML 文件2. 修China编程改错误

如何在一台服务器上使用docker运行kafka集群

《如何在一台服务器上使用docker运行kafka集群》文章详细介绍了如何在一台服务器上使用Docker运行Kafka集群,包括拉取镜像、创建网络、启动Kafka容器、检查运行状态、编写启动和关闭脚本... 目录1.拉取镜像2.创建集群之间通信的网络3.将zookeeper加入到网络中4.启动kafka集群

SpringBoot使用Apache POI库读取Excel文件的操作详解

《SpringBoot使用ApachePOI库读取Excel文件的操作详解》在日常开发中,我们经常需要处理Excel文件中的数据,无论是从数据库导入数据、处理数据报表,还是批量生成数据,都可能会遇到... 目录项目背景依赖导入读取Excel模板的实现代码实现代码解析ExcelDemoInfoDTO 数据传输

IDEA中的Kafka管理神器详解

《IDEA中的Kafka管理神器详解》这款基于IDEA插件实现的Kafka管理工具,能够在本地IDE环境中直接运行,简化了设置流程,为开发者提供了更加紧密集成、高效且直观的Kafka操作体验... 目录免安装:IDEA中的Kafka管理神器!简介安装必要的插件创建 Kafka 连接第一步:创建连接第二步:选

搭建Kafka+zookeeper集群调度

前言 硬件环境 172.18.0.5        kafkazk1        Kafka+zookeeper                Kafka Broker集群 172.18.0.6        kafkazk2        Kafka+zookeeper                Kafka Broker集群 172.18.0.7        kafkazk3

Apache Tiles 布局管理器

陈科肇 =========== 1.简介 一个免费的开源模板框架现代Java应用程序。  基于该复合图案它是建立以简化的用户界面的开发。 对于复杂的网站,它仍然最简单,最优雅的方式来一起工作的任何MVC技术。 Tiles允许作者定义页面片段可被组装成在运行一个完整的网页。  这些片段,或Tiles,可以用于为了降低公共页面元素的重复,简单地包括或嵌入在其它瓦片,制定了一系列可重复使用

Apache HttpClient使用详解

转载地址:http://eksliang.iteye.com/blog/2191017 Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们再讨论),它不仅是客户端发送Http请求变得容易,而且也方便了开发人员测试接口(基于Http协议的),即提高了开发的效率,也方便提高代码的健壮性。因此熟