【发布时间】: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 是的,但行为似乎相同。