【发布时间】:2012-02-13 12:59:01
【问题描述】:
我们正在以 Udi Dahan 的方式实现 SOA 架构,这意味着服务是与业务一致的自治组件(我们的服务很少,每个服务都拥有域的一部分,并且不允许相互调用)。我们正在使用 nservicebus 发布/订阅。我试图找出处理“跨领域”数据问题的最佳方法。
让我举个例子:
我们有一个游戏服务,用户可以使用它来玩游戏。游戏有截止日期,我们希望在截止日期结束时通过向用户发送邮件来发出警告。该邮件将包含来自多个服务的数据。现在,由于服务不能调用其他服务,我看到了几种不同的方法:
1) 在游戏服务中处理
从其他服务发布足够的消息,以便游戏服务可以存储它自己需要的数据版本,因此在编写邮件时不需要依赖来自其他服务的数据。
缺点:
-需要发布更多消息 - 数据的非规范化 - 挑剔的数据所有权(一个事实在多个地方) - 向邮件中添加新数据很麻烦(更多消息,将内容存储在游戏服务中)
2) 创建聚合服务。
创建一个聚合服务,该服务将监听服务事件,存储创建邮件所需的所有内容,并在游戏服务通知截止日期即将结束时启动它。
缺点:
-与 1) 几乎相同,但数据所有权更加明确
3) 创建客户端
创建一个“客户端”(该客户端没有 gui,而是由 nservicebus 托管,与服务几乎相同,但也有很大不同)。客户端将订阅总线事件,就像 2) 它会在截止日期关闭时收到游戏服务的通知。客户端将通过查询收集所需信息所需的服务来撰写邮件。
缺点:
-一个客户端服务(模糊架构) - 撰写邮件所需的一切都必须是可查询的(公开的)
您是如何在出色的 pub/sub Udi 风格 SOA 架构中做到这一点的? :-)
【问题讨论】:
标签: architecture soa nservicebus