我想在多个进程之间共享一组有限的资源,而不是在多个服务器上运行。我想我需要的东西可以称为分布式信号量。
我找到了一个可以调整的旧Perl implementation(基于memcached)。我还没有完全调查过它。
是否有库/组件/软件已经这样做了?也许算法? 故障转移怎么样?
答案 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中的会话代表具有非常特殊语义的合同。
领事提供的合同是在以下任何一种情况下,该会话均将无效:
会话无效时,该会话将被破坏,无法再使用。