免责声明:我已经问过这个问题了,但是没有部署需求。我得到了一个得到3票支持的答案,当我编辑这个问题以包括部署需求时,答案就变得无关紧要了。我之所以重新提交,是因为我认为原来的问题是“答案”,尽管我没有得到有意义的、更高的答案。我打开了一个关于这个问题的用户语音提交。我转发的原因是StackOverflow考虑了最初的问题,所以它不会出现在“未回答的问题”选项卡上。
您会使用哪种分布式锁服务?
所需经费如下:
我对“可以在数据库上完成”或“可以在JavaSpaces上完成”这样的回答不感兴趣--我知道。相关的答案应该只包含一个现成的,开箱即用的,行之有效的实施方案.
发布于 2010-05-11 20:54:38
下面是一个基于GigaSpaces的答案的大纲,它符合您的标准,具体取决于标准3中的含义。
使用SpaceID+SpaceRouting属性IDing创建一个锁定类,并解锁DataMember bool属性:
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.");
}
}发布于 2011-04-30 14:18:21
您的.Net实现非常接近Java提供的现有的开箱即用锁/解锁API。请参阅:http://www.gigaspaces.com/docs/JavaDoc8.0/org/openspaces/core/DefaultGigaMap.html
您可能会发现这个Java类的源代码是该产品提供的gs-openspaces src.zip文件的一部分。在Gigaspaces中使用同样的.Net应该是直接的。
发布于 2010-10-05 00:42:46
如果您还在看,请看一下阿帕奇动物园管理员
ZooKeeper是一个集中服务,用于维护配置信息、命名、提供分布式同步和提供组服务。所有这些类型的服务都以某种形式被分布式应用程序使用。
动物园管理员文档提供了动物园管理员之上的如何构建锁服务示例。
https://stackoverflow.com/questions/1070495
复制相似问题