我有一个项目,需要订阅与数据库中注册的任务相关的特定主题。每个任务都与一个主题相关,并且可以执行根据任务元数据描述的特定转换。这些任务可以由另一个系统注册,更新或禁用,并且flink作业必须反映这些更改,而无需重新启动该作业。
基于此,我尝试了类似https://flink.apache.org/news/2020/03/24/demo-fraud-detection-2.html的操作,其中有两个源函数,一个以间隔方式获取任务的数据库,另一个使用模式和自定义反序列化器订阅主题(以获取主题)。名称)。
然后,一个CoProcessFunction负责连接来自任务源和Kafka源的数据,并保留与每个主题相关的任务列表(每次任务源从数据库获取数据时都会刷新该列表)。之后,应用转换并将转换后的数据保存在特定系统上。
此设计的问题是我只能有一个使用者组ID,因此,如果我没有与名为“ foo”的某个主题相关的任务,则“ foo”中的数据将不断出现,偏移量将被更新。如果将来我注册一个任务来使用“ foo”做某事,那么该任务将不会处理该主题中的历史数据。
我是否可以实现自定义的kafka,该kafka扩展了FlinkKafkaConsumer以便从数据库中获取那些任务,然后开始消耗与该任务本身提供的使用者组ID相关的任务主题?
任务需要每N分钟刷新一次,以更改外部系统提供的任务列表。
我也愿意接受其他想法的建议。
答案 0 :(得分:1)
对我来说,听起来您的所有工作都是完全独立的。您希望每个作业自己使用其数据(使用kafka使用者组),以便同一kafka主题上的三个作业也可以接收该数据三次。您可能还希望,如果某些作业很慢,其他作业不会在处理中受阻。
因此,我的建议是:启动单个flink会话,但独立地在其中部署作业。您将需要构建一种部署组件/脚本,以从任务源接收任务并启动或停止作业。
每个作业都可以配置为具有专用的kafka使用者组ID,并且可以配置为在检查点上提交到该组。在下一次重新启动时,您可以从状态(最后一个作业从保存点退出的状态)开始,也可以不提供检查点/保存点并告诉它从已提交的组ID偏移量开始。