HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

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

  • 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:162542

评论

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

react源码解析13.hooks源码

buchila11

React React Hooks

flutter如何从TextWidget复制文本【Flutter专题17】

坚果

flutter 28天写作 12月日更

23种设计模式第一种——单例模式

李子捌

28天写作 12月日更

【LeetCode】赎金信Java题解

Albert

算法 LeetCode 12月日更

『新华报』秒速飞艇开奖结果官网[手机乐乎]

天马行空

秒速飞艇开奖结果官网

大厂算法面试之leetcode精讲19.数组

全栈潇晨

算法 LeetCode

一次redis节点宕机引发的后续操作--部署哨兵集群

为自己带盐

redis redis哨兵模式 28天写作 签约计划第二季 12月日更

音视频学习--日常开发踩坑系列(1)

Fenngton

音视频 传输协议 签约计划第二季

纯css实现117个Loading效果(上)

德育处主任

CSS 大前端 纯CSS 特效

大厂算法面试之leetcode精讲20.字符串

全栈潇晨

算法 LeetCode

【Dart 专题】Map 集合小结~

阿策小和尚

28天写作 0 基础学习 Flutter Android 小菜鸟 12月日更

react源码解析14.手写hooks

buchila11

React React Hooks

音视频学习--SRTP优化

Fenngton

音视频 传输协议 签约计划第二季

架构训练营 -- 模块一

LJK

架构训练营

日志归一管理的一种解决方案

为自己带盐

redis elasticsearch 28天写作 签约计划第二季 12月日更

架构训练营 Week1 学习总结

红莲疾风

「架构实战营」

程序员写作模版献给懵逼的你

jerry

音视频学习--VLC优化

Fenngton

音视频 RTSP 签约计划第二季

「2021年11月复盘」买了个小太阳很暖和

宋天伦

复盘

聊聊 Kafka: Kafka 的基础架构

老周聊架构

签约计划第二季

DDD领域驱动设计落地实践系列:工程结构分层

慕枫技术笔记

后端 架构师 签约计划第二季

音视频学习--新codec适配和兼容

Fenngton

音视频 视频编解码 签约计划第二季

RocketMQ存储设计到底强在哪?

慕枫技术笔记

架构 后端 28天写作 12月日更

自动驾驶车辆控制 最终项目作业 实现分析 易筋 ARTS 打卡 Week 78

John(易筋)

ARTS 打卡计划

Java面向对象精讲【上】

XiaoLin_Java

面向对象 java基础 12月日更

JVM类加载机制

Ayue、

JVM 技术专题合集

『新华报』不建议强制上岸[手机乐乎]

天马行空

不建议强制上岸

看动画学算法之:二叉搜索树BST

程序那些事

数据结构 算法 程序那些事 12月日更

音视频学习--X264码率控制起航

Fenngton

音视频 视频编解码 签约计划第二季

JVM分代回收机制和垃圾回收算法

Ayue、

JVM 技术专题合集

纯css实现117个Loading效果(中)

德育处主任

CSS css3 大前端 纯CSS

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