我们有两个系统,其中系统A将数据发送到系统B。这是一个要求,每个系统都可以独立于另一个系统运行,并且如果另一个系统宕机,两个系统都不会崩溃。问题是,在满足解耦要求的同时,系统A与系统B通信的最佳方式是什么。
系统B当前有一个进程,该进程轮询数据库表中的数据并处理已插入的任何新行。
一种建议的设计是让系统A只将数据插入到系统b的db表中,然后让系统B通过现有进程处理新行。问题是,这个解决方案是否满足解耦两个系统的要求?数据库是否被视为系统B的一部分,而系统B可能会变得不可用并导致系统A崩溃?
另一种解决方案是让系统A将数据放入MQ队列,并让一个进程从MQ读取数据,然后插入到系统B的数据库中。但是这仅仅是额外的开销吗?归根结底,MQ队列比db表具有更强的容错能力吗?
发布于 2009-10-04 21:18:06
一般来说,数据库共享是一种紧密的耦合,除非可能出于速度的目的,否则不是首选。不仅是出于可用性的目的,还因为系统A和B将在未来的几个时间点进行更改和升级,并且彼此之间应该具有最小的依赖关系-消息传递是一种明显的依赖关系,而共享数据库往往会在最意想不到的时候咬你(或你的继承人)。如果你走数据库共享的路线,至少用专用表或视图使共享接口显式。
有四种常见的集成级别:
它可以在不同的场景中应用和组合,具有不同的可用性和可维护性。你在enterprise integration patterns site上有一个很好的概述。
与任何中央集成基础设施一样,MQ应该托管在具有高可用性、完全故障转移和c.的环境中。还有其他队列解决方案允许您分布队列协调。
发布于 2009-10-04 21:16:28
使用队列进行通信。不要通过数据库将数据从系统A“传递”到系统B。您将数据库用作一个巨大的、昂贵的、复杂的消息队列。
使用消息队列作为消息队列。
这不是“额外的”开销。这是解耦系统的最好方法。它被称为面向服务的体系结构(SOA),使用消息绝对是设计的核心。
MQ队列比DB表简单得多。
不要比较“容错”,因为RDBMS使用巨大的(几乎不可想象的)开销来实现事务正确完成的合理保证。锁定。缓冲。写入队列。存储管理。等。等。
可靠的消息队列实现使用一些后备存储来保持队列的状态。它的开销比RDBMS要小得多。性能要好得多。而且它的交互要简单得多。
发布于 2009-10-05 14:44:17
在SQL Server中,我将通过SSIS包或作业(取决于我要移动的记录的数量和复杂性)来完成此操作。其他数据库也有ETL解决方案。我喜欢ETL解决方案,因为我可以保存哪些更改和处理的错误的日志,我可以将由于某种原因不会去到另一个系统的记录(两个数据库之间的数据结构很少相同)发送到一个保存表中,而不会终止进程的其余部分。我还可以在数据流动时对其进行更改,以适应数据库差异(比如查找表值,比如db1中的完成状态是5,db2中的完成状态是7,或者db2有一个db1没有的必填字段,如果它为null,您必须在字段中添加一个默认值)。如果一台或另一台服务器关闭,则运行SSIS包的作业将失败,两个系统都不会受到影响,因此它会使数据库保持解耦,因为使用触发器或复制不会。
https://stackoverflow.com/questions/1517381
复制相似问题