DDD 和 SOA 应用程序
DDD and SOA application
我负责一个大型 SOA 应用程序。客户端是 ASP.NET WebForms,业务是带有 WCF 的 .NET。
我们的业务代码真的很糟糕(BBOM),看了一些之后,我陷入了DDD。我真的很想用 DDD 概念重写我们业务的某些部分。
使用 SOA,我进入了一个无状态的世界。因此,如果网页为用户提供了操作订单的能力,例如,添加订单详细信息、删除订单详细信息……每个业务方法都必须在应用业务规则和持久更改之前重新加载数据以补充我的聚合。
当涉及的数据很少时,这不是问题。但是当聚合很大并且需要几秒钟来加载数据和水合时会发生什么?
是否可以以全状态方式使用 SOA 架构?
几乎所有服务器型号都有这个问题。您需要有一种机制来启动 'session' 并为客户端提供某种令牌(即会话句柄),然后他们将在每个后续请求中使用该令牌。
在您的服务器实现中,您将会话状态保存在某些 table 或字典中,检索会话并根据会话数据处理请求 - 只要会话保持活动状态可能。
如果一段时间内没有 activity 会话,您要么
- 彻底终止会话,或者
- 在一些数据库中保存会话状态,然后终止会话。
当用户完成后,他们 'log out' - 也终止会话。
因此,单个 SOA 请求确实是无状态的,但它们(通过会话句柄)引用有状态对象。
根据SOA无状态one definition,
The Service Statelessness principle provides guidelines in favor of
making the service stateless by shifting away the state management
overhead from the services to some other external architectural
component
因此,状态从服务延迟到其他东西,但显然,它并没有完全消失。
关于延迟状态的所有选项都是开放的。您提到了将其存储在数据库中的潜在性能问题,但您是否首先经历过这些问题?它是 DDD 应用程序中最常见的域状态存储形式,作为一般的良好实践,聚合应该很小。
其他选项包括在客户端、Web 框架提供的会话机制、cookie 等中存储状态。确保您了解每个选项的来龙去脉,以便做出明智的选择。
Is it possible to use SOA architecture in a statefull manner?
我想是的,就像@Uebercoder 说的。但这并不意味着你不能使用DDD。
大家都知道步骤:
- 加载聚合
- 更新它(在内存中)
- 再坚持一下
永远不会比:
- 只需更新(即)数据库中的该列
但是使用第二个选项我们失去了 DDD 的主要好处之一:在代码中公开业务。如果你所有的动作都只是一个 "update that property and save",也许这个项目终究不会从 DDD 中受益。
根据我的经验,在大多数情况下,在 SOA 架构中使用 DDD 是值得的。正如@guillaume31 所说,您只需要注意聚合根的大小和边界。
随便挑选一个你的短语:
"large SOA application"
我不太清楚你的意思,但要注意:在 DDD 中实现的单体应用程序很快就会变得混乱。
我认为 (and Eric Evans too) DDD 在 微服务 架构中真正闪耀。
只是我的想法:)
我负责一个大型 SOA 应用程序。客户端是 ASP.NET WebForms,业务是带有 WCF 的 .NET。
我们的业务代码真的很糟糕(BBOM),看了一些之后,我陷入了DDD。我真的很想用 DDD 概念重写我们业务的某些部分。
使用 SOA,我进入了一个无状态的世界。因此,如果网页为用户提供了操作订单的能力,例如,添加订单详细信息、删除订单详细信息……每个业务方法都必须在应用业务规则和持久更改之前重新加载数据以补充我的聚合。
当涉及的数据很少时,这不是问题。但是当聚合很大并且需要几秒钟来加载数据和水合时会发生什么?
是否可以以全状态方式使用 SOA 架构?
几乎所有服务器型号都有这个问题。您需要有一种机制来启动 'session' 并为客户端提供某种令牌(即会话句柄),然后他们将在每个后续请求中使用该令牌。
在您的服务器实现中,您将会话状态保存在某些 table 或字典中,检索会话并根据会话数据处理请求 - 只要会话保持活动状态可能。
如果一段时间内没有 activity 会话,您要么
- 彻底终止会话,或者
- 在一些数据库中保存会话状态,然后终止会话。
当用户完成后,他们 'log out' - 也终止会话。
因此,单个 SOA 请求确实是无状态的,但它们(通过会话句柄)引用有状态对象。
根据SOA无状态one definition,
The Service Statelessness principle provides guidelines in favor of making the service stateless by shifting away the state management overhead from the services to some other external architectural component
因此,状态从服务延迟到其他东西,但显然,它并没有完全消失。
关于延迟状态的所有选项都是开放的。您提到了将其存储在数据库中的潜在性能问题,但您是否首先经历过这些问题?它是 DDD 应用程序中最常见的域状态存储形式,作为一般的良好实践,聚合应该很小。
其他选项包括在客户端、Web 框架提供的会话机制、cookie 等中存储状态。确保您了解每个选项的来龙去脉,以便做出明智的选择。
Is it possible to use SOA architecture in a statefull manner?
我想是的,就像@Uebercoder 说的。但这并不意味着你不能使用DDD。
大家都知道步骤:
- 加载聚合
- 更新它(在内存中)
- 再坚持一下
永远不会比:
- 只需更新(即)数据库中的该列
但是使用第二个选项我们失去了 DDD 的主要好处之一:在代码中公开业务。如果你所有的动作都只是一个 "update that property and save",也许这个项目终究不会从 DDD 中受益。
根据我的经验,在大多数情况下,在 SOA 架构中使用 DDD 是值得的。正如@guillaume31 所说,您只需要注意聚合根的大小和边界。
随便挑选一个你的短语:
"large SOA application"
我不太清楚你的意思,但要注意:在 DDD 中实现的单体应用程序很快就会变得混乱。
我认为 (and Eric Evans too) DDD 在 微服务 架构中真正闪耀。
只是我的想法:)