NorthOne如何结合无服务器与DDD实现数字银行服务API?


NorthOne是为小型企业提供银行服务的公司,他们是如何结合serverless和领域驱动设计以及EDA实现银行工作流程的?
NorthOne为小型企业提供银行服务。实际上,NorthOne是一个存款账户,具有许多集成功能,几乎就像是小型企业的操作系统。基本上,NorthOne会选择最好的合作伙伴来做一些事情,例如支票存款、您将要进行的常规交易以及任何要求,并且用例将会增长。NorthOne是为小企业量身定制的银行体验。
NorthOne很早就开始了完全事件驱动的愿景,从大型单体整体Python Django 开始,我们一直在试验无服务器,它在业务方面和技术方面完全有意义。真是太棒了。
 
工作流
NorthOne是一家用户体验公司,希望确保为小型企业提供尽可能最好的银行体验。NorthOne不想在运维上花费大量时间,并且一直尝试这样做,而且可靠性非常重要。
银行业是一种工作流程:申请流程就是您输入所有个人信息,向您的银行发送请求,然后现在需要完成整个流程发生。各种检查并确保人们不在任何欺诈名单或洗钱名单上,甚至只是从我们的合规部门获得第二次审核。
工作流程非常适合使用亚马逊的step函数、暂停函数并能够稍后返回响应,这样您就可以为合规团队和其他团队构建其他内部应用程序。
  
Saga模式与无服务器 
在事件世界中,当你谈论像分布式事务时,那里发生了很多事情,现在一个常见的模式是Saga模式。你可能不想做2PC两阶段提交和所有其他的事情,但是当我们研究Saga时,需要选择编排或编舞。编舞会变得非常混乱,因为有很多简单的行为。假设我是一个服务,我需要知道当事件发生时我需要做些什么,我需要知道我转储哪些补偿事件,以及所有其他的东西。
使用 step 函数就是进行编排的无服务器方式,我们有一个流程,需要将大量帐户或大量用户数据移动到不同的系统,因此使用了编排中的协调器,让其密切关注正在发生的一切,可能会暂停迁移,当开发人员完成他们的工作时,你按下一个按钮,一切又重新开始启动了。
最酷的事情之一就是重试能力:当人工操作失败时,或者当这些工作流步骤之一发生失败时,您可以确切地看到哪个步骤,您可以看到日志。
Stripe 在他们平台的某些部分做了很多类似NorthOne做的事情,你输入个人信息,你得到一个token,你在任何地方使用该token。NorthOne进行标记化,并限制通过调器中的步骤流动的细节数量。我们标识流程中的事件并存储它们,并且我们将在步骤之间读取回事件存储,以执行我们需要执行的操作。这可能失去了一些调试能力,您无法准确看到流程的信息,但我们需要保证用户数据的安全。
 
DDD事件风暴与事件溯源
事件风暴在领域驱动设计社区很流行,我们整个业务用便签贴在墙上,最好让每个业务利益相关者都聚集在一起,但幸运的是,我们的产品团队有两个人作为代表。我们在房间里有产品方面人员来解决这个问题。
把我们的整个业务放在墙上,这需要几天时间,然后在它周围画圈并反复迭代一段时间。然后开始研究该技术的外观。我们的领域边界是什么,我们需要制作什么原型?在那里的几个星期里,我们只是在做原型。
我们如何用余额、最少的交易和一些新的模式开设一个账户。我们真的接受了一些领域驱动的设计思维,以及事件驱动的思维。
现在我们的整个系统通常最终会变得一致,如果您现在将所有架构划分到域中,并解耦所有内容。我们创建了一些早期原型,我们创建了我们自己的事件存储版本,也就是说,我只想说一个围绕 DynamoDB 的自以为是的方案,我们在其中跟踪修订、有效负载、时间戳,以及您希望能够做到的所有事情做事件溯源。
对于我们的许多用例来说,事件溯源似乎是状态的正确方法。银行业,如果您只考虑银行分类帐,它就是事件或会计分类帐。
我们的事件存储模式基本上变成了一个 DynamoDB,其中包含围绕模式的意见,以及一个带有简单分派功能的共享代码包。一个真正着眼于强制执行乐观并发的调度函数,然后我们还内置了一些 reducer 函数。
一旦我们创建了这些域边界,我们就需要弄清楚我们如何在域之间和域内进行通信。我们着眼于真正区分里程碑事件和领域事件。我想其他术语中的里程碑事件可能被称为集成事件,但这种想法认为这些是关键的业务里程碑。一个账户被打开,一个申请被批准或拒绝,每个域可能需要知道的事情。
我们需要考虑如何传达所有这些信息?我们如何沟通?我们登陆 EventBridge 加入我们的里程碑事件。我们有一辆与我们所有人交谈的事件Bus。我们的每个服务现在订阅该 EventBridge,并维护自己的事件存储,这需要 DynamoDB 的支持。
我们做了很多重播,这是 EventBridge 最酷的事情之一。简直太容易了。您只需设置一个存档,它就会记录所有通过的内容,然后您只需按下控制台中的一个按钮,它就会重播所有内容。
我们的每项服务都有自己的数据存储。它通常是一个事件流或一个投影数据库,旧平台是使用 Postgres,而且我们确实有关系数据。很有意思。现在开始我真的很害怕,我们要怎么维持关系这些事情?现在都使用DynamoDB。
详细点击标题