【问题标题】:How to guarantee fairness among multiple users using amazon SQS queue?如何使用亚马逊 SQS 队列保证多个用户之间的公平性?
【发布时间】:2018-08-11 02:18:30
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 你只有一个消费者?
  • 我有 1 个消费者,同时在大约 10 个 ec2 实例上运行。
  • 我会说大约有 10 个消费者,不是吗?
  • 对 sqs 还是个新手,所以我猜是 10 个消费者

标签: architecture message-queue amazon-sqs


【解决方案1】:

解决此类问题的最简单方法是采用节流/配给形式,其中超出配给的请求被归类为“溢出”。

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

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

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

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

    • 与“主”队列相比,“溢出”队列处理的频率降低(或仅当主队列为空时)

这将为您提供用户之间的粗略公平(每个人都获得有限的主队列部分),并且溢出队列为所有请求提供“最终处理”。

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

【讨论】:

    猜你喜欢
    • 2011-07-15
    • 2015-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    • 1970-01-01
    • 2017-11-29
    相关资源
    最近更新 更多