我应该使用消息而不是数据库

时间:2009-10-05 23:08:43

标签: database ipc messaging eai

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

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

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

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

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

这似乎是我实现了“Database as IPC”反模式。我应该改变我的设计以使用基于消息的系统吗?将数据放入平面表然后进入规范化表的过程是多余的吗?

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

3 个答案:

答案 0 :(得分:1)

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

  1. 您是否已经建立了基于消息的系统作为您的一部分 客户的架构?如果没有,也许介绍它是一个 矫枉过正。
  2. 您对使用基于消息的系统有什么经验吗?作为杰森 普朗克正确提到,你必须具体考虑 这些模式,如必须确保时间顺序 消息,管理死信频道等(有关更多信息,请参阅this book。)
  3. 您提到的主机系统显然有限 用于连接的选项。谁将照顾那层 将“消息”(基于DB或MOM)转换为某些东西 大型机可以消化?假设是你,是不是 通过访问数据库(也许你有),更容易(为你)这样做 已经解决了过去的问题)或者是努力的 根据使用DB或MOM而有所不同?
  4. 总结一下:如果你对DB路线更有信心,也许最好这样做,即使 - 正如你正确地建议的那样,它有点像“反模式”。

答案 1 :(得分:0)

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

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

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

  3. 您如何证明您没有丢失记录?这是解决方案中最棘手的部分,特别是如果你有数百万行。

  4. 对于体系结构,您可能需要查看XMPP协议 - Smack for client(如果是Java)和eJabberD for Server。

答案 2 :(得分:-1)

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