我正在将kafka流用于某些应用程序。
流如下所示
kafkaProducer---->StreamerConsumer1->finalCosumer
我有一个生产者,可以非常快速地写入数据,并且我的StreamConsumer会将每个流映射到某个进程,并将该流转发到其他主题。
在StreamCosumer映射中,我添加了自己的映射器函数,该函数实际上试图保留其相关数据,如下所示
public void checkRecord(T1 key, T2 value) {
switch(T1.toString()){
case "key1":
//Get relavant fileds from value and perisit in db
break;
case "key2":
//Get relavant fileds from value and perisit in db
break;
}
}
KStream<String, KafkaStatusRecordWrapper> pDStream[] = myStream.map(this::checkRecord).branch((key, value)-> value.isSuccess(),(key, value)-> !value.isSuccess());
pDStream[0].mapValues(value -> transformer(value)).to("other_topic",Produced.with(stringSerde, stringSerde));
现在,我的checkRecord记录使用者函数是单线程的,几乎要花300毫秒(由于某些业务逻辑和数据库的持久性,我无法避免)返回。
由于下面的限制,并且由于以下限制,我无法增加分区数量
More Partitions Requires More Open File Handles
More Partitions May Increase Unavailability
More Partitions May Increase End-to-end Latency
所以我打算编写多线程流使用者。
但是我担心以下几点。
那么如何增加吞吐量?
我的消费者有足够的资源,仅使用了40%的资源。
答案 0 :(得分:1)
您可以设置流配置num.stream.threads
来配置线程数。最大值可以是最大分区数。它有助于提高应用程序实例的并行性。
如果您的主题有4个分区,则可以设置以下内容:
properties.set("num.stream.threads",4);