问题标签 [distributed-lock]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
847 浏览

java - 如何为自定义键值存储设计事务管理系统

我的应用程序使用自定义键值存储作为数据持久层。这个键值存储是内部开发的,有一些 API 可以使用,但是它不提供任何关于事务管理或锁定(尤其是分布式锁定)的东西。

现在,我们作为这个键值存储的用户需要开发这样一个锁定/事务管理系统。有人可以帮助展示如何实现这种分布式锁定吗?Apache Zookeeper 值得一看吗?

我们使用 Java 7。

谢谢,NN

0 投票
0 回答
88 浏览

multithreading - 分布式层次锁定

我需要在我的项目中使用分布式锁定。我正在为此考虑 Zookeeper + Curator。在我的调查中,我发现这两个框架可以解决我的大部分项目需求。但是我有两个用例,我不清楚 Zookeeper+Curator 如何解决它们。

  1. 锁定中的资源层次结构:我们有资源层次结构的概念,如果一个资源(例如:数据库表)被锁定,则对该对象和所有从属资源(例如:行)的其他请求应该被阻止。类似地,如果资源的下属被锁定,则对该资源的锁定请求应阻止该资源。有没有办法配置 curator 来满足上述需求?

  2. 基于参与者的重入:用户 U1 从节点 N1 登录到系统。在系统操作期间,他获取共享资源上的锁。如果他再次请求相同的资源,它将由 curator 授予,因为重入检查是基于线程的 UUID。如果同一用户 U1 从节点 N2 再次登录到系统,他的请求将排队,因为 UUID 不匹配。我的要求是,如果任何用户同时从不同的节点(多个 jvm)登录,他的所有请求都必须像从单个节点登录一样处理。这可以通过在馆长中用用户ID(通常是任何基于演员/应用程序的ID)替换UUID来完成吗?如果没有,请通过注意正确的方法来提供帮助。

请让我知道任何具有分布式锁定框架并且可以满足上述要求的机制或框架。

谢谢,纳雷什

0 投票
0 回答
1473 浏览

apache-zookeeper - ApacheCurator 分布式锁定 - 性能

我们目前正在评估用于分布式锁定用例的 apache-curator。下面是我们的测试用例:

该测试在 2G Xmx 的 2 核/7.5G RAM 机器上运行。Zookeeper 实例 ( zook.company.com) 在 4 核/15G RAM 服务器上运行,Xmx 为 12G,maxClientCnxns=5000,tickTime=2000,initLimit=10 和 syncLimit=5。

两台服务器都位于同一个 AWS VPC 中。

在运行 10 分钟的测试时,我们获得80 ms了超过 95% 的锁定尝试的锁定获取时间。虽然获取锁的最大时间是340 ms. 一直在尝试线程数和锁数的不同组合,但时间总是偏高。

无法找到任何地方是否有问题?因为时代似乎太高了。有什么线索吗??

0 投票
1 回答
3277 浏览

stackexchange.redis - 在 Azure 上使用 Redis 创建分布式锁的推荐方法是什么?

我希望在 Azure 上的 Redis 中为我们的多实例辅助角色创建一个分布式锁。我需要一种创建“关键部分”的方法,对于这些部分,一次只能有一个线程可以跨多个 Worker Role 实例进行访问。

我正在使用 StackExchange.Redis 客户端来执行此操作,而且,它已经实现了 transactional TakeLock\ReleaseLock 并且这个关于 SO 的答案让我很好地了解了要使用的模式以及有关如何创建锁的详细信息。

进一步阅读该主题,我还阅读了有关 distlock 的 Redis 文章,该文章描述了尝试实现分布式锁机制时基于故障转移的Redis 节点的弱点。

Azure Redis 缓存实现了主/从故障转移(除了基本层),这是否意味着我需要实现红锁模式以保证只有一件事会拥有锁?

另外,我想知道:

0 投票
1 回答
520 浏览

redis - Redis 分布式锁的竞争条件

我在http://redis.io/topics/distlock阅读了关于 Redis 分布式锁的文章。有一个 lua 脚本来描述如何“解锁”。

我认为这个模型存在竞争条件:

  1. 客户端 A 在 3 秒到期时获取锁。SET key randomstring1 NX PX 3000
  2. 睡眠 2.99 秒。
  3. 客户端 A 释放锁并调用上述代码。
  4. 条件为真。if redis.call("get",KEYS[1]) == ARGV[1] then
  5. 源密钥过期
  6. 客户端 B 获得 anthor 锁。SET key randomstring2 NX PX 3000
  7. 客户端 A 删除密钥。
  8. 客户端 B 的锁被客户端 A 删除了!
0 投票
1 回答
104 浏览

.net - DistributedLock 获取顺序

我为将在多台服务器上运行的 .NET 应用程序获取了用于DistributedLock的 NuGet 包。对于那些不知道它利用SQL Server 的应用程序锁定功能来提供跨不同机器锁定的简单方法的人。我一直在使用它,因为它很好。但是,我想知道检查锁的顺序是否会导致释放锁时保持顺序。

例如...假设我的应用程序正在从队列中读取,然后按顺序处理每条消息。如果每条消息都是关于家庭的,我想按顺序处理家庭的每条消息怎么办。遇到的第一条消息可以使用 DistributedLock 的 Acquire 来检查帐户是否空闲,如果空闲则锁定它,然后开始处理该消息。然后假设队列侦听器应用程序正在另一台服务器上运行,它从同一家庭的队列中读取另一条消息。在这种情况下,Acquire 将等到家庭的锁空闲,然后重新锁定并处理消息。

但是,如果有第三台机器运行相同的应用程序并且遇到具有相同家庭标识符的消息怎么办?

因此,机器#1 获取了家庭 ID A01 的第一条消息,将其锁定并开始处理它。机器#2 在队列中为 A01 抓取第二条消息并等待。机器#3 从队列中为 A01 抓取第三条消息并等待。

在上述情况下,当机器#1 完成处理它的 A01 的消息并释放锁时,机器#2,它为 A01 拾取第二条消息,在机器 #3 之前运行?或者它实际上是随机的,并且机器#2 或#3 可能会获得下一个锁?秩序会维持吗?

0 投票
1 回答
376 浏览

java - GAE/J 上的分布式锁

我正在 GAE/J 上开发一个应用程序,并研究如何在其上实现分布式锁。

我的要求和这个问题完全一样。 但是这个问题大约有7年的历史,所以我找不到答案是否仍然有效。我也找不到这些答案适用于 GAE/J。

如何在 GAE/J 上实现分布式锁?

0 投票
1 回答
986 浏览

java - 如何设置 Redisson 分布式锁的最大许可数

我有一个使用 AWS Lambda 运行的 Java 模块。这意味着可以同时运行模块的多个实例。

该模块用于访问某个 API 并从中检索数据。问题在于 API 使用了漏桶算法,该算法将 API 调用限制为 40 次,并且每 0.5 秒提供一次 API 调用。因此,我得到了一个Request limit exceeded例外。

为了解决这个问题,我决定实施分布式锁并将redisson与 AWS ElastiCache(分布式 Redis 集群)一起使用。在检查了 redisson 的文档后,我得出结论,我应该使用PermitExpirableSemaphore可以创建带有租约的锁(在我的情况下为 500 毫秒)。

问题是,我找不到将可用许可证限制为 40 个的方法。

你知道这样做的方法吗?

这是我的代码示例:

0 投票
2 回答
168 浏览

locking - 资源锁定和业务逻辑

考虑以下情况:实体 A 有更新请求,要创建子实体 AB,A 上可能有很多 B,每个 B 都有唯一的电子邮件地址。实体 A 是一个共享实体,同一个请求可以在多个服务器上并行发生(可扩展的微服务)。

为了创建 AB,我们必须验证 B 不作为 A 上的子实体存在(根据 B 的电子邮件地址)。

处理此更新请求的服务应锁定 A(通过它的唯一 ID)以确保更新安全。

我的问题是概念性的,而不是技术性的:

  1. 在这种情况下锁定资源 A 是否是该更新任务的业务逻辑的一部分?

  2. 您是否考虑将资源锁放在一个单独的中间件中,而不是处理验证和更新过程的中间件?(另一种选择是将锁视为业务逻辑的一部分,直接放在负责业务逻辑的中间件中。)

0 投票
3 回答
6225 浏览

java - 如何在java中为应用程序锁定redis集群

我有两个 java 应用程序(app1、app2)。两个应用程序都使用JedisCluster客户端用于 Redis 集群。app1 从 Redis 集群写入或读取数据。app2 就像一个调度器,它只向 Redis 集群写入一些数据。它在固定的时间间隔后运行。我必须确保当 app2 进行写操作时,在 app2 完成整个写操作之前,不会为 app1 提供或写入任何数据。我想在 app2 运行时为 app1 锁定 Redis 集群。app1当时是否获得异常并不重要。