【问题标题】:How to implement a distributed semaphore?如何实现分布式信号量?
【发布时间】:2011-07-23 01:53:13
【问题描述】:

我希望在多个进程之间共享一组有限的资源,而不是在多个服务器上运行。我想我需要的可以称为分布式信号量

我找到了一个旧的Perl implementation(基于memcached)可以适应。我还没有完全调查它。

是否有已经这样做的库/组件/软件?一个算法,也许? 故障转移怎么样?

【问题讨论】:

    标签: .net ipc distributed semaphore


    【解决方案1】:

    此算法称为Paxos。还有其他算法,但它们都归结为 Paxos(或不正确)。它最流行的实现是Apache Zookeeper。 Zookeeper 服务器在它们之间运行 Paxos。客户端引用命名对象并可以锁定它们等。

    【讨论】:

    • 我有点希望我能得到一些更简单的东西,但我想我会学到一些深入研究的东西。感谢您的链接。
    • Zab INSTANCEOF Vertical Paxos;垂直 Paxos INSTANCOF Paxos
    • Zab ≠ Paxos (只需更新上一条评论中的链接。ZooKeeper 需要 Paxos 不保证的有序写入。链接的文章对 Paxos 进行了修改以提供该功能,但代价是性能。
    【解决方案2】:

    为了实现分布式信号量,你需要在一个节点集群中定义一个权限,然后一旦它被选中,你需要集中对它的请求。处理锁请求是小菜一碟,选择leader比较复杂。

    Paxos 将为您解决这个问题。我刚刚更新了wikipedia 页面,因为算法描述不完整且具有误导性。

    【讨论】:

      【解决方案3】:

      还有一个类似于paxos的更简单的算法,叫做raft: http://raftconsensus.github.io/

      【讨论】:

        【解决方案4】:

        我想建议基于领事会话实现分布式信号量。 Consul 中的会话表示具有非常特定语义的合约。

        Consul 提供的合约是,在以下任何一种情况下,会话都会失效:

        1. 节点已注销
        2. 所有运行状况检查均已注销
        3. 任何运行状况检查都进入临界状态
        4. 会话被显式销毁
        5. TTL 过期(如果适用)

        当会话失效时,它会被销毁,不能再使用。

        详细指南:https://www.consul.io/docs/internals/sessions.html

        【讨论】:

          【解决方案5】:

          我想指出,从您描述的用例来看,信号量本身可能几乎不需要分发。所以你不一定想要一个分布式信号量,而是一个用于分布式系统的信号量。

          油门可能符合这个要求:https://github.com/pacman82/throttle

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-06-22
            • 2011-08-25
            • 1970-01-01
            • 2013-11-30
            • 1970-01-01
            • 1970-01-01
            • 2011-07-18
            相关资源
            最近更新 更多