我有几个微服务(用 ruby 实现,尽管我怀疑这对我的问题很重要)。其中一个提供项目,另一个处理它们,然后将它们标记为已处理(通过 DELETE 调用)
提供者有一个/items
端点,它以 JSON 格式列出了一堆用 id 标识的项目。它还有一个DELETE /items/id
端点,可以从列表中删除一项(可能是因为它已被处理)
“处理器”中的代码(非常简化)如下所示:
items = <GET provider/items>
items.each do |item|
process item
<DELETE provider/items/#{item.id}>
end
这有几个问题,但我想解决的一个问题是它不是线程安全的,因此我不能并行运行它。如果两个工人同时开始处理项目,他们将“踩到对方的脚趾”:他们将获得相同的项目列表,然后(尝试)处理并删除每个项目两次。
我可以更改此设置以允许并行处理的最简单方法是什么?
你可以假设我有 ruby 可用。我宁愿将更改保持在最低限度,并且如果可能的话,宁愿不安装其他 gem。Sidekiq可用作消费者的排队系统。