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