【问题标题】:After creating SQS message, how can I monitor when it gets deleted?创建 SQS 消息后,如何监控它何时被删除?
【发布时间】:2013-08-14 03:28:20
【问题描述】:

我的程序在 SQS 队列中创建了一条消息,然后需要等待其中一名工作人员在队列上拉动工作来处理它。我想监视消息的状态以确定它何时被删除,因为这将是我的工作完成的指标。但我想不出用 SQS API 做到这一点的方法。

SendMessageRequest msgRequest = new SendMessageRequest(SQS_QUEUE_URL, messageBody);
SendMessageResult result = sqsClient.sendMessage(msgRequest);

String msgId = result.getMessageId();

// so, in theory, this is what I WANT to do...

while(!sqsClient.wasThisMessageDeletedYet(msgId))
   Thread.sleep(1000L);

// continue, confident that because the message was deleted, I can rely upon the fact that the result of the Worker is now stashed where it's supposed to be

“wasThisMessageDeletedYet(id)”的正确方法是什么?

【问题讨论】:

    标签: java amazon-sqs


    【解决方案1】:

    恐怕不存在这样的 API 端点;查看 API 参考 (http://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/Welcome.html),您可以看到没有查询消息的方法。

    也许您可以尝试“更改消息可见性”,但是:

    • 有副作用
    • 您需要知道收到消息时获取的回执句柄

    所以我想你最好的选择是将状态存储在某个外部数据库中(如果你想留在亚马逊地区,也许是 Dynamo?)。使用简单的消息 id -> 布尔映射指示消息是否已被处理。

    【讨论】:

    • 谢谢,我试图避免使用数据库,因为轮询所需的连接数很快就会失控。当一个工作人员完成他的工作时,我认为发送者意识到这一事实的最好方法是...... a)工作人员将完成的 msg id 放入 memcached,b)发送者为每个 msg 创建 SNS 主题并订阅;当一个 Worker 做他的事情时,他会在 SNS 主题上放一个“完成”的消息,然后发送者删除该主题。但我不确定为每条消息创建和销毁 SNS 主题的性能开销。还有其他想法吗?
    【解决方案2】:

    另一个选项(但类似)是让消费者在响应队列中发布状态。等待必须异步完成(也许是 Future)。

    由于交互的异步性质,显然存在处理开销和编程复杂性。但通常是这样完成的。

    【讨论】:

      猜你喜欢
      • 2020-11-08
      • 1970-01-01
      • 2012-04-28
      • 1970-01-01
      • 1970-01-01
      • 2018-11-30
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多