我想维护一个在N个负载平衡服务器之间分配的对象列表:每当客户端更改一个服务器上的列表时,我希望这些更改迁移到其他服务器。所以,我想这是一个主 - 主复制的情况。 处理这个问题最简单的方法是什么?一个简化的事实是,对列表中的对象的每次更改都附加了相关的增加版本号。因此,如果在两个不同的服务器上更改了项目,并且这两个增量转到第三个服务器,则可以解决冲突。
编辑:澄清:我非常熟悉像Memcached和Redis这样的分布式键值存储。这不是问题所在;我感兴趣的是解决共享列表中的冲突的机制:如果服务器A更改列表中的项目,并且服务器B删除该项目,例如,如何以编程方式解决冲突。
答案 0 :(得分:4)
我建议memcached。它是一个分布式服务器缓存系统,似乎完全符合您的需求。看看这个链接:
Which .NET Memcached client do you use, EnyimMemcached vs. BeITMemcached?
如果传递整个列表并不适合你(我不知道memcached是否足够智能来区分你的列表)那么我建议给出旧的DataSet对象,因为它的差异应该非常适合如果你的数据集很大,那么只传递deltas。
答案 1 :(得分:1)
将更改放入队列中。让每个服务器查看队列,并对其进行操作。
例如,队列可以有:
执行更改后,写入队列,让每个服务器从队列中提取项目并根据该列表更新其列表。
我使用这种方法做了内存数据库,并且在多个“服务器”上完美运行。
编辑:
当服务器想要相互更新时,必须发生这种情况:
每个更新的服务器都会将UPDATE(或ADD或DELETE)请求放入队列中以供所有其他服务器使用。每个服务器还应该存储源自它的排队请求列表,这样它就不会从队列中加载自己的更新。
答案 2 :(得分:1)
每个服务器是否在本地缓存了自己的List
版本,或者您是否计划使用集中式缓存层?
根据建议,您可以拥有一个集中式“推送”流程,该流程可以在集中式队列中运行。任何服务器提交的任何更改都会被排队,“推送”过程可以通过一些远程处理/ WebService机制将更新推送到所有服务器。
这提供了任何更改/更新/删除一次(或接近时间)应用于所有服务器,集中验证或记录(如果需要)的优势。这也解决了多次更新的问题 - 最新更新优先。
我已经看到这个实现为一个Windows服务,它有一个内部队列(可以持久保存到数据库异步以实现弹性),它管理队列并简单地逐个获取项目,验证项目,logg更改/内容,最后通过对每个Web服务器的WebService调用将其推送到本地List
(服务器维护内存列表,根据需要简单地更新/添加/删除)。
答案 3 :(得分:1)
有些算法可用于同步分布式系统。
在你的情况下,你需要一个算法,在系统上给出两个事件告诉你,其中一个事件发生了。如果您可以决定第一个任何两个事件,那么所有冲突都可以解决。
我建议您使用Lamport Clocks。
答案 4 :(得分:0)
如果您使用的是Windows平台,建议您查看" Windows Server AppFabric",尤其是Caching功能。这个名字很时髦,但我认为这正是你所寻找的,我引用:
为.NET应用程序提供的分布式内存缓存 高速访问,扩展和应用程序数据的高可用性。