写点什么

事件架构和事件流

  • 2017-09-10
  • 本文字数:1015 字

    阅读完需:约 3 分钟

将一个单体系统迁移到分布式系统或微服务系统,通常也是从源于同一数据库的单一数据源(SSOT,Single Source Of Truth)转变为源自多数据库的多个数据源。如果使用事件架构(Event Architecture)并将所有事件持久化为数据流,那么就我们可以转回到单一数据源上。这是 Ben Stopford 在他撰写的博客文章中提出的,此篇博客是他关于如何在 Kafka 中使用事件的系列博文之一。

Stopford 是 Confluent 公司的一名工程师他在博文中指出,传统的消息系统中,事件是短暂存在的,已消费的事件并没有历史信息。持久化所有的事件不仅会创建单一数据源,而且可以回溯和重放事件,使得对数据可执行似于版本管理系统中那样的操作。这使得恢复崩溃的系统以及在修复软件故障后重放事件成为可能。

对于一个典型的基于事件的系统,它会对事件进行监听,更新事件在数据库中的状态并做持久化,进而发出新的事件。在 Stopford 看来,这一架构具有两个挑战。首先,如何在同时写入数据和事件日志时维护一致性。其次,因为存在不同的代码路径等原因,在数据库中的和事件中的数据会出现一些偏差,这可能会导致系统中的不一致问题。解决问题的最好方法是类似于在事件溯源系统中那样,将事件作为头等实体并仅使用事件。

要着手实现事件流,一个途径是使用“变更数据捕获 ”(Change Data Capture)技术。采纳了这一技术的数据库正在不断增加。使用CDC,对数据库的写入将在后台转换为事件流。Stopford 在文章中提及,CDC 的一个优点就是提供了一致点。我们可以对数据库做读写操作,无需分布式事务就让事件流保持数据库和数据流的同步。

Stopford 提供了一个 CDC 的重要用例,就是实现旧架构的迁移。通过使用 CDC 连接到遗留系统的数据库,他们抽取出了事件流,并从使用遗留系统逐步迁移到使用事件流的系统。

在使用事件溯源和事件流中,一个非常有用的模式就是对事件的两次持有。其中一次在基于保留(Retention)的消息类(Topic)中。此类消息按时间顺序保留了每次更改,用于事件溯源视图中。另一次是在压缩消息类(Compacted Topic)中,该类消息类仅提供实体的最新视图,因此规模更小,速度更快。

文末 Stopford 做了总结,指出基于流的事件架构的最显著特性是可不断进化的能力。一旦有新的需求出现,系统就能构建出新的服务,进而轻易地进行部署,并通过从头开始重放所有的事件而维持更新状态。他相信,考虑到 Kafka 所能提供的功能,它非常适用于此类架构之中。

查看英文原文: Event Architectures and Event Streaming

2017-09-10 19:002778
用户头像

发布了 391 篇内容, 共 138.9 次阅读, 收获喜欢 256 次。

关注

评论

发布
暂无评论
发现更多内容

直播系统聊天技术(四):百度直播的海量用户实时消息系统架构演进实践

JackJiang

架构设计 即时通讯 IM 直播技术

实至名归!DataPipeline斩获“银行数字化科技创新大奖”

DataPipeline数见科技

Flink在唯品会的实践

Apache Flink

flink

移动开发iOS工程师秘籍(全套七层)

程序员 移动开发 ios开发

电脑护眼不权威指南,年纪轻轻眼睛就不行了?

彭宏豪95

效率 windows 4月日更 护眼

周转箱在仓配业务中的应用

Geek_vidmje

MySQL高可用架构:mysql+keepalived实现

AI乔治

Java MySQL 架构 高可用架构 keepalive

ElasticSearch

云淡风轻

elasticsearch

开源新老兵携手打开社区大门,带大学生走近开源

DT极客

聪明人的训练(二十七)

Changing Lin

4月日更

答对这八个Redis的问题,说明你精通了

AI乔治

Java redis 架构 分布式 高并发

智慧公安情指勤指挥调度平台搭建,指挥中心平台搭建

送给你一份程序员大佬整理的 HTTP 基础知识大图

Java架构师迁哥

你公司有没有企业文化?

石云升

团队建设 28天写作 职场经验 管理经验 4月日更

Golang 性能分析

escray

学习 极客时间 Go 语言 4月日更

爆肝1W+字,通俗易懂的讲解下Java注解

AI乔治

Java 架构 面试 注解

Spark地基之RDD

正向成长

spark RDD

什么是低代码开发?低代码11大核心功能介绍!

优秀

低代码

前端工程化-webpack

chun1123

大前端 webpack

MySQL主从不一致情形与解决方法

AI乔治

Java MySQL 架构 主从同步

Linux内核源码分析:基于最新的Linux 4.0内核(学习路线总结)

Linux服务器开发

后端 Linux内核 内核源码 内核4.0 底层原理

iOS 面试策略之语言工具-Objective-C

iOSer

ios objective-c 程序员

Javac 源码调试教程

学Java关注我

Java 编程 程序员 架构 计算机

B站视频下载:如何下载B站视频到电脑上

科技猫

B站 分享 哔哩哔哩 视频处理 b站视频下载

Github瞬间爆火!被各大厂要求直接下架的面试题库也太全了

Java 编程 程序员 架构 面试

深入浅出解读SpringMVC 进阶版

AI乔治

Java spring 架构 微服务 springmvc

网络协议学习笔记 Day6

穿过生命散发芬芳

网络协议 4月日更

为打造更好移动生态:日活超1.2亿的百度知道,摊牌了

ToB行业头条

百度 百度知道

Java-技术专题-同步可见性的查缺补漏

洛神灬殇

JVM happens-before CAS 可见性 有序性

分布式作业系统 Elastic-Job-Lite 源码分析——作业失效转移

比伯

Java 编程 架构 互联网 技术宅

道相同、谋相通、人相守:华为副总裁周跃峰分享如何与用户精英共创数字基建

脑极体

事件架构和事件流_语言 & 开发_Jan Stenberg_InfoQ精选文章