Closed. This question needs to be more focused。它目前不接受答案。
想改进这个问题吗?更新问题,使其只关注一个问题editing this post。
两年前关闭。
免责声明:我已经问过了,但是没有
部署要求。我有一个
得到3张赞成票的回答,当我
编辑问题以包含部署要求,然后回答
变得无关紧要。我之所以
重新提交是因为
最初的问题“已回答”,甚至
尽管我没有得到有意义的投票
回答。我就这个问题开了一个this question。
我重新发布的原因是StackOverflow会考虑最初回答的问题,所以它不会出现在“未回答的问题”选项卡上。
您将使用哪种分布式锁服务?
要求如下:
从不同进程/机器上可以看到的互斥(锁)
锁定…释放语义
在某个超时后自动释放锁-如果锁夹死亡,它将在X秒后自动释放
Java实现
轻松部署-除了Netapp、MySql或GigaSpaces之外,不需要复杂的部署。必须很好地与这些产品(特别是千兆空间-这就是为什么赤陶被排除在外)。
很高兴有.Net实现
如果空闲:死锁检测/缓解
我对“可以通过数据库完成”或“可以通过javaspace完成”这样的答案不感兴趣——我知道。相关的答案应该只包含一个现成的、现成的、经过验证的实现。
您将使用GigaSpaces的租用时间在
超时。这将导致GigaSpaces删除IdLockTrans对象
在他们空闲了一段时间后
周期。一个ID缺少IdLockTrans意味着该ID被解锁。
你的locker类将定义并初始化这些类成员
想改进这个问题吗?更新问题,使其只关注一个问题editing this post。
两年前关闭。
免责声明:我已经问过了,但是没有
部署要求。我有一个
得到3张赞成票的回答,当我
编辑问题以包含部署要求,然后回答
变得无关紧要。我之所以
重新提交是因为
最初的问题“已回答”,甚至
尽管我没有得到有意义的投票
回答。我就这个问题开了一个this question。
我重新发布的原因是StackOverflow会考虑最初回答的问题,所以它不会出现在“未回答的问题”选项卡上。
您将使用哪种分布式锁服务?
要求如下:
从不同进程/机器上可以看到的互斥(锁)
锁定…释放语义
在某个超时后自动释放锁-如果锁夹死亡,它将在X秒后自动释放
Java实现
轻松部署-除了Netapp、MySql或GigaSpaces之外,不需要复杂的部署。必须很好地与这些产品(特别是千兆空间-这就是为什么赤陶被排除在外)。
很高兴有.Net实现
如果空闲:死锁检测/缓解
我对“可以通过数据库完成”或“可以通过javaspace完成”这样的答案不感兴趣——我知道。相关的答案应该只包含一个现成的、现成的、经过验证的实现。
最佳答案
这是一个基于GigaSpaces的答案的概要,它符合您的标准,具体取决于您在标准3中的意思。我使用的是来自.Net的GigaSpaces,而不是Java:
创建一个锁定类,其中SpaceID+SpaceRouting属性标识锁定的内容,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被解锁。
你的locker类将定义并初始化这些类成员
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.");
}
}
关于java - 通过MySql/GigaSpaces/Netapp的分布式锁定服务,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1070495/
10-12 05:38