1

我想维护一个分布在 N 个负载平衡服务器之间的对象列表:每当客户端更改一台服务器上的列表时,我希望这些更改迁移到其他服务器。所以,我想这是一个主主复制的例子。处理这个最简单的方法是什么?一个简化的事实是,对列表中对象的每次更改都附加了一个相关的不断增加的版本号。因此,如果在两台不同的服务器上更改了一个项目,并且这两个增量进入第三台服务器,则可以解决冲突。

编辑:澄清:我非常熟悉 Memcached 和 Redis 等分布式键值存储。这不是这里的问题;我感兴趣的是一种解决共享列表中冲突的机制:如果服务器 A 更改列表中的一个项目,而服务器 B 删除该项目,例如,如何以编程方式解决冲突。

4

5 回答 5

4

我建议使用内存缓存。它是一个分布式服务器缓存系统,似乎完美地满足了您的需求。看看这个链接:

您使用哪个 .NET Memcached 客户端,EnyimMemcached 与 BeITMemcached?

如果传递整个列表不适合您(我不知道 memcached 是否足够聪明来区分您的列表),那么我建议给旧的 DataSet 对象看看,因为它的 diff 克应该非常适合传递如果您的数据集很大,则增量。

于 2011-12-26T01:41:30.057 回答
1

将您的更改放入队列中。让每个服务器查看队列,并对其采取行动。

例如,队列可能有:

  • 添加项目#33
  • 删除项目 #55
  • 更新项目#22
  • 等等

进行更改后,写入队列,并让每个服务器从队列中提取项目并根据该列表更新其列表。

我用这种方法做了内存数据库,它在多个“服务器”上运行良好。

编辑:

当服务器想要相互更新时,这必须发生:

每个更新的服务器都会将 UPDATE(或 ADD 或 DELETE)请求放入所有其他服务器的队列中。每个服务器还应该存储源自它的排队请求列表,这样它就不会从队列中加载自己的更新。

于 2011-12-30T17:57:27.967 回答
1

每台服务器是否都有自己的List本地缓存版本,或者您是否计划使用集中式缓存层?

如建议的那样,您可以有一个集中的“推送”过程,该过程在集中队列中起作用。任何服务器提交的任何更改都会排队,“推送”过程可以通过一些远程处理/WebService 机制将更新推送到所有服务器。

这提供了立即(或及时关闭)将任何更改/更新/删除应用到所有服务器的优势,如果需要,可以集中验证或记录。这也解决了多次更新的问题——最新的优先。

我已经看到这是作为一个 Windows 服务实现的,它有一个内部队列(可以持久保存到 DB 异步以实现弹性),它管理队列并简单地逐个获取项目,验证项目,记录更改/内容并最终将其推送到local Lists 通过 WebService 调用每个 Web 服务器(服务器维护内存列表,该列表只是根据需要进行更新/添加/删除)。

于 2011-12-30T21:49:23.833 回答
1

有一些算法可用于同步分布式系统。

在您的情况下,您需要一种算法,给定系统上的两个事件,告诉您其中一个事件首先发生。如果您可以决定任何两个事件,即第一个事件,那么所有冲突都可以解决。

我建议您使用Lamport Clocks

于 2012-01-03T13:54:33.843 回答
0

如果您使用的是 Windows 平台,我建议您查看“ Windows Server AppFabric ”,尤其是缓存功能。这个名字很时髦,但我认为这正是你要找的,我引用:

一种分布式内存缓存,可为 .NET 应用程序提供对应用程序数据的高速访问、扩展和高可用性。

于 2011-12-30T17:43:15.650 回答