Closed. This question needs to be more focused。它目前不接受答案。
想改进这个问题吗?更新问题,使其只关注一个问题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