首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySql/GigaSpace/Netapp上的分布式锁服务

MySql/GigaSpace/Netapp上的分布式锁服务
EN

Stack Overflow用户
提问于 2009-07-01 17:54:52
回答 4查看 2.1K关注 0票数 1

免责声明:我已经问过这个问题了,但是没有部署需求。我得到了一个得到3票支持的答案,当我编辑这个问题以包括部署需求时,答案就变得无关紧要了。我之所以重新提交,是因为我认为原来的问题是“答案”,尽管我没有得到有意义的、更高的答案。我打开了一个关于这个问题的用户语音提交。我转发的原因是StackOverflow考虑了最初的问题,所以它不会出现在“未回答的问题”选项卡上。

您会使用哪种分布式锁服务?

所需经费如下:

  1. 从不同的进程/机器中可以看到的互斥(锁)
  2. lock...release语义
  3. 在某个超时之后自动释放锁--如果锁持器死了,它将在X秒后自动释放。
  4. Java实现
  5. 轻松部署-必须不需要复杂的部署,无论是Netapp,MySql或GigaSpaces。必须很好地使用这些产品(尤其是GigaSpaces --这就是为什么排除了TerraCotta )。
  6. 很高兴有:.Net实现
  7. 如果是免费的:死锁检测/缓解

我对“可以在数据库上完成”或“可以在JavaSpaces上完成”这样的回答不感兴趣--我知道。相关的答案应该只包含一个现成的,开箱即用的,行之有效的实施方案.

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-05-11 20:54:38

下面是一个基于GigaSpaces的答案的大纲,它符合您的标准,具体取决于标准3中的含义。

使用SpaceID+SpaceRouting属性IDing创建一个锁定类,并解锁DataMember bool属性:

代码语言:javascript
复制
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是未锁定的。

您的锁存器类将定义并初始化这些类成员。

代码语言:javascript
复制
    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.");
        }
    }
票数 1
EN

Stack Overflow用户

发布于 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应该是直接的。

票数 4
EN

Stack Overflow用户

发布于 2010-10-05 00:42:46

如果您还在看,请看一下阿帕奇动物园管理员

ZooKeeper是一个集中服务,用于维护配置信息、命名、提供分布式同步和提供组服务。所有这些类型的服务都以某种形式被分布式应用程序使用。

动物园管理员文档提供了动物园管理员之上的如何构建锁服务示例。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1070495

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档