我正在设计一个系统,允许用户从一个系统获取数据并发送到其他系统。其中一个目标系统具有复杂的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中开发的
答案 0 :(得分:1)
MOM可能是更好的解决方案,但您还必须考虑以下几点:
总结一下:如果你对DB路线更有信心,也许最好这样做,即使 - 正如你正确地建议的那样,它有点像“反模式”。
答案 1 :(得分:0)
要记住的一些关键项目是:
行顺序一致性 - 您的数据模型是否依赖于生成的数据的顺序?如果是这样,您的方案是否确保以相同顺序创建原始数据的pub和sub活动?
你们两边都有身份栏吗?它们是一个问题,因为它们的值会根据插入数据的顺序不断变化。如果Identity列是唯一的主键(代理键),则其值的更改可能会使数据无法使用。
您如何证明您没有丢失记录?这是解决方案中最棘手的部分,特别是如果你有数百万行。
对于体系结构,您可能需要查看XMPP协议 - Smack for client(如果是Java)和eJabberD for Server。
答案 2 :(得分:-1)
如果您使用的是.Net,请查看nServiceBus,Mass Transit或RhinoServiceBus。