蜂房速度流-响应式Java或Kafka流

时间:2019-04-18 14:15:13

标签: java spring-boot concurrency reactive-programming apache-kafka-streams

我有一个带有一定有效负载的高速端点。 我的队列中有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) {

            }
        }

0 个答案:

没有答案