首页 > 解决方案 > 将从 websocket 接收到的事件排入队列以进行异步处理的最佳方法

问题描述

我有一个使用 JDA 从 Discord 的 websocket 接收事件的 java 应用程序,我的目标是将这些事件排入队列(我一直在使用 LinkedBlockingQueues,但如果有更好的工具来处理这些建议,非常欢迎)处理多个对象实例(消费者) 异步,每个都有自己的队列。

请注意,可能会有队列需要对同一元素进行操作,因此仅在线程之间共享队列是行不通的。

我尝试的第一件事是使用克隆阻塞队列

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

但这只会复制当时队列中存在的事件,实际上并不会将生产者与克隆联系起来,因此它不起作用。

我也尝试为每个消费者分配一个侦听器,但这似乎在运行时使用 jda 效率较低。

我一直采用的方法是将所有事件提供给主队列并启动一个线程,该线程会将所有这些事件传递到分布在所有实例中的并行队列中,但这似乎非常无效率和不干净。

解决这个问题的最好、最干净、最有效的方法是什么?

标签: javamultithreadingqueue

解决方案


为什么不只是共享队列而不是跨多个线程克隆它呢?

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

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

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

或者,如果可以,使用消息代理(即 Rabbit MQ)类型的解决方案,其中生产者生成主题,并且您可以有多个订阅主题的消费者,每个消费者都有自己的工作/业务流程。如果您的 VM 崩溃,这种方法也可以为您提供安全,因为队列将存储在其他地方。


推荐阅读