【问题标题】:Apache Camel not acquiring message from SQS in timely mannerApache Camel 没有及时从 SQS 获取消息
【发布时间】:2017-06-18 22:51:46
【问题描述】:

我们有一个实现,其中消息被放置在 AWS SQS 队列中并由 Camel AWS 使用。我们使用 concurrentConsumers = 1。我们正在记录 org.apache.camel.component.aws.sqs.SqsConsumer 完成的队列轮询。

测试包括(从远程系统)向 SQS 发送消息,然后记录消息在队列中的时间。在 Camel 端,我们在 SqsConsumer 类上有跟踪日志记录,我们可以看到何时轮询队列以及何时消费消息。

如果我们每 10 秒在队列中放置一条消息,大多数情况下 Camel 会在 1-2 秒内获取该消息。但是,很多时候需要更长的时间(10 多秒)。

基本上我们会看到这种行为:

  • (远程)在 SQS 上放置消息
  • (骆驼)投票
  • (骆驼)投票
  • (骆驼)投票
  • ...(对于许多轮询,默认间隔 500 毫秒)
  • (Camel)从 SQS 接收消息

我们已经在没有 Camel 的情况下端到端测试了 SQS,并且吞吐量没有问题(几秒钟内 1000 条消息)。

我们在此测试中的 Camel 实现仅包括从 SQS 队列中读取和记录 - 没有其他功能。

我们已经通过改变许多其他 Camel SQS 参数进行了测试,在行为上没有任何差异。

但是,例如,如果我们使用 concurrentConsumers = 10 进行测试,则几乎可以立即从队列中提取每条消息,并且延迟最小。

我的问题是为什么单个消费者不及时接收消息?如果它真的是每 500 毫秒轮询一次,它怎么不“看到”和拾取消息?

注意 - 由于我们应用程序的功能性,我们不愿启用使用 concurrentConsumers 所带来的多线程。

【问题讨论】:

  • 你试过长轮询吗?
  • @ketanvijayvargiya 是的,但行为似乎相同。

标签: apache-camel amazon-sqs


【解决方案1】:

正如@ketanvijayvargiya 所建议的那样,长轮询似乎确实是答案。由于您的评论,我们再次查看了它。有多种方法可以设置我们尝试过的值:

  1. 通过 SQS URI 上的骆驼本身,?receiveMessageWaitTimeSeconds=
  2. 在 AWS SQS 队列本身上设置它(在控制台上,配置队列 -> 接收消息等待时间)。

我们已经测试过 (2) 并且没有看到任何行为变化(在我发帖时)。我们使用 (1) 再次测试并看到了改进。我们再次使用 (2) 进行了重新测试,也看到了改进,因此我们只能假设我们在执行第一次测试时犯了错误。

【讨论】:

  • 感谢您分享有关如何克服从队列轮询消息的延迟的发现。我们面临与 SingleConsumer (concurrentConsumers) 相同的问题,并将尝试长轮询路线。
猜你喜欢
  • 1970-01-01
  • 2021-03-30
  • 1970-01-01
  • 1970-01-01
  • 2019-09-19
  • 1970-01-01
  • 2021-10-11
  • 2014-08-24
  • 1970-01-01
相关资源
最近更新 更多