【发布时间】:2020-05-30 01:59:42
【问题描述】:
我更新了一个订阅 MQTT 主题并将收到的消息保存在 MongoDB 数据库中的应用程序。
正在使用 paho Java MQTT 驱动程序 和 Spring Data MongoDB。
应用程序的工作方式如下:
当消息到达时,消息处理被移动到一个单独的线程(使用 ThreadPoolExecutor)。因此,到达的消息被确认得非常快,当系统处于临时重负载状态时,我不需要因为“飞行队列已满”错误而陷入消息丢失的麻烦。可能会发生但我通常不会观察到的情况是,ThreadPoolExecutor 队列增长迅速,因为它处理得不够快。
更新系统后,我观察到 - 特别是在启动之后,但不仅如此 - ThreadPoolExecutor 队列增长了。应用程序总是设法赶上处理,但有时队列会增长到几万个任务。并且这具有每秒大约 700 条消息的持续相同负载(由于测试)。
到目前为止我测试的是:
Java 8 and App build with Java 8 -> works great
Java 11 and App build with Java 8 -> works great (some Illegal reflective access warnings of course)
Java 11 and App build with Java 11 -> makes some problems
应用更新当然包含依赖更新,主要有以下几种
spring-boot-starter-data-mongodb 1.15.12.RELEASE -> 2.2.4.RELEASE
spring-data-mongodb 1.10.11.RELEASE -> 2.2.4.RELEASE
mongodb-driver 3.4.3 -> 3.11.2
org.eclipse.paho.client.mqttv3 1.2.0 -> 1.2.2
MongoDB Server Version is 3.4.24
我怀疑库中的某些东西会导致性能下降。类似于 here 中描述的 MongoDB Java 驱动程序中已更改的 WriteConcern (但这不是我的问题,因为我已经在我的 Java 8 构建应用程序中使用了 mongo 驱动程序 3.4.3)。我只是找不到它可以是什么。
如果您知道导致这种行为的原因,请告诉我。现在我很茫然。
【问题讨论】:
-
澄清一下,您描述的问题不会出现在 Java 8 的更新依赖项中,对吧?
-
您是否手动指定要使用的 GC 算法?在 Java 11 中,默认值已从 Parallel 更改为 G1。
-
尝试将GC改为ParrallelGC - stackoverflow.com/questions/46582523/…
-
我尝试更改 GC,但观察结果没有改变。更新后的应用程序出现了问题,我确实(或多或少)将每个依赖项更新为新的(〜当前)版本(因为主要的春季启动更新)。奇怪的是,Java 8 应用程序版本(具有旧依赖项)在 Java 11 上运行良好。 - 随着更新的框架和依赖项,我观察到 ThreadPoolExecutor 队列中的条目数量越来越多。那里的作业将消息保存在数据库中。我猜问题一定出在某个地方。
标签: java mongodb mqtt spring-data-mongodb paho