Я провел немало исследований, но пока не могу найти решение. Я хотел бы найти pollable ring buffer
, похожий на LMAX disruptor
. У меня много издателей и один читатель.
Проблема с disrupto
r заключается в том, что он использует собственный выделенный поток (пул) для чтения сообщений, но я хотел бы прочитать их из отдельного потока, что также делает и другие вещи.
Одна альтернатива, которую я вижу, это использовать ManyToOneConcurrentArrayQueue
из agrona
или MpscArrayQueue
из jctools
. Но ни одна из этих очередей preallocates
объектов в пути LMAX disruptor
не делает. Когда я звоню ManyToOneConcurrentArrayQueue::offer
или MpscArrayQueue::offer
, я передаю право собственности на объект в очередь, а когда я звоню ManyToOneConcurrentArrayQueue::poll
или MpscArrayQueue::poll
, я забираю право собственности у них. Это проблема, так как это заставляет меня иметь отдельный пул объектов для переработки этих объектов, чтобы избежать создания мусора. Это, очевидно, медленнее, чем иметь preallocated array
, который всегда сохраняет владение своим содержимым (в виде RingBuffer в пакете прерывателя LMAX).
Я бы не хотел изобретать велосипед и сам строить такую структуру данных, но я не мог найти и существующую. Буду признателен за любую помощь, если кто-нибудь уже сталкивался с такой структурой.