Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 分布式锁服务_Java_Timeout_Locking_Distributed Lock - Fatal编程技术网

Java 分布式锁服务

Java 分布式锁服务,java,timeout,locking,distributed-lock,Java,Timeout,Locking,Distributed Lock,您将使用哪个分布式锁服务 要求如下: 可以从不同进程/机器中看到的互斥(锁) 锁…释放语义 在特定超时后自动释放锁-如果锁固定器死亡,它将在X秒后自动释放 Java实现 很高兴有:.Net实现 如果是免费的:死锁检测/缓解 易于部署,请参见下面的注释 我对“可以通过数据库完成”或“可以通过JavaSpaces完成”之类的答案不感兴趣,我知道。我对现成的、现成的、经过验证的实现感兴趣。,包括开源版本,通过使用synchronized或java.util.concurrent.ReentrantRe

您将使用哪个分布式锁服务

要求如下:

  • 可以从不同进程/机器中看到的互斥(锁)
  • 锁…释放语义
  • 在特定超时后自动释放锁-如果锁固定器死亡,它将在X秒后自动释放
  • Java实现
  • 很高兴有:.Net实现
  • 如果是免费的:死锁检测/缓解
  • 易于部署,请参见下面的注释
  • 我对“可以通过数据库完成”或“可以通过JavaSpaces完成”之类的答案不感兴趣,我知道。我对现成的、现成的、经过验证的实现感兴趣。

    ,包括开源版本,通过使用
    synchronized
    java.util.concurrent.ReentrantReadWriteLock
    ,具有分布式锁定语义,后者显然符合您的需求


    更新

    既然现在的问题增加了与GigaSpaces“混合”的要求,我想说的是不要将它们混合。这只会给您的技术堆栈增加更多的复杂性,以及:

    • 在代码和基础设施方面进行集成
    • 管理它们之间的同步
    • 学习/调整/调试Teracotta

    最好是创建或实施基于GigaSpaces的锁定解决方案。

    一个新的孩子在这个街区。我一直在玩它,它的使用和配置非常简单

    据我所知,Gigaspaces和hazelcast之间不应该有任何冲突,因为hazelcast没有任何依赖项,即没有jgroups.jar等

    Hazelcast

  • 互斥(lock),是
    java.util.concurrency.locks.lock
  • 自动锁释放在特定超时后,是的,如果成员离开集群,则所有锁都将被释放
  • Java实现,是的
  • 很高兴有:.Net实现,nope是一个纯java解决方案,可能可以移植到j#
  • 如果它是免费的:死锁检测/缓解,则我的Hazelcast不会对此进行任何处理
  • 易于部署,它是一个带有单个配置文件的jar,作为应用程序的一部分部署,不需要额外的进程
  • 看看Apache(Hadoop子项目)——它提供了分布式同步。文档不是很好,但是它看起来是一个有趣的产品——查看食谱,了解如何使用Zookeeper

    它的级别低于您可能想要的级别,而且它确实需要额外的部署,因为它建议使用专用服务器

    您可以对不同的锁定策略进行建模,它确实为锁持有者死亡(短暂节点)提供了解决方案。

    我建议使用基于内存数据网格的锁定策略。它实现了常见的Java数据结构,包括分布式
    Java.util.Lock
    Java.util.concurrent.ReentrantReadWriteLock
    对象。包括设置租赁时间的能力<代码>锁定使用示例:

    Redisson redisson = Redisson.create(config);
    
    Lock lock = redisson.getLock("anyLock");
    try {
       // unlock automatically after 10 seconds of hold
       lock.lock(10, TimeUnit.SECONDS);
    
    } finally {
       lock.unlock();
    }
    
    ...
    
    redisson.shutdown();
    

    支持Azure和AWS等云供应商。

    Oracle Coherence非常稳定和成熟,包括互斥支持:

      cache.lock(key, -1);
        try {
          // .. add your critical code here
        } finally {
          cache.unlock(key);
        }
    
    锁在服务器故障、滚动重新启动等情况下仍然有效


    为了充分披露,我在甲骨文公司工作。这篇文章中表达的观点和观点是我自己的,不一定反映我雇主的观点或观点。

    在框架的帮助下成为分布式锁定的事实标准。查看中的锁以了解更多信息。

    将死锁协商添加到您的列表中:p出于我的目的,不需要它。我将添加一个很好的示例。您可能会感兴趣,这使得SqlServer内置的应用程序锁功能可以很容易地用作分布式锁服务器。假设我们已经在使用GigaSpaces,您会添加Terracotta吗?这两个人配合得好吗?这就是我现在要说的方向。准备好后将发布。有部署工作吗?我将完善我的问题——不需要进一步部署,可以使用MySql、JavaSpaces/GigaSpaces或NetApp的解决方案(非常)可取。我还没有实际部署Hazelcast,但我正在积极考虑将其用于分布式锁定。部署似乎很繁琐,因为没有外部进程,集群中的所有JVM都能解决应该做什么。他们至少需要知道彼此的存在。。。无论如何,我更喜欢(并且坚持)基于我们正在使用的现有技术的解决方案——我认为在我们已经使用GigaSpaces的情况下引入另一个集群框架是不明智的。是否可能不存在基于MySql的解决方案???是的,hazelcast使用mutlicast自动发现其成员,如果mutlicast不合适,也可以硬连接集群。如果你想用MySql锁定东西,那真的很容易,不是吗?只需从LOCK_TABLE中选择ID,其中ID=
    sharedname
    FOR UPDATE'FOR#2似乎并不能完全满足某些人的需求。如果一台机器上有多个工作线程,其中一个线程流氓或被卡住而没有返回锁,那么您可能仍然希望在一段时间后使该锁过期。您可能不会得到完整的服务器故障,只是在释放锁之前的线程故障。这个问题还有其他解决办法吗?AFAIU,ZooKeeper会为每次锁获取写入磁盘。这太贵了。写入预写日志是为了可恢复性。由于锁服务是分布式的,如果锁没有缓存,锁获取将导致网络旅行。与网络旅行相比,附加到磁盘的费用不是很高。Zookeepr用于许多分布式系统,如HBase。它的性能是好的。Zookeeper是低级的,但是没有解决问题的方法。这是否涵盖了所有用例问题h