免责声明 :我已经问了这个问题 ,但没有部署要求。 我认为有3个upvotes的答案,当我编辑的问题,包括部署要求的答案则成了无关紧要。 我重新提交的原因是因为这么认为原来的问题“回答”,即使我没有意义upvoted答案。 我开了一个UserVoice的提交这个问题。 我转贴如此StackOverflow上考虑原来的问题之所以回答,所以它不会在“悬而未决的问题”选项卡上显示。
其中分布式锁服务将使用?
要求是:
- 甲互斥(锁定),可以从不同的工艺/机器中可以看出
- 锁定...发布语义
- 一定超时后自动解锁 - 如果锁持有人死亡,它会自动X秒后释放
- Java实现
- 易于部署 -不能要求复杂的部署超越要么NetApp公司MySQL或GigaSpaces的。 必须与这些产品发挥好(尤其是GigaSpaces的 - 这就是为什么秦俑被排除)。
- 很高兴有:.NET实现
- 如果它是免费的:死锁检测/缓解
我不感兴趣,喜欢“它可以通过一个数据库来完成”,或“它可以通过JavaSpaces的做”的答案 - 我知道。 相关答案应该只包含一个现成的,出的现成的可靠实现。
下面是一个基于GigaSpaces的回答符合您的标准,取决于你的标准3.我GigaSpaces的从.net,而不是Java工作意味着什么的轮廓:
用SpaceID + SpaceRouting属性创建一个锁定类IDing什么是锁定和数据成员布尔属性解锁:
sealed public class IdLockTrans
{
[SpaceID]
[SpaceRouting]
public string ID
{
get;
set;
}
[DataMember]
public bool Unlocked
{
get;
set;
}
public IdLockTrans(Id id)
{
ID = id.ID;
}
public IdLockTrans()
{
}
}
您将使用GigaSpaces的租约时间锁定释放一定的超时后。 这将导致GigaSpaces的从空间删除IdLockTrans对象后自动他们一直闲置超时时间。 用于ID缺乏IdLockTrans的装置的ID被解锁。
你的衣柜类将定义和初始化这些类成员
private readonly ISpaceProxy _proxy;
private readonly long _leaseTime;
public override bool Lock(Id id, long timeout)
{
bool locked;
IdLockTrans lockTransTemplate = new IdLockTrans(id);
// Assume that this is a new id.
try
{
_proxy.Write(lockTransTemplate, null, _leaseTime, 0, UpdateModifiers.WriteOnly);
locked = true;
}
catch (EntryAlreadyInSpaceException)
{
using (ITransaction tx = _proxy.CreateLocalTransaction())
{
try
{
lockTransTemplate.Unlocked = true;
IdLockTrans lockTrans = _proxy.Take(lockTransTemplate, tx, timeout);
locked = (lockTrans != null);
if (lockTrans != null)
{
lockTrans.Unlocked = false;
_proxy.Write(lockTrans, tx, _leaseTime, 0, UpdateModifiers.WriteOnly);
}
tx.Commit();
}
catch
{
tx.Abort();
throw;
}
}
}
return locked;
}
public override void Unlock(Id lockedId)
{
IdLockTrans lockTrans = new IdLockTrans(lockedId);
lockTrans.Unlocked = true;
try
{
_proxy.Update(lockTrans, null, _leaseTime, 0, UpdateModifiers.UpdateOnly);
}
catch (EntryNotInSpaceException)
{
throw new Exception("IdLockTrans for " + lockTrans.ID
+ " not found on Unlock. Lock time exceeded lease time.");
}
}
你的.NET实现非常接近现有出来提供了Java API箱锁定/解锁的API。 请参阅: http://www.gigaspaces.com/docs/JavaDoc8.0/org/openspaces/core/DefaultGigaMap.html
您可能会发现这个Java类的源代码随产品提供的gs-openspaces-src.zip文件的一部分。 经与GigaSpaces的.NET API同样要straightfwd。
如果你还在寻找,看看Apache的动物园管理员 :
ZooKeeper的是维持配置信息,命名,提供分布式同步,并提供群组服务,集中服务。 所有这些种类的服务都以某种形式使用,或通过其他分布式应用程序。
动物园管理员文档提供的例子如何建立一个锁定的服务在动物园管理员的顶部。
使用MySQL来锁定一个唯一的密钥是非常简单的。
假设1:
您可以使用交易,您的隔离级别是只读承诺。
假设2:你锁定你通过一个唯一的密钥处理线程,并释放它,当您的交易承诺。
然后你可以使用这个SQL作为分配锁:
插入distributed_lock(密钥)的值(#{键})ON DUPLICATE密钥更新密钥=键;