【问题标题】:conflict resolution in distributed list分布式列表中的冲突解决
【发布时间】:2012-01-27 18:41:34
【问题描述】:

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

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

【问题讨论】:

  • 到目前为止你有什么代码...?
  • 请不要在标题前加上“c#:”。这就是标签的用途。
  • 你的问题到底是什么?
  • 我不会失败,但 MSFT 不是用 Azure 构建了类似的东西,你可以使用吗?我的意思是,您似乎真的无缘无故地重新发明了轮子。
  • @Jacko 感谢您的更新...仍然有点不清楚...您描述的情况下的冲突解决取决于用例...您可以描述用例或答案只能是使共享列表上的“冲突解决策略”可配置......在现实世界的项目中使用了几种策略,如“直写”、MVVC 等......

标签: c# .net windows distributed-caching


【解决方案1】:

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

Which .NET Memcached client do you use, EnyimMemcached vs. BeITMemcached?

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

【讨论】:

  • 谢谢,我关心的不是存储,而是设计分布式部分:即如何管理冲突等。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    例如,队列可能有:

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

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

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

    编辑:

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

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

    【讨论】:

    • 谢谢。如果服务器A更新#22项,服务器B更新#22项......如何解决冲突?
    【解决方案4】:

    是否每台服务器都在本地缓存了自己的List 版本,还是您打算使用集中式缓存层?

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

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

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

    【讨论】:

      【解决方案5】:

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

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

      我建议你使用Lamport Clocks

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-18
        • 2012-11-25
        • 1970-01-01
        • 1970-01-01
        • 2023-03-10
        相关资源
        最近更新 更多