如何实现分布式信号量?

11

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

我找到了一个旧的Perl实现(基于memcached),可以进行适应。但我还没有完全调查它。

是否已经有库/组件/软件可以实现这个功能?也许是算法?至于容错性如何呢?

5个回答

8

这个算法被称为Paxos。虽然还有其他算法,但它们都可以简化为Paxos(或者是错误的)。最流行的实现方式是Apache Zookeeper。Zookeeper服务器之间运行Paxos,客户端引用命名对象并可以锁定等操作。


我有点希望我能得到一些更直接的东西,但我想我会在深入研究这个过程中学到一些东西。谢谢提供链接。 - Mac
1
Zab INSTANCEOF Vertical Paxos; Vertical Paxos INSTANCOF PaxosZab是Vertical Paxos的实例;Vertical Paxos是Paxos的实例。 - Michael Deardeuff
1
ZooKeeper需要有序写入,而Paxos并不能保证这一点。该链接文章评论了对Paxos的修改,以提供此功能,但代价是性能下降。 - Sam

4
我想指出,从您描述的用例来看,信号量本身可能没有必要分布式。因此,您不一定需要一个分布式信号量,而是需要一个适用于分布式系统的信号量。
Throttle可能符合要求:https://github.com/pacman82/throttle

1
为了实现一个分布式信号量,你需要在一组节点中定义一个授权,并在选择好之后,将请求集中到它身上。处理锁请求是小菜一碟,选择领导者则更加复杂。
Paxos可以为你解决这个问题。我刚刚更新了wikipedia页面,因为算法描述不完整且具有误导性。

1

0

我建议基于 Consul 会话实现分布式信号量。在 Consul 中,会话代表了一个具有非常特定语义的契约。

Consul 提供的契约是,在以下任何情况下,会话将被作废:

  1. 节点被注销
  2. 任何一项健康检查被注销
  3. 任何一项健康检查进入严重状态
  4. 会话被明确销毁
  5. 如果适用,TTL 到期

当会话被作废时,它会被销毁,并且不能再使用。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接