使用公平排队处理 S3 数据
Process S3 data with fair queueing
我必须处理保存到具有密钥结构 client_id/uid
的 S3 存储桶中的数据。对 S3 的更新必须按照 FIFO 进行处理。实现此目的的一种方法是对 SQS 的更新进行排队,消息负载是 S3 密钥,然后对其进行处理。
但是,如果某些客户端推送的更新比其他客户端多得多,这是不公平的。
假设我想在 client_id 之间进行公平处理。理想情况下,我希望收到一批队列消息,其中包含每个 client_id 的最旧消息。批处理必须包含每个客户端一条消息。然后我会启动一些工人来处理批次,一旦他们都完成了就进行下一次迭代。
是否可以在不为每个客户端创建 SQS 队列的情况下执行此操作?
我应该考虑改用其他 AWS 服务吗?
John Rotenstein 用他的评论为我指明了正确的方向。
考虑一个队列,每个队列有 15 条消息给客户端。消息是这样添加的
for message = 1 to 15 {
for client_id = 1 to 3 {
sendMessage(messageGroupID=client_id)
}
}
在循环中接收消息将在每次调用时获取以下内容
10 messages for client_id = 1
10 messages for client_id = 2
10 messages for client_id = 3
5 messages for client_id = 1 and 5 messages for client_id = 2
5 messages for client_id = 3
与并行消费者接收消息时也是如此。
与我想象的完全不同,但它确实解决了我的问题。
我必须处理保存到具有密钥结构 client_id/uid
的 S3 存储桶中的数据。对 S3 的更新必须按照 FIFO 进行处理。实现此目的的一种方法是对 SQS 的更新进行排队,消息负载是 S3 密钥,然后对其进行处理。
但是,如果某些客户端推送的更新比其他客户端多得多,这是不公平的。
假设我想在 client_id 之间进行公平处理。理想情况下,我希望收到一批队列消息,其中包含每个 client_id 的最旧消息。批处理必须包含每个客户端一条消息。然后我会启动一些工人来处理批次,一旦他们都完成了就进行下一次迭代。
是否可以在不为每个客户端创建 SQS 队列的情况下执行此操作?
我应该考虑改用其他 AWS 服务吗?
John Rotenstein 用他的评论为我指明了正确的方向。
考虑一个队列,每个队列有 15 条消息给客户端。消息是这样添加的
for message = 1 to 15 {
for client_id = 1 to 3 {
sendMessage(messageGroupID=client_id)
}
}
在循环中接收消息将在每次调用时获取以下内容
10 messages for client_id = 1
10 messages for client_id = 2
10 messages for client_id = 3
5 messages for client_id = 1 and 5 messages for client_id = 2
5 messages for client_id = 3
与并行消费者接收消息时也是如此。
与我想象的完全不同,但它确实解决了我的问题。