我们如何使两个相关但独立的系统彼此保持同步?

时间:2020-03-05 18:40:07  来源:igfitidea点击:

我当前的开发项目有两个方面。首先,有一个公共网站,外部用户可以出于各种目的提交和更新信息。然后,此信息将保存到位于colo设施的本地SQL Server中。

第二个方面是内部应用程序,员工可以使用它来管理这些相同的记录(概念上)并提供状态更新,批准等。此应用程序托管在具有自己的本地SQL Server数据库的公司防火墙内。

这两个网络通过硬件VPN解决方案连接,这虽然不错,但显然不是世界上最快的事情。

这两个数据库是相似的,并且共享许多相同的表,但是它们并非100%相同。双方的许多表都非常针对内部或者外部应用程序。

因此,问题是:当用户更新其信息或者在公共网站上提交记录时,我们如何将这些数据传输到内部应用程序的数据库中,以便由内部人员进行管理?反之亦然...我们如何将工作人员所做的更新推送回网站?

值得一提的是,这些更新越"实时"发生就越好。并非一定要即时,而要相当快。

到目前为止,我已经考虑过使用以下类型的方法:

  • 双向复制
  • 两侧的Web服务都使用代码进行接口,以在更改完成后(实时)同步更改。
  • 两侧的Web服务都使用代码进行接口,以异步同步更改(使用排队机制)。

有什么建议吗?有人遇到过这个问题吗?我们是否提出了适合解决方案?

解决方案

回答

我相信,这是一个非常常见的集成方案。我个人认为使用队列的异步消息传递解决方案是理想的。

我们应该能够实现几乎实时的同步,而不会产生诸如复制之类的开销或者复杂性。

同步Web服务不是理想的选择,因为代码必须非常复杂才能处理故障情况。当一个系统重新启动而另一个继续发布更改时会发生什么?发送系统会超时吗?这些有什么用?除非我们准备丢失数据,否则我们将需要某种事务性队列(例如MSMQ)来接收更改通知,并确保确保它们到达另一个系统。如果任何一个系统宕机,更改(作为消息传递)都将累积起来,一旦建立连接,重新启动服务器将处理所有排队的消息并追上来,从而大大简化了系统完整性。

如果我们使用的是.NET(尤其是如果我们想使用MSMQ),则有一些开源工具可以使我们轻松实现这一目标。

  • UService Dahan的nServiceBus
  • 德鲁·塞勒斯(Dru Sellers)和克里斯·帕特森(Chris Patterson)的公共交通

也有商业产品,如果我们正在考虑商业选择,请参见此处以获取.NET的选项列表。当然,WCF可以使用MSMQ绑定进行异步消息传递,但是nServiceBus或者MassTransit之类的工具将为我们提供非常简单的Send / Receive或者Pub / Sub API,这将使需求变得非常简单。

如果我们使用的是Java,那么有许多开源服务总线实现都可以使这种双向,异步消息传递变得轻而易举,例如Mule或者ActiveMQ。

我们可能还需要考虑阅读Udi Dahan的博客,听听他的一些播客。这里有一些更好的资源可以入门。

回答

我只是说有一份工作可以将pub数据库输入表中的数据复制到私有数据库挂起表中。然后,一旦在私有端更新了数据,就将其复制到了公共端。如果我们没有在公共端更新任何复制数据,那么它应该是一个相当简单的事务复制解决方案。

回答

我们有一家商店作为客户,其中三个商店连接到同一VPN
其中两家商店拥有一台计算机作为该商店的"服务器",而第三家则拥有"主数据库"
要使所有数据库与主数据库同步,我们没有最好的解决方案,但是它可以正常工作:有一台运行应用程序的专用PC,该应用程序检查两个存储的每个表中每个记录的时间戳,如果与上次不同我们进行同步,它将复制结果
请注意,这两种方法都起作用。 IE。如果我们更新主数据库中的产品,此更改将传播到其他两家商店。如果我们在其中一家商店中有新订单,它将被发送给"主"。
通过一些优化,我们可以使所有商店在20分钟左右同步

回答

最近,我在SQL Server Service Broker上取得了很多成功,该服务提供了开箱即用的可靠,持久的异步消息传递,几乎没有实现麻烦。

  • 它设置起来很快,随着我们了解更多,我们可以使用一些更高级的功能。
  • 大多数人都不知道,它也是桌面版本的一部分,因此可以用作工作站消息传递系统
  • 如果我们已有T-SQL技能,则可以利用它们,因为所有读写消息的代码都是在SQL中完成的
  • 它快得令人眼花fast乱

它是SQL Server的一个被大肆宣传的部分,非常值得一看。

回答

我正在经历一个类似的项目,除了我有多个站点需要通过慢速连接(在某些情况下是拨号连接)保持同步。

首先,我们需要跟踪更改,如果可以使用SQL 2008(即使2Gb限制不是问题,即使Express版本也足够),这将大大减轻痛苦,只需在数据库和每个表上启用更改跟踪即可。我们在总部使用带有扩展架构的SQL Server 2008,在每个站点使用带有数据子集和受限架构的SQL Express 2008.

其次,我们需要跟踪更改,Sync Services可以很好地完成技巧,并支持使用WCF网关进入主数据库。在此示例中,我们将需要使用"使用SQL Express客户端同步"示例作为起点,请注意,该示例基于SQL 2005,因此我们需要对其进行更新以利用2008年的更改跟踪功能。默认情况下,"同步"服务在客户端上使用SQL CE,我确定这在情况下还不够。我们需要一个在Web服务器上运行的服务,该服务应定期(如果需要,可以每10秒运行一次)运行Synchronize()方法。这将告诉主数据库有关本地所做的更改,然后向服务器询问在此所做的所有更改。我们可以设置get和应用SQL代码来调用存储过程,还可以添加事件处理程序来处理冲突(例如,客户端更新与服务器更新),并在每一端相应地解决它们。