反应堆卡夫卡+并发+背压

时间:2019-06-17 12:38:59

标签: java apache-kafka reactor

在这里我有逻辑,我使用一个主题(1个分区)中的消息,进行缓慢的计算(可能需要100ms-2sec),然后将结果发送到另一个主题。 我想使用Reactor kafka库并通过使用limitRate方法施加反压力,但是当我要在多个线程上运行计算时,此limitRate不起作用(发送“需求”请求而无需等待计算结束)。我的想法是,当在一个线程中完成工作时,会发出信号,并且订户可以发送对下一条消息的请求。

有人有这样的问题吗?

public void runFlow() {
    KafkaSender<String, String> kafkaSender = createKafkaSender();
    KafkaReceiver<String, String> kafkaReceiver = createKafkaReceiver();
    Scheduler scheduler = Schedulers.newParallel("my-scheduler", 4);

    kafkaReceiver
        .receiveAtmostOnce()
        .log()
        .limitRate(2)
        .parallel()
        .runOn(scheduler)
        .map(m -> SenderRecord.create(workerTask.processMessage(m), m.offset()))
        .as(kafkaSender::send)
        .subscribe();
}

我想实现类似以下情况:

kafkaReceiver
    .receiveAtmostOnce()
    .log()
    .limitRate(2)
    //.parallel()
    //.runOn(scheduler)
    .map(m -> SenderRecord.create(workerTask.processMessage(m), m.offset()))
    .as(kafkaSender::send)
    .subscribe();

然后,我看到对新消息的请求是在先前的计算完成后发送的。

0 个答案:

没有答案