我有一个带有一定有效负载的高速端点。 我的队列中有800个侦听器线程处于活动状态。 然后,我需要从该有效负载生成事件。每个有效负载可能有X个事件。 然后,我需要将这些事件聚合到Y桶中,这些桶将通过http发送到另一服务。 HTTP调用需要时间,因此我需要它们异步且并行(进行这些调用需要额外的Z线程数量)。 流程需要高效。
我现在所拥有的是这个。 http侦听器调用一个服务,该服务生成事件并将其放入ConcurrentLinkedQueue 然后调用ResettableCountDownLatch.countDown(设置为等待Y)。
我有一个线程池,每个执行者都在其中等待ResettableCountDownLatch,然后检查队列中是否有超过Y的线程,如果是,则从队列中轮询Y事件并进行调用。
我很想听听这里是否有更有效的工作方式,适合这里的任何开源项目(我听说过Reactive(在春季启动2上)或Kafka Streams)
doneSignal = new ResettableCountDownLatch(y);
executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(senderThreads);
executor.submit(() -> {
while (true) {
try {
doneSignal.await();
doneSignal.reset();
if (concurrentQueue.size() > bulkSize) {
log.debug("concurrentQueue size is: {}, going to start new thread", concurrentQueue.size());
executor.submit(() -> {
long start = System.currentTimeMillis();
while (concurrentQueue.size() > bulkSize) {
List<ObjectNode> events = populateList(concurrentQueue, bulkSize);
log.debug("got: {} from concurrentQueue, it took: {}", events.size(), (System.currentTimeMillis() - start));
String eventWrapper = wrapEventsInBulk(events);
sendEventToThirdPary(eventWrapper);
}
});
}
} catch (Exception e) {
}
}