分布式列表中的冲突解决

本文关键字:冲突 解决 列表 分布式 | 更新日期: 2023-09-27 18:18:43

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

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

分布式列表中的冲突解决

我建议使用memcached。它是一个分布式服务器缓存系统,似乎完全符合您的需求。看看这个链接:

你使用哪个。net Memcached客户端,EnyimMemcached vs. BeITMemcached?

如果传递整个列表不适合你(我不知道memcached是否足够智能来区分你的列表),那么我建议给旧的DataSet对象看一下,因为它的diff grams应该很适合传递delta,如果你的数据集很大。

将更改放到队列中。让每个服务器查看队列,并对其进行操作。

例如,queue可以有:

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

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

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

编辑:

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

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

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

正如建议的那样,您可以有一个集中的"推送"进程,它在集中的队列上工作。任何服务器提交的任何更改都是排队的,"推送"进程可以通过一些远程/WebService机制将更新推送到所有服务器。

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

我看到这个实现作为一个windows服务,它有一个内部队列(可以持久化到DB异步恢复),它管理队列,简单地一个接一个地获取项目,验证项目,记录更改/内容,最后通过WebService调用每个web服务器(服务器维护内存列表,只需根据需要更新/添加/删除)将其推送到本地List

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

在你的例子中,你需要一个算法,给定系统上的两个事件,告诉你哪一个事件先发生。如果你可以选择任意两个事件,那么所有的冲突都可以解决。

我推荐你使用Lamport时钟

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

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