当前位置: 首页 > 知识库问答 >
问题:

ActiveMQ Artemis产生/消耗延迟问题

高兴贤
2023-03-14

我一直在监视我的微服务应用程序的端到端延迟。每个服务通过ActiveMQ Artemis队列松散耦合。

-------------     -------------     -------------
| Service 1 | --> | Service 2 | --> | Service 3 |
-------------     -------------     -------------

服务1作为HTTPendpoint侦听并生成队列1。服务2从队列1消费,修改消息,并生成到队列2。服务3从队列2消耗。每个服务在单独的表中向db插入一行。从那里我还可以监视延迟。因此,“端到端”将进入“服务1”,并从“服务3”中出来。

每个服务处理时间保持稳定,并且大多数消息具有几毫秒的合理e2e延迟。我使用400请求/秒的JMeter以恒定的速率生产,我可以通过Grafana监控这一点。

java -jar destination-bench.jar --persistent --bytes 1000 --protocol artemis --url tcp://localhost:61616?producerMaxRate=100 --out /tmp/test1.txt --name q6 --iterations 5000000 --runs 1 --warmup 20000 --forks 4 --destinations 1 

编辑/更新我已经运行了几次测试,这是一个较短运行的输出。

java -jar destination-bench.jar --persistent --bytes 1000 --protocol artemis --url tcp://localhost:61616?producerMaxRate=100 --out ~/test-perf1.txt --name q6 --iterations 400000 --runs 1 --warmup 20000 --forks 4 --destinations 1

结果如下

 RUN 1   EndToEnd Throughput: 398 ops/sec
**************
EndToEnd SERVICE-TIME Latencies distribution in MICROSECONDS
mean              10117.30
min                 954.37
50.00%             1695.74
90.00%             2637.82
99.00%           177209.34
99.90%           847249.41
99.99%           859832.32
max             5939134.46
count              1600000

JVM线程状态是我注意到的,在我的实际系统中,在代理上有很多等待时间的线程,如果有尖峰,推到队列的延迟似乎会增加。

共有1个答案

公孙英飙
2023-03-14

我启动了一个新的默认ActiveMQ Artemis 2.17.0实例,克隆并构建了artemis-load-generator(对处理时间超过1秒的消息进行了修改,可以立即发出警报),然后运行您运行的相同命令。我让测试在我的本地机器上运行了大约一个小时,但我没有让它完成,因为它将花费超过3个小时(以每秒400条消息的速度运行500万条消息)。在大约100万条信息中,我只看到了一条“异常值”--当然没有接近你看到的10%。值得注意的是,在这段时间里,我仍然在使用我的电脑进行正常的开发工作。

在这一点上,我不得不把这归因于某种环境问题,例如:

  • 垃圾收集
  • 低性能磁盘
  • 网络延迟
  • 不足的CPU、RAM等
 类似资料:
  • 本文向大家介绍8085中产生时间延迟,包括了8085中产生时间延迟的使用技巧和注意事项,需要的朋友参考一下 在本节中,我们将看到如何使用8085程序生成时间延迟。该延迟将在不同的地方使用,以模拟时钟,计数器或其他区域。 当执行延迟子例程时,微处理器不执行其他任务。对于延迟,我们使用指令执行时间。在循环中执行一些指令,会产生延迟。有一些产生延迟的方法。这些方法如下。 使用NOP指令 使用8位寄存器作

  • 我正面临着G1GC算法中GC停顿的持续增加。服务延迟随着时间的推移继续增长。一旦发生这种情况,我将重新启动服务,延迟时间将恢复正常。启动后,等待时间再次随着时间的推移而增加。

  • 主要内容:1 load加载延迟消息数据,1.1 parseDelayLevel解析延迟等级,2 start启动调度消息服务,3 DeliverDelayedMessageTimerTask投递延迟消息任务,3.1 executeOnTimeup执行延迟消息投递,3.2 scheduleNextTimerTask下一个调度任务,3.3 correctDeliverTimestamp校验投递时间,3.4 messageTimeup恢复正常消息,,基于RocketMQ release-4.9.3,深入

  • 我正在使用Spring Kafka1.0.3来消费kafka消息。Kafka的2个主题,每个主题有1个分区。在java代码中,有2@KafKalistener来消费每个主题消息。ConcurrentKafkaListenerContainerFactory的并发设置为1。但消息有时会延迟20秒以上。 有人知道为什么吗? 添加调试日志,并且延迟不是每次都可以,有时也可以:

  • 如何使用Apache Kafka生成/使用延迟消息?标准的Kafka(和Java的kafka-client)功能似乎没有这个特性。我知道我自己可以用标准的等待/通知机制来实现它,但是它看起来不是很可靠,所以任何建议和好的实践都很感谢。 找到相关问题,但没有帮助。正如我所看到的:Kafka基于从文件系统的顺序读取,并且只能用于直接读取主题,保持消息的顺序。我说的对吗?

  • 问题内容: 运行上面的代码后,未执行,我的意思是文本字段未将其文本设置为“ START”, 为什么? 如何解决呢? 问题答案: 请记住,该按钮在JavaFX线程上被调用,因此您实际上将UI线程暂停了5秒钟。在这五秒钟的末尾取消冻结UI线程时,将同时应用这两个更改,因此最终只能看到第二个。 您可以通过在新线程中运行以上所有代码来解决此问题: