Concurrency 分布式优先级队列,一次且仅一次

Concurrency 分布式优先级队列,一次且仅一次,concurrency,queue,Concurrency,Queue,TL;DR 我有生产者、任务和消费者。我需要一个可扩展的排队系统,它可以确保一个任务可以被使用一次,而且只能使用一次,并且可以根据任务的优先级对任务进行排序 上下文: 我们有一个原型正在工作,但它还没有“准备好缩放”,今天我们需要缩放 以下是原型“流程”: 1°)部分客户在数据库中上传数据集(PostgreSQL) 每秒,应用程序获取数据库中的新数据集并将其转换为任务。 一个客户的数据集可以生成数千个任务(~500K个任务/天,~30K个任务/客户) 3°)应用程序“调度器” 从数据库中获取已

TL;DR

我有生产者、任务和消费者。我需要一个可扩展的排队系统,它可以确保一个任务可以被使用一次,而且只能使用一次,并且可以根据任务的优先级对任务进行排序

上下文:

我们有一个原型正在工作,但它还没有“准备好缩放”,今天我们需要缩放

以下是原型“流程”:

1°)部分客户在数据库中上传数据集(PostgreSQL)

每秒,应用程序获取数据库中的新数据集并将其转换为任务。 一个客户的数据集可以生成数千个任务(~500K个任务/天,~30K个任务/客户)

3°)应用程序“调度器”

  • 从数据库中获取已排序的任务(具有最小数据集的任务将首先执行,即使它们已在稍后提交+一些随机值以进行无序排列)
  • 执行一些验证(检查任务是否已取消)
  • 将任务分派给相应的工人。 每个工作者只能处理一种任务,但它可以同时处理数千种任务
4°)工人接收任务,并将结果推送到数据库

5°)一个“监视器”应用程序检查所有任务的状态,并重试任何需要执行的任务(工人崩溃)

今天,瓶颈是SQL server,我可以调整它,但我更愿意以正确的方式重新设计它。所以,我想知道对于这种过程是否有一些最佳实践

似乎我需要一个分布式排队系统(Kafka?),它可以保证一个任务只被处理一次,但也可以管理优先级