Лучший способ справиться с предложением и опросом asymmetri c в измерении BlockingQueue - PullRequest
0 голосов
/ 02 мая 2020

Существует BlockingQueue (в частности ArrayBlockingQueue), доступ к которому осуществляется с тем же числом потоков offer и poll в / из этого (5 потоков предлагают и 5 других потоков опрашивают).

BlockingQueue myQueue = new ArrayBlockingQueue<>(1000);

Проблема в том, что если, скажем, частота offer равна 1 мс, частота poll будет примерно равна 1500 мс (из-за времени обработки, потребляемого каждым опрашиваемым объектом, в каждом интервале l oop) , В этой ситуации очередь заполняется, что приводит к сбою новых команд offer и отбрасыванию объектов.

while (true) {
    Object obj = myQueue.poll();
    if (obj != null) {
        // Process the object, takes ~ 1500 ms
    }
}

Каков наилучший подход (ориентированный на производительность), чтобы заставить это работать?

  • Должен ли я увеличить число poll входящих потоков на x1500?

  • Возможно, решение проблемы - увеличение размера ArrayBlockingQueue или даже замена его на ConcurrentLinkedQueue?

  • Или просто увеличение TimeOut в offer(TimeOut, TimeUnit) метод в offer темы может решить эту проблему?

  • Или лучше? ....

Важно отметить, что входящие offer ed объекты невозможно остановить, поэтому объекты не должны накапливаться в очереди. В заключение, Скорость и Производительность крайне важны для предотвращения свертывания в этом потоке данных.

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...