将从 websocket 接收的事件排队以进行异步处理的最佳方法



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

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

我尝试的第一件事是使用

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

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

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

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

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

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

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(类型的解决方案,其中生产者生成 TOPIC 并且您可以有多个订阅该主题的消费者,每个消费者都有自己的工作/业务流程。 此方法还可以在 VM 崩溃时提供安全性,因为队列将存储在其他位置。

最新更新