java - Apache Curator DistributedQueue 的 lockPath 是如何工作的?
问题描述
我有一堆独立的工作需要流程来执行。这些工作可以按任何顺序执行,并且它们持续的时间足够长,以至于在执行工作时流程有时会失败。
我需要协调这些工作的分配,而 Curator 的 DistributedQueue 似乎几乎就是我想要的。不过,我不需要它提供的排序,所以我很好奇假设我拒绝拥有一个消费者(即每个进程只是从队列中消费),我为此支付的开销水平是多少。
我主要关心的是队列构建器上的 lockPath() 函数实际上是如何工作的。我需要它提供的功能,因为进程可能会失败,我不需要放弃他们应该做的工作。但我不想要的是一次只有一个进程能够做任何工作。如果我使用 lockPath(),当一个进程正在消费一条消息时,队列是否会阻塞其他进程?
此外,如果队列似乎是一种不合理的方法,是否有另一种工具可以实现我想要的,或者我必须自己动手?我想留在 Curator / ZK 环境中,但对其中的替代方案持开放态度。
解决方案
(注:我是Apache Curator的主要作者)
文档需要改进。锁用于使队列条目可重试。即在消费者完成之前不会删除队列中的条目。锁确保只有 1 个进程对条目起作用。如果您不关心失败时丢弃队列条目,则不需要使用锁。但是,无论有没有锁,您运行的每个使用者都会处理队列条目。因此,如果您想对队列进行并发处理,您将运行多个消费者(在同一个 JVM 或不同的 JVM 中 - 没关系)。
这是我编写的一个工作流引擎,它使用 Curator 队列进行分布式工作。随意使用它,因为它是开源的:http: //nirmataoss.github.io/workflow/
推荐阅读
- php - PHP AD LDAP 获取所有用户属性及其值,JSON 编码问题
- google-chrome - Chrome 浏览器 - “仅允许本地连接” - 浏览器正常启动但测试用例停止且 URL 为空
- sql - SSRS - 将多个值传递给子报告中的过滤器
- debian - 安装 .deb 文件时选择文件何时解压
- mysql - MySQL:仅从具有名称和姓氏的列中选择姓氏
- sql - 如何从选择查询中选择 7 行或更多行?即使表返回少于 7 行
- android - Flutter Android SDK 版本 28 错误,但我使用的是 30
- python - lavalink discord.py 机器人的问题
- android - 如何根据 Firebase 实时数据库中的“设备”子项在 RecyclerView 中显示数据“用户设备”设备名称
- scala - 协方差的 Scala 编译器行为