出于性能原因,我们的系统将结构化模型(约 30 个具有多种关系的不同实体)完全保存在内存中(约 10 Gb)。在这个模型上,我们必须做 3 种操作:
- 更新一个或几个实体
- 查询特定数据(这通常需要读取数千个实体)
- 获取统计数据(使用了多少内存,多少种查询等)
目前,该体系结构是一种相当标准的体系结构,具有用于使用共享模型的 servlet 的线程池。在模型内部有很多并发集合,但仍然有很多等待,因为一些实体“更热”并且大多数线程想要读/写它们。另请注意,通常查询比写入更耗费 CPU 和时间。
我正在研究切换到 Disruptor 架构的可能性,将模型保持在一个线程中,将所有可能的(有效性检查、审计等)从模型中移出一个单独的消费者。
第一个问题当然是:这有意义吗?
第二个问题是:理想情况下,写请求应该优先于读请求。在破坏者中获得优先权的最佳方式是什么?我在考虑 2 个环形缓冲区,然后尝试从高优先级的缓冲区读取比从低优先级的缓冲区读取的频率更高。
澄清这个问题比关于 LMAX Disruptor 的实际代码更具架构性。
更新更多细节
数据是一个复杂的领域,许多不同类型(~20)的实体(>100k)在它们之间以具有许多不同集合的树结构链接。
查询通常涉及遍历数千个实体以找到正确的数据。更新很频繁,但非常有限,例如一次 10 个实体,因此在整个数据中变化不大(例如每小时 20%)。
我做了一些初步测试,看起来并行查询模型的速度优势超过了偶尔的写锁延迟。