【问题标题】:Is it possible to use the Disruptor/Ringbuffer pattern without using a fixed-length array?是否可以在不使用固定长度数组的情况下使用 Disruptor/Ringbuffer 模式?
【发布时间】:2012-09-25 11:50:38
【问题描述】:

我们有一个具有固定长度数组的 Disruptor 实现。是否可以实现一个不依赖于该数组,而是包含(可能是自描述的)可变长度对象列表的模式版本。例如,Protobuf 对象的 Ringbuffer?

我知道固定长度数组用于“预分配”步骤,但我认为可以用一个或多个对象池来近似该步骤。

【问题讨论】:

  • 你想达到什么目的?您是否想要像不断增长的环形缓冲区这样的东西,在重用最旧的内存之前只会增长到特定数量(例如,用于事件日志或类似的东西)?
  • 我需要一个更灵活的环形缓冲区。我继承了一个基于一个系统的系统,但几乎没有/没有低延迟要求。对于固定长度数组的不灵活性,添加新参数或测试新想法非常困难。
  • 也许我因为没有使用这个特定的模式而遗漏了一些东西,但是有什么新参数?数组怎么“不灵活”?

标签: disruptor-pattern


【解决方案1】:

java 版本的中断器中的环形缓冲区是对对象的任何引用数组。您可以通过您创建的 EventFactory 实例将您想要的任何对象放入其中。

【讨论】:

    【解决方案2】:

    绝对有可能实现一个不受对象数组支持的破坏器版本,但它不会是高性能的。在 LMAX Exchange Disruptor 的设计和实施中投入了大量的思想和机械的同情。

    本质上,环形缓冲区是一个预先分配的对象池。根据我的经验,我从来不用担心在任何现实世界的代码中直接管理环形缓冲区的资源。必要时干扰器会自动施加背压。

    该库提供了一个很好的 DSL 来为您的应用程序构建依赖关系图,并且基本上免费为您提供并行性。

    【讨论】:

      猜你喜欢
      • 2013-07-18
      • 1970-01-01
      • 2021-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多