java - 将从 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)类型的解决方案,其中生产者生成主题,并且您可以有多个订阅主题的消费者,每个消费者都有自己的工作/业务流程。如果您的 VM 崩溃,这种方法也可以为您提供安全,因为队列将存储在其他地方。
推荐阅读
- informatica - Informatica ETL:如何从导出的 xml 文件中确定目标数据库名称
- operating-system - 调度程序是否确定哪些进程在被阻塞后可以重新进入 CPU?
- css - 有哪些多种方法可以将 div 和图像彼此相邻显示并保持相同的高度响应?
- c++ - 在 ROS 上下文中使用基于 CUDA 的函数的正确方法
- tensorflow - 在 Keras 中添加自定义激活函数
- mongodb - 我们可以在 $project 阶段使用 $gte 运算符在 MongoDB 中使用聚合吗
- css - 角度材料 mat-tab-nav-bar 在左侧制作徽标,标签居中
- c++ - C++ 只使用 h 文件?
- oracle - oracle如何获取批量数据?
- javascript - jQuery datepicker 样式天宽和添加多个元素