QCon北京「鸿蒙专场」火热来袭!即刻报名,与创新同行~ 了解详情
写点什么

基于事件系统中的过程管理器

  • 2017-08-01
  • 本文字数:1301 字

    阅读完需:约 4 分钟

以发布事件的方式去通知领域内的更改,可实现不同领域彼此分离。但是如果逻辑事件流的确存在,事情就变得不明显了,并难以领会了。更好的解决方案是使用过程管理器(Process Manager)对全过程进行追踪。这是 Bernd Rücker 在今年的 DDD eXchange 大会演讲中提出的,演讲的内容涉及长期运行过程和领域驱动设计(DDD,Domain-Driven Design)。

Rücker 在长期运行过程上具有十多年的工作经验,他也是 Camunda 的联合创始人。在他看来,网购的过程从用户的角度看是十分简单的,就是下单、支付和快递。从 DDD 角度看,实现网购可能需要四种业务能力及相应的受限上下文,包括商店、支付、盘存和快递。这些上下文进而生成了匹配网购过程的领域事件,即下订单、收到付款、货物分拣和商品快递。

为完成下订单过程,上下文需要协作并响应所提交事件。当一个下单事件提交后,订阅此事件的支付上下文将在会在完成支付事件提交前,收到订单的支付款。一个问题是,支付上下文需要知道订单的支付时间,以及所以可触发支付的事件。实际上,这就意味着一旦新客户需要支付,必须要访问支付上下文。

Rücker 指出,虽然事件流导致了低耦合,但是其中并没有过程这一概念。这是事件流的一个问题,导致整个逻辑流非常难以看到,就此问题他提及了 Martin Fowler 的一篇文章。另一个问题是,导致事件流发生更改的新业务需求(例如 VIP 客户可以要求带发票的订单),可能需要更改多个上下文。

Rücker 提出了一种更好的解决方案,即使用过程管理器在一个地点上跟踪整个过程。其中过程管理器的主要职责是:

  • 事件到命令的转化。下单事件是已经发生的事件,隐含了我们的确希望发生的一些事情、一个命令等。在本例中,这可以是读取支付命令。
  • 以领域逻辑一等公民实现事件流。事件流的整体以及每个独立步骤中的逻辑,是所涉及的上下文中的领域逻辑的组成部分。
  • 为长期运行流处理状态。

在 Bücker 看来,状态处理是实现中最具挑战的事情。其实现方法包括:

  • Actor 模型,其中 actor 持有本地状态,模型可使用 Akka 等。一个 actor 用于实现过程管理器,对整体流负责。这一方法在 Vaughn Vernon 所著的《 Reactive Messaging Patterns with the Actor Model 》一书中也做了介绍。
  • 在实体中保持过程流的状态。就 Rücker 的经验而言,这是一种十分常见的实现方法。
  • 程单模式(Routing Slip)。其中所需的所有步骤一并通过消息发生,避免了集中存储过程状态的需要。
  • 定义了各个步骤的状态机。Rücker 指出,对过程状态的可见性是使用状态机一个优点。

在与实现长期运行过程的客户的工作经验中,Rücker 接触到了一些常犯的错误,其中包括使用无工作流或是自研发的引擎,以及使用无代码套件。为此,他推荐使用一些可嵌入到用户代码中的开源轻量级框架库,Camunda 是其中之一。他还建议仅去实现那些通用的用例,剔除一些十分异常的用例。这可能会关照到99% 的用例,剩余的留给人工干预。这一做法也得到了 Greg Young 的推荐。

Rücker 在 GitHub 上发布了一个例子。该例子使用在演讲中给出的方法实现了一个基本的订单系统。

明年的DDD eXchange 大会计划于2018 年4 月26 日至27 日期间在伦敦召开。

查看英文原文: Process Managers in Event-Based Systems

2017-08-01 19:001761
用户头像

发布了 227 篇内容, 共 77.8 次阅读, 收获喜欢 28 次。

关注

评论

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

初探Deno.js

★忆先★

deno

用 Go struct 不能犯的一个低级错误!

煎鱼

Go 语言

优秀的 Scrum Master 应当是仆人式的领导

万事ONES

Scrum 敏捷开发 ScrumMaster ONES

使用 Python 对数据进行压缩

★忆先★

Python3.10中的结构化模式匹配语法

★忆先★

Python

校友会小程序开发笔记五:找校友功能模块设计与实现

CC同学

校友录小程序

Java 连接操作 MySQL 数据库(增删查改操作)

若尘

MySQL 数据库 java编程 驱动 6月日更

重塑价值:新一代ITSM平台的建设、咨询与实施

云智慧AIOps社区

ITSM 智能运维

专访关涛:阿里EB级大数据体系,背后的计算平台竟是这样(采访提纲)

花花

试用期 签约计划

HarmonyOS Connect伙伴峰会于厦门举办 硬件生态快速发展

科技汇

Keepalived+Nginx 搭建高可用集群

逸少

nginx 高可用 keepalive

算法导论的道与术、工程师思维奠定能走多远-John 易筋 ARTS 打卡 Week 51

John(易筋)

ARTS 打卡计划

JAVA笔记(四)--三大结构语句

加百利

Java 后端 6月日更 结构语句

为什么服务实例在隔离之后还在继续处理请求?

BUG侦探

TCP 半关闭连接 接收缓存

一文介绍备机重建各种方法的实现机制

华为云开发者联盟

主机 集群 GaussDB(DWS) 备机重建 备机

150亿美元,CANVA可画市场价值为何堪比金蝶、用友?

ToB行业头条

SaaS 可画 品牌视觉管理

项目进度管理 | 如何为项目制定里程碑?

万事ONES

项目管理 研发管理 研发管理工具 ONES

网络研讨会|想弄明白应用安全?我们为你准备了5个锦囊!

鉴释

DevSecOps 安全编码规范 应用安全 静态分析

全面赋能泛娱乐社交场景

anyRTC开发者

音视频 WebRTC 泛娱乐社交

向996宣战!快乐工作,健康生活的互联网要来了吗?

架构精进之路

话题讨论 话题 996 6月日更

商用RTC vs 基于开源WebRTC自研 开发者该如何选择?

融云 RongCloud

Python——字典的遍历

在即

6月日更

一文讲全了Python类和对象内容

华为云开发者联盟

Python

Android客户端网络预连接优化机制探究

vivo互联网技术

android TCP HTTP

智慧水务|大坝水利可视化管理,综合态势一屏掌握

一只数据鲸鱼

数据可视化 智慧水务 三维可视化 水利 水力发电

使用poetry进行Python项目开发

★忆先★

Python

线上程序cpu占用过高、程序死锁,该如何定位问题?

李尚智

保姆级教学,22张图揭开ThreadLocal

程序猿阿星

内存泄露 ThreadLocal 线程安全 弱引用 ThreadLocalMap

朋友乔迁住新房 禧大福酒竟成为宴席最大赢家

Geek_50a546

【融云技术】Native C/C++ 服务适配多指令集 CPU 漫谈

融云 RongCloud

警惕商标到付快递的骗局

石云升

商标 诈骗 6月日更

基于事件系统中的过程管理器_语言 & 开发_Jan Stenberg_InfoQ精选文章