如何实现分布式信号量?

时间:2011-03-25 16:56:21

标签: .net ipc distributed semaphore

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

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

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

5 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:1)

为了实现分布式信号量,您需要在节点集群中定义权限,然后一旦选择它,您需要将请求集中到它。处理锁定请求是件小事,选择领导者更复杂。

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

答案 2 :(得分:1)

有一种类似于paxos的简单算法,它被称为raft: http://raftconsensus.github.io/

答案 3 :(得分:1)

我想指出的是,根据您描述的用例,可能几乎不需要分发信号量本身。因此,您不一定需要分布式信号量,而是分布式系统的信号量。

节流阀可能符合以下要求:https://github.com/pacman82/throttle

答案 4 :(得分:0)

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

领事提供的合同是在以下任何一种情况下,该会话均将无效:

  1. 节点已注销
  2. 所有健康检查均已注销
  3. 任何健康检查都会进入临界状态
  4. 会话被明确破坏
  5. TTL过期(如果适用)

会话无效时,该会话将被破坏,无法再使用。

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