2

我正在设计一个系统,允许用户从一个系统获取数据并发送到其他系统。其中一个目标系统具有复杂的 SOA(Web 服务),另一个是接受平面文件作为输入的大型机。

我创建了一个具有 PublishEvent 表和 PublishEventType 表的数据库。还有一些特定于要发布的事件类型的规范化表。

我还有一个“接口”表,它是标准化数据表的扁平化版本。最终用户有一个将数据放入接口表的过程。我不确定确切的过程 - 我认为这是某种报告应用程序,他们可以将结果导出到 SQL 表。然后,我使用 SSIS 包将数据从接口表中取出,并将其放入规范化的数据结构中,并在 PublishEvent 表中创建新行。我使用平面表是因为当我第一次向他们展示关系表时,他们似乎很困惑。

我有一个 Windows 服务来监视 PublishEvent 表中的新行。Windows 服务通过插件进行扩展(使用 MEF 框架)。调用哪个插件取决于 PublishEvent 行中 PublishEventTypeID 字段的值。

PublishEventTypeID 1 调用从一组表中读取数据并调用 SOA Web 服务的插件。PublishEventTypeID 2 调用从一组不同的表中读取数据并创建要发送到大型机的平面文件的插件。

这似乎我正在实施“数据库作为 IPC”反模式。我应该更改我的设计以使用基于消息传递的系统吗?将数据放入平面表然后放入规范化表的过程是否多余?

编辑:这是在 .NET 3.5 中开发的

4

3 回答 3

1

MOM可能是更好的解决方案,但您还必须考虑以下几点:

  1. 作为客户架构的一部分,您是否已经有一个基于消息的系统?如果没有,也许引入它是一种矫枉过正。
  2. 您对基于消息的系统有任何经验吗?正如 Jason Plank 正确提到的那样,您必须考虑这些特定模式,例如必须确保消息的时间顺序、管理死信通道等(有关更多信息,请参阅本书)。
  3. 您提到了一个大型机系统,它的接口选项显然有限。谁来负责将“消息”(基于 DB 或 MOM)转换为大型机可以消化的东西的层?假设是您,通过访问数据库(也许您过去已经解决过这个问题)会更容易(对您来说)还是根据使用数据库或 MOM 的努力会有所不同?

总结一下:如果您通过 DB 路线更有信心,也许最好这样做,即使 - 正如您正确建议自己的那样,它有点“反模式”。

于 2011-10-10T14:01:12.860 回答
0

要记住的一些关键项目是:

  1. 行顺序一致性——你的数据模型是否依赖于生成数据的顺序?如果是这样,您的方案是否确保以相同顺序创建原始数据的 pub 和 sub 活动?

  2. 两边都有身份列吗?它们是一个问题,因为它们的值会根据插入数据的顺序不断变化。如果 Identity 列是唯一的主键(代理键),则其值的更改可能会使数据不可用。

  3. 你如何证明你没有丢失记录?这是解决方案中最棘手的部分,尤其是在您有数百万行的情况下。

至于架构,您可能需要查看 XMPP 协议 - Smack 用于客户端(如果是 Java)和 eJabberD 用于服务器。

于 2009-10-06T00:10:09.237 回答
-1

如果您使用的是 .Net,请查看 nServiceBus、Mass Transit 或 RhinoServiceBus。

于 2010-02-09T21:46:17.277 回答