如何保证使用亚马逊 SQS 队列的多个用户之间的公平性?

How to guarantee fairness among multiple users using amazon SQS queue?

所以我有一个 sqs 队列,它从生产者那里获取消息。 每条消息可以属于不同的所有者。

假设用户A进来,发送1000条消息给生产者,然后放入队列。现在用户 B 只有 1 条消息。他必须等到消费者处理完用户 A 的所有 1000。

我怎样才能让有 1 条消息的用户 B 与用户 A 有相同的机会被消费者接下来处理?

我想为系统中的每个用户创建一个队列,但这意味着每次轮询时都要从每个用户中读取,这是昂贵的。

我不求绝对公平,大致公平就够了。

解决此类问题最简单的方法是使用throttling/rationing的形式,其中超出定量的请求被归类为"overflow"。

我之前已经讨论过这个策略作为 this question 的答案(值得一读),但是根据您的具体用例用一个例子来解释可能更容易:

  1. 用户A一次提交了1000条消息。其中 10 条消息进入您的 "main" 队列,其余 990 条进入 "overflow" 队列。

    • 对于发送消息,您提供一个接口 - 该接口的实现将传入消息发送到 'main' 或 'overflow',具体取决于用户在过去 X 秒内发送了多少消息。
  2. 用户 B 提交了 1 条消息 - 它进入了主队列

  3. 用户 B 的单条消息将在用户 A 的大部分消息之前得到处理。

    • "Overflow" 队列处理的频率低于 "main" 队列(或者仅当主队列为空时)

这将使您在用户之间大致公平(每个人都得到主队列的有限部分),并且溢出队列为所有请求提供 "eventual processing"。

根据消息量,您可能需要考虑多层溢出队列来处理 "ridiculously high" 量不同于 "kinda high" 量用户。