【问题标题】:how do you aggregate data in a Udi-style SOA architecture?如何在 Udi 风格的 SOA 架构中聚合数据?
【发布时间】:2012-02-13 12:59:01
【问题描述】:

我们正在以 Udi Dahan 的方式实现 SOA 架构,这意味着服务是与业务一致的自治组件(我们的服务很少,每个服务都拥有域的一部分,并且不允许相互调用)。我们正在使用 nservicebus 发布/订阅。我试图找出处理“跨领域”数据问题的最佳方法。

让我举个例子:

我们有一个游戏服务,用户可以使用它来玩游戏。游戏有截止日期,我们希望在截止日期结束时通过向用户发送邮件来发出警告。该邮件将包含来自多个服务的数据。现在,由于服务不能调用其他服务,我看到了几种不同的方法:

1) 在游戏服务中处理

从其他服务发布足够的消息,以便游戏服务可以存储它自己需要的数据版本,因此在编写邮件时不需要依赖来自其他服务的数据。

缺点:

-需要发布更多消息 - 数据的非规范化 - 挑剔的数据所有权(一个事实在多个地方) - 向邮件中添加新数据很麻烦(更多消息,将内容存储在游戏服务中)

2) 创建聚合服务。

创建一个聚合服务,该服务将监听服务事件,存储创建邮件所需的所有内容,并在游戏服务通知截止日期即将结束时启动它。

缺点:

-与 1) 几乎相同,但数据所有权更加明确

3) 创建客户端

创建一个“客户端”(该客户端没有 gui,而是由 nservicebus 托管,与服务几乎相同,但也有很大不同)。客户端将订阅总线事件,就像 2) 它会在截止日期关闭时收到游戏服务的通知。客户端将通过查询收集所需信息所需的服务来撰写邮件。

缺点:

-一个客户端服务(模糊架构) - 撰写邮件所需的一切都必须是可查询的(公开的)

您是如何在出色的 pub/sub Udi 风格 SOA 架构中做到这一点的? :-)

【问题讨论】:

    标签: architecture soa nservicebus


    【解决方案1】:

    如果您可以编写 HTML 电子邮件,那么让您的电子邮件组件获取执行常规组合形式的 URL 的 HTML 输出。如果您不能使用 HTML,那么您将需要 IT/Ops 服务来收集信息(但这是通过与安装在同一端点上的各种业务服务的组件的进程内通信来完成的)。

    【讨论】:

      【解决方案2】:

      嗯,据我了解,Udi Dahan(尤其是在他最近的著作中)选项 3 最接近。每一点信息都保留在所有者手中,而客户只是一个聚合器。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-01
        • 2014-02-19
        • 1970-01-01
        • 2010-12-12
        • 2020-03-24
        • 2014-09-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多