如何实现分布式信号量?

问题描述 投票:9回答:4

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

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

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

.net ipc distributed semaphore
4个回答
7
投票

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


1
投票

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

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


1
投票

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


0
投票

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

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

  1. 节点已取消注册
  2. 任何健康检查都会被注销
  3. 任何健康检查都会进入临界状态
  4. 会话被明确销毁
  5. 如果适用,TTL到期

会话失效时,会被销毁,无法再使用。

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

© www.soinside.com 2019 - 2024. All rights reserved.