Лучший способ поставить в очередь события, полученные от веб-сокета, для асинхронной обработки - PullRequest
0 голосов
/ 09 февраля 2020

У меня есть java приложение, получающее события из веб-сокета Discord с использованием JDA, моя цель - поставить эти события в очередь (я использую LinkedBlockingQueues, но если есть лучший инструмент для этих предложений, очень приветствую) для обработки на несколько экземпляров объектов (потребителей) асинхронно, каждый со своей собственной очередью.

Обратите внимание, что могут быть и будут очереди, которые должны работать с одним и тем же элементом, поэтому простое совместное использование очереди между потоками не будет работать.

Первым делом я попытался клонировать очередь блокировки, используя

 BlockingQueue<T> original = new LinkedBlockingQueue<T>();
 BlockingQueue<T> clone = new LinkedBlockingQueue<T>(original);

, но это скопировало бы только события, присутствующие в очереди в то время, а не просто ie производителя с клоном так что это не работает.

Я также пытался назначить одного слушателя каждому из потребителей, но это кажется менее эффективным, чтобы сделать это во время выполнения с jda.

Подход, который я выбрал, состоит в том, чтобы передать все события в основную очередь и запустить поток, который будет передавать все эти события в параллельные очереди, распределенные по всем экземплярам, ​​но это просто кажется очень неэффективным и нечистым .

Каким будет лучший, самый чистый, самый эффективный способ решения этой проблемы?

1 Ответ

1 голос
/ 09 февраля 2020

Почему бы просто не разделить очередь с клонированием в нескольких потоках?

 BlockingQueue<T> original = new LinkedBlockingQueue<T>();

Thread consumer1 = new Thread(new Consumer(original));
Thread consumer2 = new Thread(new Consumer(original));

consumer1.start();
consumer2.start();

Или, если можете, использовать решение типа брокера сообщений (ie, Rabbit MQ), в котором производитель создает для TOPI C, и вы можете иметь несколько Потребителей, которые подписались на topi c, каждый со своим собственным потоком рабочих / бизнес-процессов. Этот подход также обеспечит вам безопасность, если ваша виртуальная машина будет sh, поскольку очередь будет храниться в другом месте.

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