20

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

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

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

这两个数据库相似,并且共享许多相同的表,但它们不是 100% 相同。两边的许多表都非常特定于内部或外部应用程序。

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

值得一提的是,这些更新发生得越“实时”越好。并不是说它必须是即时的,只是相当快。

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

  1. 双向复制
  2. 双方的 Web 服务接口都带有代码,以便在更改发生时(实时)同步更改。
  3. 双方的 Web 服务接口带有异步同步更改的代码(使用排队机制)。

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

4

5 回答 5

22

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

您应该能够实现近乎实时的同步,而无需像复制这样的开销或复杂性。

同步 Web 服务并不理想,因为您的代码必须非常复杂才能处理故障情况。当一个系统重新启动而另一个系统继续发布更改时会发生什么?发送系统是否超时?它和那些有什么关系?除非您准备好丢失数据,否则您将需要某种事务队列(如 MSMQ)来接收更改通知并确保它们到达其他系统。如果任何一个系统出现故障,更改(作为消息传递)只会累积,一旦建立连接,重新启动的服务器将处理所有排队的消息并赶上,使系统完整性更容易实现。

如果您使用 .NET(尤其是如果您想使用 MSMQ),有一些开源工具可以让您真正轻松地做到这一点。

  1. Udi Dahan 的nServiceBus
  2. Dru Sellers 和 Chris Patterson 的公共交通

还有商业产品,如果您正在考虑商业选项,请参阅此处以获取 .NET 上的选项列表。当然,WCF 可以使用 MSMQ 绑定进行异步消息传递,但是像 nServiceBus 或 MassTransit 这样的工具将为您提供非常简单的发送/接收或 Pub/Sub API,这将使您的需求变得非常简单。

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

您可能还想考虑阅读Udi Dahan的博客,收听他的一些播客。这里有一些更好的资源可以帮助您入门。

于 2008-08-17T03:22:49.017 回答
3

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

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

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

于 2008-09-17T01:53:31.300 回答
1

我们有一个商店作为客户端,三个商店连接到同一个 VPN
两个商店有一台计算机作为该商店的“服务器”运行,第三个有“主数据库”
为了同步所有到主我们没有最好的解决方案,但它可以工作:有一台专用 PC 运行一个应用程序,该应用程序检查两个存储的每个表中每条记录的时间戳,如果与上次同步时不同,它会复制结果
请注意,这是双向的。即,如果您更新主数据库中的产品,此更改将传播到其他两个商店。如果您在其中一家商店有新订单,它将被传输给“主人”。

于 2008-08-21T11:52:50.507 回答
1

最近,我在 SQL Server Service Broker 上取得了很大的成功,它提供了可靠的、持久的、开箱即用的异步消息传递,实现起来几乎没有痛苦。

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

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

于 2008-09-02T08:20:54.087 回答
0

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

于 2008-08-17T04:07:34.323 回答