Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将外部源的上下文添加到Kafka流中的记录的正确方法_Java_Apache Kafka_Apache Kafka Streams - Fatal编程技术网

Java 如何将外部源的上下文添加到Kafka流中的记录的正确方法

Java 如何将外部源的上下文添加到Kafka流中的记录的正确方法,java,apache-kafka,apache-kafka-streams,Java,Apache Kafka,Apache Kafka Streams,我有使用处理器API处理Kafka流的记录。假设该记录有city\u id和一些其他字段 在Kafka Streams应用程序中,我想将目标城市的当前温度添加到记录中。 温度系数对存储在例如Postgres中 在Java应用程序中,我可以使用JDBC连接到Postgres,并构建新的HashMap,这样我就可以根据city_id查找温度,比如tempHM.getrecord.city_id 如何最好地实现这一目标,有几个问题: 在哪里启动上下文数据? 最初,我一直在AbstractProcess

我有使用处理器API处理Kafka流的记录。假设该记录有city\u id和一些其他字段

在Kafka Streams应用程序中,我想将目标城市的当前温度添加到记录中。 温度系数对存储在例如Postgres中

在Java应用程序中,我可以使用JDBC连接到Postgres,并构建新的HashMap,这样我就可以根据city_id查找温度,比如tempHM.getrecord.city_id

如何最好地实现这一目标,有几个问题:

在哪里启动上下文数据? 最初,我一直在AbstractProcessor::init中进行此操作,但这似乎是错误的,因为它为每个线程初始化,并且在重新平衡时重新初始化

所以我在streams拓扑构建器和处理器构建之前移动了它。数据只在所有处理器实例上单独获取一次

这是正确和有效的方法。它是有效的,但是

HashMap tempHM=新的HashMap; //连接到数据库并在此处初始化tempHM 拓扑=新拓扑; 拓扑学 .addSourceSOURCE、stringDerializer、protoDeserializer、中的主题 .addProcessorTemperatureAppender.NAME,->new TemperatureAppendertempHm,源 .addSinkSINK、主题输出、stringSerializer、protoSerializer、TemperatureAppender.NAME ; 如何刷新上下文数据? 例如,我想每15分钟刷新一次温度数据。我正在考虑使用Hashmap容器而不是Hashmap,这样可以处理它:

抽象类上下文容器{ T语境; 最后更新日期:; ContextContainerDate现在{ 现在刷新; } 摘要:当前日期无效; 抽象时间间隔; 得不到{ 返回上下文; } 布尔值是现在更新日期{ 返回lastRefreshAt==null ||lastfreshtat.getTime+getrefreshtinterval.toMillis 然后将其传递到处理器,如.addProcessorTemperatureAppender.NAME、->新温度PenderCityTemperatureContextContainer,SOURCE

而在处理器中呢

public void initfinal processor上下文上下文{ 上下文.时间表 持续时间。分钟1, 标点类型.STREAM\u时间, 时间戳->{ cityTemperatureContextContainer.refreshnew Datetimestamp; tempHm=cityTemperatureContextContainer.get; } ; super.initcontext; } 有更好的办法吗?主要的问题是找到合适的概念,然后我就能实现它。不过,关于这个主题的资源并不多

在Kafka Streams应用程序中,我想将目标城市的当前温度添加到记录中。温度系数对存储在例如Postgres中

在Java应用程序中,我可以使用JDBC连接到Postgres,并构建新的HashMap,这样我就可以根据city_id查找温度,比如tempHM.getrecord.city_id

更好的替代方法是使用Kafka Connect将Postgres中的数据摄取到Kafka主题中,使用Kafka Streams将此主题读入应用程序中的一个KTable,然后将此KTable与另一个流(具有city_id的记录流和一些其他字段)连接。也就是说,您将执行一个KStream to KTable join

思考:

### Architecture view

DB (here: Postgres) --Kafka Connect--> Kafka --> Kafka Streams Application


### Data view

Postgres Table ----------------------> Topic --> KTable

用例的示例连接器有和

上面基于Kafka Connect的设置的优点之一是,您不再需要直接从使用Kafka流的Java应用程序与Postgres DB对话

另一个优点是,您不需要每隔15分钟将您提到的上下文数据从DB批量刷新到Java应用程序中,因为应用程序将通过DB->KConnect->Kafka->KStreams应用程序流自动实时获取最新的DB更改

在Kafka Streams应用程序中,我想将目标城市的当前温度添加到记录中。温度系数对存储在例如Postgres中

在Java应用程序中,我可以使用JDBC连接到Postgres,并构建新的HashMap,这样我就可以根据city_id查找温度,比如tempHM.getrecord.city_id

更好的选择是使用Kafka Connect将Postgres中的数据吸收到Kafka主题中,请阅读此顶部 使用Kafka Streams在应用程序中集成到一个KTable中,然后将此KTable与另一个流、具有city_id的记录流和其他一些字段连接起来。也就是说,您将执行一个KStream to KTable join

思考:

### Architecture view

DB (here: Postgres) --Kafka Connect--> Kafka --> Kafka Streams Application


### Data view

Postgres Table ----------------------> Topic --> KTable

用例的示例连接器有和

上面基于Kafka Connect的设置的优点之一是,您不再需要直接从使用Kafka流的Java应用程序与Postgres DB对话


另一个优点是,您不需要每隔15分钟将您提到的上下文数据从数据库批量刷新到Java应用程序中,因为应用程序将通过DB->KConnect->Kafka->KStreams应用程序流自动实时获取最新的DB更改。

所以这里的要点是将我的上下文数据获取到主题,然后将来自主题的数据作为KTable/stream加入流应用程序中。在这种情况下,KTable似乎更合适。如果适用,我可以使用KConnect用数据填充主题,例如支持JDBC的数据库。是吗?是的,完全正确。我相应地更新了答案。您的用例的示例连接器是和。因此,这里的要点是将我的上下文数据获取到一个主题,然后将来自stream app中主题的数据作为KTable/stream进行连接。在这种情况下,KTable似乎更合适。如果适用,我可以使用KConnect用数据填充主题,例如支持JDBC的数据库。是吗?是的,完全正确。我相应地更新了答案。您用例的示例连接器有和。