【AICon】探索八个行业创新案例,教你在教育、金融、医疗、法律等领域实践大模型技术! >>> 了解详情
写点什么

如何选取事件架构

  • 2017-08-29
  • 本文字数:1109 字

    阅读完需:约 4 分钟

如果你要设计一个分布式系统,它可能是基于微服务的,并且你在考虑采用事件架构(Event Architecture),那么目前存在多种的模型和技术可供使用。 David Dawson 近期在的博客帖子中介绍了 [多种风格类型的事件架构,并指出,非功能性需求是影响架构实现选择的一个主要因素。

Dawson 是一位自由职业的系统架构师,他将事件架构简单地定义为一种基于事件的软件架构。鉴于事件也是数据模型的一部分,因此事件架构也是一种数据架构。他强调指出,事件架构并非定义服务交互方式的一系列技术或特定模型。

分阶段事件驱动架构(SEDA,Staged Event-Driven Architecture)是一种简单并很好确立的模型。SEDA 本质上是一个工作流过程,其中各个组件根据自身的处理情况发出事件去驱动整个过程,而事件通常使用某种消息总线进行传输。Dawson 指出,SEDA 模型的一个重要问题是事件的生存期很短,因而在会在传输或组件离线过程中丢失。因此与其让系统采纳最终一致性,不如实现一种Dawson 所称的“期许一致性”(Hopeful Consistency)。只要所有组件工作正常,系统就是一致的。一旦有组件崩溃,那么最终将会得到不一致的系统,这时必须做手工恢复去回到一致性状态。Dawson 称其为“面向实体的微服务”,并强烈建议不要采纳这种架构。

为重建一致性状态,Dawson 给出的最优解决方案是将事件看作是一种数据,并持久化事件流。这样我们就可以在任一时刻重放(Replay)流以恢复状态,并且借助此得到真正的最终一致性系统。从中我们还可以得到其它一些优点,例如可以对同一事件流给出多个视图。

从Dawson 的经验来看,尽管通常称持久化事件流为“事件溯源”,但是他坚信这并非正确的,因为它不是去重建一个实体的状态,而是对不受限实体集创建视图。鉴于此,他更愿意称其为“类型流处理”(Style Stream Processing)。他认为 Kafka 正是使用了这样的架构。Kafka 客户按流的顺序依次读取事件,但在重放事件时可以从头开始,或是从所需的特定事件处开始。

用 DDD 的术语解释,聚合(aggregate)是处于一致性范畴内的一系列实体。通过对一个聚合的所有更改发出和持久化事件,并通过重放而获取的同一事件而构建同一聚合的状态,我们可以得到经事件溯源的聚合根,Dawson 称其为“真实事件溯源”。Daswon 指出,具有独立单一事件流在重建聚合过程中是非常重要的。对于创建视图等其它一些需求,必须要创建独立的流。

为辅助构建基于事件架构模型的系统,Dawson 创建了 Muon Stack 项目。它是一系列面向消息和事件的软件库和服务,用于构建分布式系统。其中包括了一个事件流 API 客户端,以及一个名为“ Photon ”的事件存储。目前他正致力于构建 Muon Stack 对 Kafka 的接口。

查看英文原文: Selecting an Event Architecture

2017-08-29 19:002806
用户头像

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

关注

评论

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

与8090创业者、投资人共话“初心”!2021中国新青年创业投资峰会举办

创业邦

Java学到什么程度才能叫精通?

Java架构师迁哥

空手撸SOLID架构设计原则,六大原则层层解析,你绝想不到

Java MySQL 程序员

WasmEdge (曾用名 SSVM) 成为 CNCF 沙箱项目

WasmEdge

云计算 云原生 webassembly cncf

真的了解 HDFS 的 SecondaryNameNode 是干什么的?

云祁

我用来阻止你摸鱼看直播、知乎和微博的Chrome插件

OBKoro1

chrome 效率工具 大前端 工作效率 chrome扩展

与其摸鱼,不如来看:高性能消息中间件NSQ解析的整体介绍

这是一场按下播放键就停不下来的冒险

白洞计划

在线URL转sitemap工具

入门小站

Linux

Kubernetes手记(21)- 新一代监控架构

雪雷

k8s 6月日更

Visual Studio 2010下ASPX页面的TreeView控件循环遍历

DisonTangor

C#

.NET Core HttpClient源码探究

yi念之间

.net core HttpClient

5分钟速读之Rust权威指南(二十九)循环引用

wzx

rust

深入了解JAVA线程篇

邱学喆

线程 线程池 线程间通信 线程回调

自动驾驶产业进入“两条腿”时代:车路协同的中国式飞跃

脑极体

这是一场按下播放键就停不下来的冒险

脑极体

JavaScript 学习(八)

空城机

JavaScript 大前端 6月日更

蜜雪冰城主题曲血洗B站:企业自媒体运营如何接地气

石头IT视角

看完阿里开源笔记,我终于敢说精通“网络协议”了

Java架构师迁哥

ES6 中的 Symbol 是什么?

编程三昧

JavaScript 大前端 ES6 数据类型 symbol

基于朴素ML思想的协同过滤算法(十七)

数据与智能

推荐算法

fish_redux使用详解---看完就会用!

小呆呆666

flutter ios android 大前端 社区

阿里云中间件首席架构师李小平:企业为什么需要云原生?

阿里巴巴云原生

Github上星标85k的,图解操作系统、网络、计算机 PDF,竟是阿里的?

Java架构师迁哥

我看JAVA 之 JVM

awen

Java JVM

数据仓库常见建模方法与大数据领域建模实例综述

云祁

数据仓库 数据建模 维度建模

大白话彻底搞懂 HBase Rowkey 设计和实现方式

云祁

大数据 HBase

ECMAScript 2021 (ES12)通过,正式写入 ECMAScript 标准

清秋

ecmascript 新闻资讯 ES2021 ES12 标准

七牛云 霍锴:SDK 是一款技术服务的门面,如何方便用户高效接入是前提|Meetup 讲师专访

七牛云

音视频 sdk Meetup

你遇到过哪些质量很高的 Java 面试题?

Java架构师迁哥

Linux之cp命令

入门小站

Linux

如何选取事件架构_语言 & 开发_Jan Stenberg_InfoQ精选文章