每个租户的消息队列

时间:2018-11-01 17:24:18

标签: message-queue scheduling

我有一个API,客户端可以异步提交作业,可以轻松地将其分为许多较小的任务。有时我们收到的工作量超出了实时处理的能力,因此,我希望每个客户都有一个工作队列,以便在客户之间轮流处理工作。这样一来,如果一个客户提交了一份庞大的工作,则其他客户的微小工作就不必等待这项艰巨的任务。

对于我的具体情况,重要的是每个任务必须处理一次。

A visual diagram of the description above

我一直在查看RabbitMQ,但是我还没有找到一种让消费者(在这种情况下为处理器)订阅所有与模式匹配的队列的方法,例如队列可以订阅交换。

Kafka似乎具有我想要的客户端分区,但是似乎无法提供足够的确定性,因为任务将一次执行。多个消费者具有不同偏移量的能力甚至可以进一步放大。

是否存在可以设置为执行我所描述的内容的消息队列代理?

1 个答案:

答案 0 :(得分:0)

根据您的情况,无法保证只进行一次处理。任务处理完成后,消息传递系统应该怎么做,但是由于硬件故障,确认未传递?它可以删除消息(实际上是失去客户的请求),也可以重新传递(恰好违反一次)。应该有一种方法检查请求是否已被处理。这将使您使任务处理成为幂等。

顺便说一句,我认为队列并不适合您的用例。检出Cadence Workflow,即可为您提供许多功能,并能立即查看处理过程。

与使用队列进行任务处理相比,Cadence具有许多优势。

  • 构建具有无限到期间隔的指数重试
  • 故障处理。例如,它允许执行一个任务,如果在配置的时间间隔内两次更新均未成功,则该任务会通知另一服务。
  • 支持长时间运行的心跳操作
  • 能够实现复杂的任务依赖性。例如,在无法恢复的故障(SAGA)的情况下实现呼叫链或补偿逻辑的链接
  • 完全了解更新的当前状态。例如,当使用队列时,您就会知道队列中是否有某些消息,并且需要其他数据库来跟踪总体进度。使用Cadence可以记录每个事件。
  • 能够取消正在进行的更新。
  • 分布式CRON支持

请参见介绍Cadence编程模型的the presentation