Apache camel 骆驼文件读取:与2个活动服务器的竞争条件

Apache camel 骆驼文件读取:与2个活动服务器的竞争条件,apache-camel,esb,talend,race-condition,camel-ftp,Apache Camel,Esb,Talend,Race Condition,Camel Ftp,在我们的ESB项目中,我们有很多使用file2或ftp协议读取文件的路由,以便进一步处理。需要注意的是,我们在本地读取的文件(file2protocol)是通过不同协议(NFS、SMB)装载的网络共享 现在,我们面临着与比赛条件有关的问题。两台服务器都读取并处理该文件。我们通过使用preMove选项降低了这种可能性,但当两台服务器以相同的毫秒轮询时,仍会不时出现重复读取。根据文档,一个idempotentRepository与readLock=idempotent结合使用可能会有所帮助,例如Ha

在我们的ESB项目中,我们有很多使用
file2
ftp
协议读取文件的路由,以便进一步处理。需要注意的是,我们在本地读取的文件(
file2
protocol)是通过不同协议(NFS、SMB)装载的网络共享

现在,我们面临着与比赛条件有关的问题。两台服务器都读取并处理该文件。我们通过使用
preMove
选项降低了这种可能性,但当两台服务器以相同的毫秒轮询时,仍会不时出现重复读取。根据文档,一个
idempotentRepository
readLock=idempotent
结合使用可能会有所帮助,例如HazelCast

然而,我想知道这是否是一个适合我的问题的解决方案,因为我真的不知道它是否在所有情况下都有效。两台服务器都在毫秒内读取文件,因此当第二台服务器尝试读取时,一台服务器已处理该文件的信息需要在HazelCast网格中可用。可能吗?如果存在最小的延迟(例如与网络相关的延迟),会发生什么情况

除此之外,设置
readLock=idempotent
仅适用于
file2
,而不适用于
ftp
。如何解决这个问题呢


再次强调:一般来说,问题不在于防止重复文件,而在于防止竞争条件

AFAIK幂等存储库应该防止在您的情况下两个使用者读取相同的文件

检测到文件和hazelcast中的条目之间的延迟不相关,因为文件使用者不输入他们读取的内容。相反,它们都向存储库请求独占读锁。第一个文件获胜,第二个文件被拒绝,因此它将继续处理下一个文件

如果希望最小化使用者之间冲突的可能性,可以启用
shuffle=true
以随机排列要使用的文件顺序


对于ftp使用者上缺少
readLock=idempotent
的问题:您可能可以构建一个单独的传输路由,其中只有一个使用者下载文件。然后您的文件使用者路由可以将它们处理为幂等

AFAIK幂等存储库应该防止在您的情况下两个使用者读取相同的文件

检测到文件和hazelcast中的条目之间的延迟不相关,因为文件使用者不输入他们读取的内容。相反,它们都向存储库请求独占读锁。第一个文件获胜,第二个文件被拒绝,因此它将继续处理下一个文件

如果希望最小化使用者之间冲突的可能性,可以启用
shuffle=true
以随机排列要使用的文件顺序


对于ftp使用者上缺少
readLock=idempotent
的问题:您可能可以构建一个单独的传输路由,其中只有一个使用者下载文件。然后您的文件使用者路由可以将它们处理为幂等

谢谢,听起来不错。我仍然无法想象hazelcast如何确保只有一台服务器添加读锁。我可以将其与两台服务器尝试添加具有相同主键的记录的数据库表进行比较吗?只有一台服务器将成功,另一台服务器将获得唯一的约束冲突异常-即使它们尝试在同一毫秒内插入?我不知道确切的内部结构,但举个例子说,
此实现保证在集群范围内不会对任何消息进行两次处理。
如果您想知道确切的工作方式,查看代码。一个起点是谢谢,听起来不错。我仍然无法想象hazelcast如何确保只有一台服务器添加读锁。我可以将其与两台服务器尝试添加具有相同主键的记录的数据库表进行比较吗?只有一台服务器将成功,另一台服务器将获得唯一的约束冲突异常-即使它们尝试在同一毫秒内插入?我不知道确切的内部结构,但举个例子说,
此实现保证在集群范围内不会对任何消息进行两次处理。
如果您想知道确切的工作方式,查看代码。一个起点是