One EventHandler
(数据库消费者)Disruptor
调用数据库中的存储过程,速度太慢,以至于阻塞Disruptor
一段时间了。
因为我需要Disruptor
继续运行而不阻塞。我正在考虑添加一个额外的队列,以便EventHandler
可以作为Producer
另一个新创建的线程可以用作Consumer
处理数据库的工作,这可以是异步的,而不影响Disruptor
这是一些限制:
- 那个对象
Disruptor
传递给EventHandler
大小约为30KB,该对象的数量约为400k。理论上,需要处理的对象总大小约为30KBX400K = 12GB。所以额外的队列对他们来说应该足够了。
- 由于性能很重要,因此应该避免 GC 暂停。
- Java程序的堆大小只有2GB。
我正在考虑将文本文件作为一种选择。EventHandler
(生产者)将对象写入文件并Consumer
从中读取并调用存储过程。问题是如何处理到达文件末尾的情况以及如何知道新的行。
有谁以前解决过这种情况吗?有什么建议吗?
简短的答案是调整你的颠覆者的规模以应对你的规模bursts不是整个卷,请记住,干扰器只能包含对 30kb 对象的引用,整个对象不需要位于环形缓冲区中。
在数据库需要内存进行缓冲之前,无论采用任何形式的缓冲,当数据库落后太多时,中断器都会为您提供对系统其余部分施加背压的选项。也就是说,您可以减慢对干扰器的输入。
假脱机到文件的另一个选项是查看爪哇纪事 https://github.com/OpenHFT/Java-Chronicle它使用内存映射文件将内容保存到磁盘。
更复杂的答案是利用干扰器的批处理效应,以便您的数据库能够赶上。 IE。使用 EventHandler 将一批事件收集在一起并将它们作为一个单元提交到数据库。
这种做法允许事件处理程序在事物备份时变得更加高效,从而提高吞吐量。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)