Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Architecture 事件驱动微服务体系结构中的数据_Architecture_Apache Kafka_Microservices_Datastore_Event Sourcing - Fatal编程技术网

Architecture 事件驱动微服务体系结构中的数据

Architecture 事件驱动微服务体系结构中的数据,architecture,apache-kafka,microservices,datastore,event-sourcing,Architecture,Apache Kafka,Microservices,Datastore,Event Sourcing,我正在尝试构建一个事件驱动的微服务体系结构,据我所知,建议在不使用数据库的情况下构建我的服务,而使用基于事件驱动的微服务体系结构的事件存储技术 我的问题是,如果我的服务很小并且彼此完全独立,包括每个服务没有专用的DB,那么我的事件存储是否应该作为一个单独的单元“服务”来保存其他服务事件 如果是,其中一个事件存储组件是消息总线(如ApacheKafka),为了使服务能够使用和发布事件,这是否意味着事件存储域是虚拟的?(因为包括卡夫卡在内的整个组件并没有打包成一个单独的单元) 我不建议构建一个必须在

我正在尝试构建一个事件驱动的微服务体系结构,据我所知,建议在不使用数据库的情况下构建我的服务,而使用基于事件驱动的微服务体系结构的事件存储技术

我的问题是,如果我的服务很小并且彼此完全独立,包括每个服务没有专用的DB,那么我的事件存储是否应该作为一个单独的单元“服务”来保存其他服务事件


如果是,其中一个事件存储组件是消息总线(如ApacheKafka),为了使服务能够使用和发布事件,这是否意味着事件存储域是虚拟的?(因为包括卡夫卡在内的整个组件并没有打包成一个单独的单元)

我不建议构建一个必须在没有任何永久存储的情况下保存数据的应用程序。即使可以永远存储事件队列,但对于随机数据访问来说也不是很好。假设您的应用程序需要访问存储在队列中间的一些用户信息。由于您没有事件ID,因此必须重新处理队列,以查找速度非常慢的信息

事件队列有助于解耦服务依赖关系,但它不是一个好的永久数据存储。通常,您希望使用依赖于服务的使用者处理队列,这些使用者将数据转换并移动到对服务有用的格式和存储中


另请参见

事件存储只不过是一个事件日志,可以完全重放该日志以重新生成服务的原始状态。如果在Kafka中使用压缩主题,可以最大限度地缩短恢复时间(压缩主题只会删除同一密钥的旧事件)。这对于运行时状态很好

有许多选项可用于促进查询。如果您不介意了解整个KStreams,最简单的方法是在KTable或State存储中实现可查询的视图。这是一个在您的服务内部构建的数据库(它在幕后使用RocksDB)。它充当备份日志中数据的磁盘备份缓存。这有一个有用的特性,即支持流可以由许多服务共享,但物化视图完全由每个服务拥有

更一般地说,一个好的方法是做最简单的事情,然后改进它。尝试保持服务无状态和事件驱动。如果您的需求需要有状态元素,请拉入ktable或states存储。如果您的数据需求增加,请考虑扩展到一个独立的数据库。如果您从kafka支持的存储开始,通常可以使用Connect api相对轻松地迁移数据(尽管您的逻辑可能会受到影响)

对于这种类型的实现,值得注意的一个技巧是避免在服务之间合成请求-响应通道。取而代之的是遵循事件驱动的体系结构,在这种体系结构中,您可以构建事件的共享叙述。马丁·福勒(Martin Fowler)很久以前就开始研究这个问题了。他称之为事件协作

“完全独立的”排除“没有每个服务的专用数据库”是您的问题:“我应该为每个微服务设置一个
事件存储
实例,还是一个全局
事件存储
,保存所有微服务的事件?”