同时从rethinkdb抢工作
Concurrently grabbing jobs from rethinkdb
我最近一直在玩 rethinkdb 并尝试实现一个作业队列。我只是想知道同时从 table?
中获取工作的最佳技术是什么
线程不多,作业需要一些时间才能完成 运行,所以可以,例如如果存在给定值,则更新失败。例如,如果两个并发进程获取一个作业并尝试设置一个 workerId,则第二个竞争进程将失败并重试。
所以我想知道如何在 rethinkdb 中执行此操作?我当前的方法有点 hack,如果第二个进程发现 old_val 不为空,则第二个进程覆盖第一个进程 workerId 并重置它。我宁愿第二个过程只是失败......或者一些其他解决方案让 rethinkdb 处理这个(如果可能,只用 rethinkdb 而不是 MQ)。
您可以在单个查询中自动更新和检索文档。例如,在 JavaScript:
r.table('foo').filter({status: 'pending'}).limit(1).update(
r.branch(r.row('status').eq('pending'), {status: 'in progress'}, {}),
{returnChanges: true})
该查询找到一个状态为 'pending'
的文档,将状态更改为 'in progress'
并且 returns 文档。
我最近一直在玩 rethinkdb 并尝试实现一个作业队列。我只是想知道同时从 table?
中获取工作的最佳技术是什么线程不多,作业需要一些时间才能完成 运行,所以可以,例如如果存在给定值,则更新失败。例如,如果两个并发进程获取一个作业并尝试设置一个 workerId,则第二个竞争进程将失败并重试。
所以我想知道如何在 rethinkdb 中执行此操作?我当前的方法有点 hack,如果第二个进程发现 old_val 不为空,则第二个进程覆盖第一个进程 workerId 并重置它。我宁愿第二个过程只是失败......或者一些其他解决方案让 rethinkdb 处理这个(如果可能,只用 rethinkdb 而不是 MQ)。
您可以在单个查询中自动更新和检索文档。例如,在 JavaScript:
r.table('foo').filter({status: 'pending'}).limit(1).update(
r.branch(r.row('status').eq('pending'), {status: 'in progress'}, {}),
{returnChanges: true})
该查询找到一个状态为 'pending'
的文档,将状态更改为 'in progress'
并且 returns 文档。