2020 Google开发者大会重磅开幕 了解详情

通过示例理解事件流处理的概念和意义

2015 年 3 月 29 日

将数据组织为事件流这种思想在许多领域中都已得到应用,但不幸的是,人们有时会用不同的术语来表达这一思想,例如流处理(Stream Processing)、事件溯源(Event Sourcing)或复杂事件处理(Complex Event Processing - CEP)。 Martin Kleppmann 为读者解释了这一思想中的基本概念

Kleppmann 是即将出版的《设计数据密集型应用》(Designing Data-Intensive Applications)一书的作者,他表示这些基本的思想概念中有许多是十分简单的,并且值得深入学习。这些思想能够帮助我们设计出具有更高的伸缩性、可靠性和可维护性的应用程序。

Kleppmann 以 Google Analytics 这一工具作为使用事件的一个示例,这个工具能够按照访问者对网站的页面访问次数进行跟踪。在这个工具中,每一次页面访问都会产生一个事件,其中包含的内容有页面的 URL、时间戳,以及客户端 IP 地址等等,这对于用户量庞大的流行网站来说可能会造成数量巨大的事件产生。从这些事件中收集该网站的使用情况有两种选择,这两种选择都具有实用性,但各自适应于不同的场合:

  • 将所有的数据保存在某种类型的数据存储系统中,然后使用某种查询语言对 URL、时间段等信息进行分组,并在需要时进行数据的聚合。使用这种技术的一个优点在于,可以对旧的数据采用新的计算方式。
  • 在事件到来时,直接对 URL、时间等信息进行聚合,而不是在诸如 OLAP cube 等系统中保存事件本身,这种方式的一个优点在于能够进行实时决策,例如对某个特定客户端限制它的访问次数。

事件溯源也是一种类似的思想,它是由领域驱动设计(DDD)社区所提出的。这方面的一个常见例子就是电子商务网站中的购物车。这种思想是不对当前的购物车状态进行改变和保存,而是将每个改变了购物车状态的事件保存下来。这种事件可以是 _ItemAdded_ 和 _ItemQuantityChanged_。通过对事件进行重演、或是将它们进行聚合,可以重现购物车的当前状态。Kleppmann 表示,这一思想与 Google Analytics 的示例非常相似。

对于 Kleppmann 来说,事件是保存数据的一种理想的方式,所有的信息都作为一个单独的 blog,通过添加的方式进行保存,这就避免了对多个表进行更新的需求。他也认为,对于从数据存储系统中读取数据来说,对数据进行聚合是一种理想的方式,因为用户感兴趣的通常都是当前的状态。以用户界面举例,用户对某个按钮的单击行为对应着一个事件,而对页面的请求则表现为通过某个聚合展现当前的状态。Kleppmann 在他的示例中还衍生出一个模式:原始的输入事件是不可变的事实,它易于保存,并且具有真实性。聚合就是源自于这些原始事件的,并且在新的事件到来后会进行缓存和更新。在必要的时候,可以将所有事件进行重演,以重建所有的聚合。

转而使用类似于事件溯源一类的方式,就意味着要远离传统的由数据库保存当前状态的方式。Kleppmann 仍然坚持采用这种方式的原因包括以下方面:

  • 由于将写入与读取的 schema 进行分离,因此可以实现松耦合。
  • 分离的 schema 意味着可以对读取与写入操作进行独立的优化,这就能够提升性能,还可以避免规格化(与反规格化)方面的争论。
  • 在创建聚合时,如果要尝试新的算法,可以简单地放弃或取代旧的算法,这方面具有高度的灵活性。
  • 在对事件进行重演时如果发生异常,易于处理出错的场景,及发现它背后的原因。

各种 Actor 框架,例如 Akka Orleans Erlang OTP 等等都是构建在不可变事件流的基础上的,但 Kleppmann 指出,设计这些框架的主要目的是作为一种处理并行任务的机制,而不是用于数据管理的。

查看英文原文: Making Sense of Event Stream Processing

2015 年 3 月 29 日 08:26 2005
用户头像

发布了 428 篇内容, 共 147.0 次阅读, 收获喜欢 18 次。

关注

评论

发布
暂无评论
  • 不得不了解系列之限流

    现在说到高可用系统,都会说到高可用的保护手段:缓存、降级和限流,本博文就主要说说限流。限流是流量限速(Rate Limit)的简称,是指只允许指定的事件进入系统,超过的部分将被拒绝服务、排队或等待、降级等处理。

  • 测试数据的“银弹”- 统一测试数据平台(下)

    我和你分享了测试数据准备2.0时代的Builder Pattern实践,以及3.0时代的统一测试数据平台。

    2018 年 9 月 24 日

  • 领域事件:解耦微服务的关键

    这种事件发生后通常会导致进一步的业务操作,在DDD中这种事件被称为领域事件。

    2019 年 10 月 25 日

  • 分布式通信之发布订阅:送货上门

    今天,我以Kafka为例,与你详细讲述了发布订阅模式的基本原理和工作机制。

    2019 年 11 月 6 日

  • 跨平台与 Web 开发的建议

    今天我们要聊一聊 Web 带来的两个重要改变。一个是跨平台,一个是 Web 开发。

    2019 年 7 月 12 日

  • 使用 Axon 框架实现一个 CQRS 示例应用

    命令查询职责分离(CQRS)的思想是将对状态的查询部分与改变状态的部分进行分离。Axon框架是一个基于Java实现的CQRS框架,提供了对大多数重要构建块的实现,以帮助开发者在构建应用程序时使用CQRS架构模式。Dadepo Aderemi最近撰写了一系列博客文章,通过一个小型的CQRS演示应用讲解了CQRS的概念。

  • CQRS 和事件源框架 Axon 的基本概念和未来

    在最近的阿姆斯特丹事件驱动微服务大会上,Allard Buijze在演讲中介绍了Axon的基本概念、历史和未来。该框架面向以DDD、事件源和CQRS为基础的系统。Axon Framework的应用正在迅速增加,最近达到了100万的下载量。

  • Jonas Boner 谈 Events 将如何重塑现代系统

    Lightbend的创始人兼首席技术官Jonas Boner在最近的Reactive Summit 2017 会议上做了主题发言,谈到了事件驱动型服务(event driven services),以及事件驱动架构(EDA)和事件流处理(ESP)技术将会给基于分布式系统的现代应用程序的设计带来哪些帮助。

  • 事件流如何提高应用程序的扩展性、可靠性和可维护性

    关于事件流处理,在不同的场景中有不同的概念。有人称之为流处理,有人称之为事件溯源或CQRS,还有人称之为“复杂事件处理(Complex Event Processing)”。不管名称是什么,它们的基本原则都是一样的。Martin Kleppmann是Apache Samza的贡献者。在本文中,我们将跟随他的思路深入理解这些概念,以便帮助我们设计更好的系统。

  • 从事件和 DDD 入手来构建微服务

    领域驱动设计(Domain-Driven Design,DDD)是一项很伟大的技术,它拉近了设计与程序实际所服务的领域,但是通常我们会关注结构,从而太早地做出决策,这并非DDD的本意。相反,在领域中,我们应该从事件开始,Russ Miles描述了在构建微服务时,采用“事件优先”的方式所具有的优势。

  • 设计事件驱动的微服务

    事件驱动的微服务是一个未受到应有探讨的领域,在近日举行的µCon伦敦2017微服务大会上,Greg Young表达了这样的观点。同时,他还特别强调,不应该对所有的微服务都使用事件驱动模式。相反,他建议逐个服务进行考察,并将事件驱动模式运用到真正能从中受益的服务上。

  • 使用聚合、事件溯源和 CQRS 开发事务型微服务(第一部分)

    开发基于微服务的业务应用时所面对的一个挑战,就是事务、领域模型和查询对功能分解的抵制。本文作者给出了一种通过领域驱动设计(DDD)聚合对领域模型进行分解的方法。在该方法中,每个服务的业务逻辑构成一个领域模型,每个领域模型由一个或更多的DDD聚合组成。在每个服务中,一个事务建立或更新一个聚合,并使用事件去维持聚合间的一致性。

  • 事件应该成为开发者的一等工具

    这篇文章以Stitch Fix公司的一个工作流程为例,说明了如何使用事件来创建状态机。文章建议我们应该把事件看作是系统中的一等公民,因为它们帮助我们解耦系统,让我们能够独立处理各个部分。最后,文章用代码版本控制为例来帮助读者理解事件思想在实际工作中的应用。

  • 事件总线实现方式汇总

    基于事件驱动的分布式异步架构模式多用于构建高可伸缩的反应式应用程序,适用于各种从简单到复杂的应用场景。它的核心思想是去耦合,将消息的发送和接收分开,实现异步处理消息事件。架构师Mustafa Turan在Hackernoon上分享了事件总线的几种实现方式,并总结了每一种实现方式的优缺点。

  • 体验构建反应式事件驱动的 CQRS 应用

    CQRS和事件溯源为构建遵循反应式宣言的分布式应用提供了一个清晰且简明的方式,Duncan DeVore在近期的一次演讲中谈到了这一点,并分享了他在使用Akka和Scala构建分布式应用的一些体验。

  • 实战一(上):业务开发常用的基于贫血模型的 MVC 架构违背 OOP 吗?

    对于业务不复杂的系统开发,基于贫血模型的传统开发模式简单够用;如果是复杂的,那基于充血模型的DDD开发模式更有优势。

    2019 年 11 月 27 日

  • 将整个系统建立在事件溯源上是一种反模式

    在今年早些时候所举办的领域驱动设计欧洲大会上,Greg Young进行了一场演讲。他在演讲中表示,命令查询职责分离模式(CQRS)从来都不是我们所致力于实现的终极目标,它只是带领我们迈向事件溯源这一终点的阶梯。但他也表示,即使仅仅采纳了CQRS而未实现事件溯源,也同样是一种有价值的模式。

  • 如何理解事件溯源

    在近期举行的PHPDublin见面会上,来自DynamicRes的架构师Barry Sullivan被问到“什么是事件溯源”,作为对这个问题的回答,他在博客上写下了这篇文章,详细解释了什么是事件溯源以及事件溯源有哪些好处。

  • 让你的推荐系统反应更快:实时推荐

    实时推荐有三个层次,很多非工程师的朋友们常常脑海里想象的实时推荐实际上只是第二层次。

    2018 年 5 月 7 日

  • 事件驱动模式详解

    事件驱动模式定义了一种新的事件序列驱动型数据操作处理方法,其中每一事件都被记录在仅附加存储机制内。应用程序代码向事件存储发送一系列事件以强制描述指向数据的各项操作,并借此实现记录保留。

发现更多内容

一篇文章搞定 java 中的 path 和 classpath

shengjk1

java classpath java path classpath vs path classpath path

禁止在构造函数里调用虚函数

喵叔

C# .net 编码习惯

GitHub知错就改,是个好同志

遇见

GitHub

【SpringBoot】掌握这两个属性,你的测试类可以启动的更快些

遇见

Java Spring Boot Unit Test

Scrum vs Kanban,如何选择

TerryLee

Scrum Kanban 敏捷开发 Worktile 研发管理

聊聊:Java

字节先生

Java 编程 开发者 随笔杂谈 「Java 25周年」

简单到不可能失败 —— 《微习惯》

零和幺

读书笔记

如何解决 Kubernetes 的 DNS 延迟问题

倪朋飞

Kubernetes 微服务 云原生

Kubernetes中的CI/CD

倪朋飞

Kubernetes DevOps 微服务

破解 Java Agent 探针黑科技!

谭建

Java JVMTI Java Agent APM Profile

三点思考,判断一家公司是否值得加入

邓瑞恒Ryan

高效工作 个人成长 职业

探究vscode debug流程,解决无法运行go程序的问题

simpleapples

golang vscode

用你喜欢的 emoji 作为页面的 favicon 吧 🎉

遇见

CSS html favicon emoji

无代码开发

Fenng

Kubernetes 容器运行时演进

倪朋飞

Kubernetes 容器 云原生

你不必读完一本书

池建强

学习方法 读书

极客父母送给孩子的 ABC Book 就是这么 GEEK

魏彬(rockybean)

GEEK BOOK

Flink获取kafka中每条消息对应的topic

shengjk1

flink kafka flink 消费 kafka 获取 topic等信息

Arduino 蓝牙遥控+超声避障小车

黄耗子皮

树莓派 极客

关于Iterator和Iterable

shengjk1

Iterator和Iterable java iterator java iterable

像黑客一样思考

Fooying

黑客思维 黑客 安全攻防

我如何用 Python 给 Github 的 README.md 做一个访客统计功能

遇见

Python GitHub 开源 badge open-source

阿里面试,一面就倒在了Java内存模型上?赶紧来看看

七哥爱编程

面试 Java并发 内存模型

回“疫”录:开篇

小天同学

疫情 回忆录 现实纪录 纪实

我从来不在朋友圈晒投资人合影,却融了很多钱

邓瑞恒Ryan

高效工作 人脉 职业规划

Oauth2的认证实战-HA篇

Damon

Java 架构 Kubernetes 微服务架构 Spring Cloud

我的第一个千万阅读量

彭宏豪95

创作 生活 写作

程序员职业鉴赏

陆陆通通

程序员 加班 职业病 鄙视链

一文搞定 equals 和 hashCode

shengjk1

equals vs hashcode java equals java hashcode

死磕Java并发编程(1):探究Java并发机制的底层原理

七哥爱编程

Java Java并发 并发编程

2020,这个世界会好吗?

IT民工大叔

读书笔记

通过示例理解事件流处理的概念和意义-InfoQ