Kubernetes ApacheFlink-作业部署期间重复消息处理,以ActiveMQ作为源
给定, 我有一个Flink作业,它从Kubernetes ApacheFlink-作业部署期间重复消息处理,以ActiveMQ作为源,kubernetes,apache-flink,flink-streaming,flink-cep,flink-sql,Kubernetes,Apache Flink,Flink Streaming,Flink Cep,Flink Sql,给定, 我有一个Flink作业,它从ActiveMQ源代码读取数据并写入mysql数据库,并键入一个标识符。我已为此作业每秒钟启用一次检查点。我将检查点指向一个Minio实例,我验证了检查点是否与jobid一起工作。我将此作业部署为Openshift(下面是Kubernetes)——我可以根据需要放大/缩小此作业 问题 当作业部署(滚动)或作业由于错误/错误而停止时,如果ActiveMQ中存在任何未使用的消息或Flink中存在任何未确认的消息(但写入数据库),则当作业恢复(或部署新作业)时,作业
ActiveMQ
源代码读取数据并写入mysql数据库,并键入一个标识符。我已为此作业每秒钟启用一次检查点。我将检查点指向一个Minio
实例,我验证了检查点是否与jobid
一起工作。我将此作业部署为Openshift(下面是Kubernetes)——我可以根据需要放大/缩小此作业
问题
当作业部署(滚动)或作业由于错误/错误而停止时,如果ActiveMQ中存在任何未使用的消息或Flink中存在任何未确认的消息(但写入数据库),则当作业恢复(或部署新作业)时,作业进程已处理的消息,导致在数据库中插入重复记录
问题
- 检查点不应该帮助作业从原来的位置恢复吗李>
- 在部署新作业之前,我应该先检查一下吗李>
- 如果作业因错误或群集故障而退出,会发生什么情况李>
- 由于
在每次部署时都不断变化,恢复是如何发生的jobid
- 编辑因为我不能期望数据库的幂等性,为了避免重复保存到数据库中(
),我是否可以编写特定于数据库的(只保存一次
)查询,以在给定记录存在时更新,如果不存在则插入upsert
目前,我看不到解决办法。它应该在1.11中进行更改。JDBC目前至少只支持一次,这意味着恢复时会收到重复的消息。目前有一个草案需要添加对它的支持,它可能会与1.11一起发布 检查点不应该帮助作业从原来的位置恢复吗 是的,但最后一次成功检查点和恢复之间的时间可能会产生观察到的重复项。我对一个有点相关的话题做了更详细的阐述 在部署新作业之前,我应该先检查一下吗 当然。实际上,您应该将cancel与savepoint一起使用。这是更改拓扑的唯一可靠方法。此外,使用保存点取消可以避免数据中的任何重复,因为它可以优雅地关闭作业 如果作业因错误或群集故障而退出,会发生什么情况 它应该自动重新启动(取决于您的重新启动设置)。它将使用最新的检查点进行恢复。这肯定会导致重复 由于每次部署时jobid都在不断变化,恢复是如何发生的 通常会显式指向相同的检查点目录(在S3?) 由于我不能期望数据库的幂等性,upsert是实现一次处理的唯一方法吗
目前,我看不到解决办法。它应该在1.11中更改。我对检查点使用相同的S3存储桶,这在部署时不会更改。我看到在新的“jobid”目录下创建和删除了一系列检查点目录。谢谢Heise。另外,1.11的发布计划是什么时候?请你扩展你原来的问题,并提供更多关于“为什么upsert不能工作”的细节。1.11的目标是5月份。我更新了原始问题,这可以理解吗?我使用相同的S3存储桶作为检查点,这在部署时不会改变。我看到在新的“jobid”目录下创建和删除了一系列检查点目录。谢谢Heise。另外,1.11的发布计划是什么时候?请你扩展你原来的问题,并提供更多关于“为什么upsert不能工作”的细节。1.11的目标是5月。我更新了原始问题,这可以理解吗?