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

时间:2018-03-02 19:52:21

标签: architecture message-queue amazon-sqs

所以我有一个sqs队列从生产者那里接收消息。 每条消息都可以属于不同的所有者。

假设用户A进入并向生产者发送1000条消息,然后生成器进入队列。现在用户B只有1条消息。他必须等到消费者处理来自用户A的全部1000个。

我该如何做到这样,一个消息的用户B与消费者接下来要处理的用户A几乎有相同的机会?

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

我不希望有绝对的公平,近乎公平就足够了。

1 个答案:

答案 0 :(得分:1)

解决此类问题的最简单方法是使用一种限制/配给形式,其中超出配额的请求被归类为“溢出”。

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

  1. 用户A一次提交1000条消息。其中10条消息进入“主”队列,其余990进入“溢出”队列。

    • 对于发送消息,您提供一个接口 - 其实现将传入消息发送到“主”或“溢出”,具体取决于用户在过去X秒内发送的消息数量。
  2. 用户B提交1条消息 - 它将进入主队列

  3. 用户B的单个消息将在大多数用户A的消息之前处理。

    • 与“主”队列相比,“溢出”队列处理的频率降低(或仅当主队列为空时)
  4. 这将为您提供用户之间的粗略公平性(每个人都获得主要队列的有限片段),溢出队列为所有请求提供“最终处理”。

    根据消息量的不同,您可能需要考虑多层溢出队列来处理“高得离谱”的卷,这与“有点高”的卷用户不同。