写点什么

业务流程、长周期服务和微服务

  • 2018-07-26
  • 本文字数:1752 字

    阅读完需:约 6 分钟

在近期于伦敦 Skills Matter 举行的 DDD eXchange 2018 会议上,Martin Schimak 认为在最近几年间,领域事件引发了越来越多的讨论,但是我们对命令也应如此,在这次会议上他讨论了微服务领域的事件、命令以及长周期的服务,以及流程管理器和类似的工具如何有助于运行核心的业务逻辑。

Schimak 是奥地利的一名独立咨询顾问,他认为,事件最好的一点在于,它们代表了已经发生过的事情。我们正在处理越来越多的分布式系统,通过来自服务本身的保证能够让我们更加相信最终一致性。事件还有助于我们解耦服务,并且能够回过头去看过去发生了什么。

事件的优势是事件驱动架构越来越流行的原因之一,有时候,设计只依赖事件就能实现集成服务。有时这种简化是合理的,但是 Schimak 指出,这也可能会带来一些危险。以简单订单处理为例,在处理过程中,只包含 _order placed_、payment received、_goods fetched_ 和 _goods shipped_ 事件,它们会被支付、存储和运输服务所使用。一个简单的变更,比如在跟客户收费之前就将货物提取出来,就会改变消息流,从而要求所有涉及到的服务都要进行变更,对于 Schimak 来说,服务之间的这种耦合是一个次优的方案。

因为事件仅仅是已发生的事实,它们本身并不会触发任何的操作。在监听事件的时候,我们需要一定形式的策略,该策略能够决定当特定的事件接收到的时候,应该发生些什么。在纯粹的基于事件的系统中,这种策略始终要位于事件消费服务之中。在基于命令的方式中,这个策略可以位于事件发布服务中,但是 Schimak 认为,有时候这两个服务都不是合适的选择。对他来讲,第三种方案是新增一个中介者(mediator),它监听特定的事件并决定后续的步骤。

以上面的订单服务为例,这个服务可能会监听相关的事件并发送命令,因此当客户下单时协调流程并完成该订单。在样例中发生这样的变化时,不仅订单服务需要变更。Schimak 指出,在这个过程中运行的逻辑通常是属于业务核心领域中的逻辑。

对 Schimak 而言,命令是一些意图,针对的是未来要发生的事情,他定义了命令执行的两种类型:

  • 原子性事务执行,一般的意图是变更一个模型;例如,下单命令会创建一个订单并发布下单事件;
  • 复合的、长周期执行,其意图是更加业务级别的结果,可能需要多个步骤才能实现。样例可以是相同的下单命令,但是这里的最终结果是完成订单或取消订单的事件。

在请求支付的场景中,我们应该努力实现有价值的业务结果。支付服务可能会发布 payment received 或 payment cancelled 事件。在 Schimak 的经验中,我们往往会采取相反的措施,暴露一些临时的问题,比如信用卡收费失败,并委托客户端来对其进行处理。这意味着我们要强迫客户端来处理策略方面的问题,而这些问题显然是支付相关的——可能稍后进行重试,有可能使用新的信用卡数据。如果客户端是订单服务的话,那么它不仅要处理订单,还要处理支付,这样就将支付领域的知识扩展到了支付服务之外。这同时也会增加订单服务的规模和复杂性。

将我们的问题委托给客户端并强迫它们处理各种问题,那么它们就变成了上帝服务。

相反,我们应该将支付视为长周期的服务,它要处理支付相关的所有内部问题,并且只发布最终结果相关的事件,即 payment received 或 payment cancelled。Schimak 强调,这并不是要创建一个中心化的协调器(coordinator)来处理 整个业务,它指的是更好的 API 设计,保护不同的限界上下文。

在使用长周期服务时,一个通用的工具是 Process Manager 。流程管理的常见需求是处理时间和超时、重试以及流程失败时的补偿。我们可以自己实现所有这些功能,但 Schimak 更喜欢使用 Axon 消息和 Saga 管理或 Lagom 这样的框架。他还建议使用某种形式的业务流程执行引擎,但他强调工具必须是轻量级的,并且可以在单个服务中使用。开源的过程引擎框架包括 Activiti Camunda Zeebee (也来自 Camunda)。在 serverless 领域, AWS 创建了 Step Functions ,其他云供应商也在朝着这个方向发展。

Schimak 个人在长周期服务和业务处理引擎方面的经验包括多年在Zalando 的订单处理流程中使用Camunda。他和联合来自Camunda 的 Bernd Rücker 在 InfoQ 上撰写了两篇文章:事件、流程和长期运行的服务:工作流自动化的现代解决方案洞悉流程!微服务与事件协同

查看英文原文: Business Processes, Long-Running Services and Microservices

2018-07-26 08:162717

评论

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

AR手势识别交互,让应用更加“得心应手”

HarmonyOS SDK

HMS Core

上海 Meetup | 一键获取 11 大云原生热门开源项目技术分享入场券

阿里巴巴云原生

阿里云 开源 容器 微服务 云原生

深入浅出DDD编程

百度Geek说

架构 后端 领域驱动设计

第一届云原生边缘计算学术研讨会KEAW'22成功举办

科技热闻

使用keytool生成Tomcat证书

源字节1号

前后端结合解决Excel海量公式计算的性能问题

葡萄城技术团队

前端 性能 Excel

MatrixOne从入门到实践02——源码编译

MatrixOrigin

MatrixOrigin MatrixOne

如何给 Fiori Elements 应用添加自定义按钮

汪子熙

前端开发 web开发 Fiori SAP UI5 11月月更

SREWorks 数智服务尝鲜,你的数据准备好了吗?

阿里云大数据AI技术

大数据 运维 数据 十一月月更

MASA Framework 事件总线 - 进程内事件总线

MASA技术团队

Framework MASA Framewrok MASA

先聊聊「堆栈」,再聊聊「逃逸分析」。Let’s Go!

王中阳Go

Go golang 逃逸分析 内存分配 11月月更

直播预约|Flink + StarRocks 实时数据分析新范式

StarRocks

数据库

阿里技术风险与效能部负责人张瓅玶:阿里集团深度用云实践

云布道师

云计算

工程团队如何合理地管理数据库访问

Bytebase

DevOps 运维 dba 数据库管理工具 删库保护

《算法》世界二

初学者

算法 网络 11月月更

OpenHarmony 3.2 Beta多媒体系列——音视频播放gstreamer

OpenHarmony开发者

OpenHarmony

MatrixOne从入门到实践01——初识MatrixOne

MatrixOrigin

MatrixOrigin MatrixOne

Java对象拷贝原理剖析及最佳实践

京东科技开发者

Java Apache 编程 对象拷贝 srping

看完这篇SpringBoot让我在阿里成功涨薪40%,感谢

钟奕礼

Java java程序员 java面试 java编程

创云融达基于 Curve 块存储的智慧税务场景实践

网易数帆

开源 分布式存储 Ceph curve

react源码分析:组件的创建和更新

flyzz177

React

react源码分析:深度理解React.Context

flyzz177

React

算法基础:单链表图解及模板总结

timerring

算法 11月月更 单链表

一个漏测Bug能让你想到多少?

得物技术

测试 测试框架 bug修复 漏洞检测 测试技术

「风控算法服务平台」高性能在线推理服务设计与实现

京东科技开发者

Python 数据 高性能 风控 风险控制

判断一个需求优先级的方法、步骤、工具

爱吃小舅的鱼

avm 开发 APP 怎么设置字体

YonBuilder低代码开发平台

《算法》世界一

初学者

算法 网络 11月月更

如何用科学的方法“撞大运”? | 学点运气

赵新龙

CTO 创新 与运气竞争

HarmonyOS 3重磅版本更新,Mate Xs 2等更多设备支持超级中转站!

Geek_2d6073

MatrixOne从入门到实践03——部署MatrixOne

MatrixOrigin

MatrixOrigin MatrixOne

业务流程、长周期服务和微服务_语言 & 开发_Jan Stenberg_InfoQ精选文章