我正在编写一个应用程序,它通过 Spring Data 将大量对象存储到 MongoDB 中MongoTemplate
。为了避免同步,我MongoTemplate
为每个线程创建了一个单独的线程。事实上,每个线程都拥有它自己的所有东西,以避免同步。
应用程序处理用户与网页交互时生成的事件。因此,来自特定用户的事件需要按顺序处理,而跨多个用户的事件可以并行处理。该应用程序当前由 N 个管道和一个负载均衡器组成,该负载均衡器根据 userId 的哈希/mod 将事件分发到管道。在管道结束时,使用 Spring Data MongoDB 模板将数据写入 MongoDB。
这个单一进程每秒能够处理 2500 个事件。但是,我观察到线程之间存在显着的争用(以每秒 2500 个事件的速率,任何阻塞都变得相当严重)。所有在访问同步缓存的 ClassTypeInformation 领域。
不幸的是,MongoTemplate
使用ClassTypeInformation
将缓存存储在同步地图中。因此,无论我如何尝试,将数据写入 MongoDB 总是会在我的工作线程之间发生这种争用。
我认为ClassTypeInformation
应该将其转换为 bean,以便可以在用户需要时提供。考虑到这一点,将消除多个线程之间的争用。
有谁知道为什么这被实现为静态而不是普通的 Spring bean?是否有任何计划进行此更改?