当前位置: 首页 > news >正文

从微服务迁移到工作流的经验之谈

Jet公司的订单管理系统(OMS)负责处理很多业务功能,最初是由一系列微服务组成的。随着公司的发展,这种架构所面临的挑战也越来越大,直到他们决定构建一个新的基于工作流的平台。Jet工程师James Novino在一篇博文中介绍了旧系统面临的挑战、对新平台的概述以及新平台运行一年多后所总结的经验。

OMS最初使用了发布与订阅、事件溯源和其他技术的组合。每个服务都使用相同的样板实现,包含了三个步骤:

  • 解码——从输入流中读取领域事件,并将事件转换为输入类型。

  • 处理——检查输入并获取任何所需的数据。

  • 解释——执行副作用。

随着公司的发展和需求的增长,架构的复杂性也在增加,使得维护系统变得更加困难。服务的数量也增加了,并且由于功能通常分布在多个服务中,因此导致开发周期变得更长。Novino认为这是一个很复杂的过程,需要大量的样板代码。他还指出,随着系统的发展,构建和维护这种架构的复杂性对系统和团队都带来了负面影响。

因此,他们开始创建一个能够以更有效的方式处理所有业务工作流的新平台。他们决定设计和构建一个基于工作流的系统,其灵感来自Pat Helland和他的论文:Life Beyond Distributed Transactions。新系统的核心设计基于两个保证:

  • 幂等性——避免重复事件。

  • 一致性——支持多个不同的存储,但由于它们必须能够读取自己的写入,因此存储需要实现强一致性模型。

这些保证为系统带来了多个特性,包括:

  • 事件溯源——所有状态变更都存储在日记中。

  • 简单的实现,由工作流定义和相应的步骤组成。这样有助于开发人员优先考虑业务流程并强制执行系统的模块化。

  • 工作流的幂等性保证。

  • 工作流版本控制,可以将变更部署到工作流中,而无需担心当前正在执行的东西。

  • 伸缩性——通过使用每个服务的多个实例,可以并行执行工作流。

Novino将新架构描述为其早期管道(解码-\u0026gt;处理-\u0026gt;解释)的抽象版本,并在每个操作之间具有明确的服务边界:

  • 工作流触发器,对应于解码;

  • 工作流执行器,用于处理;

  • 副作用执行器,相应的解释。

为了定义工作流,他们创建了一个领域特定语言(DSL),用于定义所需的一系列执行步骤。他们还提供一个可视化工具,可以显示正在运行和已经运行过的工作流。

Novino指出,有一些现成的工作流编排和设计替代方案,但他们决定构建自己的方案,原因如下:

  • 能够为工作流事件维护单独的数据存储;

  • 能够在执行过程的任何时刻重放或可视化状态;

  • 可扩展性和伸缩性。

在生产环境中运行了一年多后,它们创建了大约2200万个日志,完成了大约9300万个工作流。

最后,Novino指出,从基于分布式微服务的架构迁移到基于工作流的架构,在设计、开发和支持过程中对其开销产生了巨大影响。他还指出,使用DSL设计工作流并将其作为单个响应步骤实现的能力提高了他们构建复杂新系统的能力。在未来的文章中,他将更详细地介绍他们的新设计。

查看英文原文:https://www.infoq.com/news/2019/02/migrate-microservices-workflows

相关文章:

  • ElasticSearch之Windows下安装
  • springboot学习之授权Spring Security
  • RSA
  • bzoj 3622 已经没有什么好害怕的了——二项式反演
  • Kendo DropDownListFor值传不回去的小坑
  • Java消息队列三道面试题详解!
  • 高性能两级缓存J2Cache
  • Webpack 4 学习01(基础配置)
  • 我的zsh配置, 2019最新方案
  • Java基础篇
  • 数据库基础SQL知识面试题二
  • 取代Python多进程!伯克利开源分布式框架Ray
  • mysql常用命令汇总
  • 前端知识点整理(待续)
  • Angular 响应式表单 基础例子
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • ES2017异步函数现已正式可用
  • es6
  • HTTP--网络协议分层,http历史(二)
  • JavaScript创建对象的四种方式
  • Js基础知识(四) - js运行原理与机制
  • Laravel5.4 Queues队列学习
  • MySQL QA
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • python_bomb----数据类型总结
  • tab.js分享及浏览器兼容性问题汇总
  • zookeeper系列(七)实战分布式命名服务
  • 闭包,sync使用细节
  • 程序员该如何有效的找工作?
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 设计模式 开闭原则
  • 使用 @font-face
  • Hibernate主键生成策略及选择
  • linux 淘宝开源监控工具tsar
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • ###C语言程序设计-----C语言学习(6)#
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #define 用法
  • #Java第九次作业--输入输出流和文件操作
  • (1)(1.13) SiK无线电高级配置(六)
  • (12)Hive调优——count distinct去重优化
  • (2.2w字)前端单元测试之Jest详解篇
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (NSDate) 时间 (time )比较
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (区间dp) (经典例题) 石子合并
  • (三)elasticsearch 源码之启动流程分析
  • (一)UDP基本编程步骤
  • ***检测工具之RKHunter AIDE
  • .net core 控制台应用程序读取配置文件app.config
  • .Net IE10 _doPostBack 未定义