所以,问题是关于在过滤器,地图等流函数内部使用外部状态存储的安全性。
可以这样做吗?
JedisPool pool = ...;
KStream stream = ...;
stream.map((k, v) -> {
JedisClient client = pool.getResource();
....
client.close();
});
...
KafkaStreams streams = ...;
是否由于在多个流任务中使用单个池而导致错误?
在apache flink中,我可以使用Rich*Function<>
,在其中open
方法中,我只能将连接池配置到任何存储。在Apache Spark中,我还可以配置全局连接。我是否需要使用kafka流执行相同的操作?
答案 0 :(得分:2)
等效于Rich*Function
的方法是使用transform()
而不是map()
,它允许您init()
和close()
使用Transformer
。
即使您可能想try-catch
以确保执行close()
,您的方法也应该起作用。但是,这不是推荐的模式。
根据您的用例,最好将Redis中的数据加载到Kafka主题(不确定是否有Redis连接器)中,然后将数据加载到KTable中。您可以执行流表联接来代替map()
或transform()
。
答案 1 :(得分:-1)
不建议将Redis用于Spring Cloud Stream的生产中-活页夹功能不完全,可能导致消息丢失。