在我们的ESB项目中,我们有许多路由读取file2
或ftp
协议的文件以进行进一步处理。需要注意的是,我们在本地读取的文件(file2
协议)是通过不同的协议(NFS,SMB)装入的网络共享。
现在,我们面临着比赛条件方面的问题。两台服务器均读取并处理文件。我们通过使用preMove
选项降低了发生这种情况的可能性,但是当两台服务器在同一毫秒内轮询时,有时仍会重复读取。根据文档,idempotentRepository
与readLock=idempotent
一起可以提供帮助,例如使用HazelCast。
但是,我想知道这是否适合我的问题,因为我真的不知道它是否在所有情况下都适用。两台服务器都在几毫秒内读取文件,因此一台服务器已经处理过该文件的信息需要在第二台服务器尝试读取时在HazelCast网格中可用。那可能吗?如果延迟最小(例如与网络相关)会怎样?
除此之外,设置readLock=idempotent
仅适用于file2
,而不适用于ftp
。如何在那里解决那个问题?
再次:该问题通常不是防止复制文件,而仅仅是防止竞争状态。
答案 0 :(得分:1)
AFAIK,幂等存储库应防止出现这种情况,以确保两个使用者都读取相同的文件。
在文件检测和榛树广播中输入之间的等待时间无关紧要,因为文件使用方不会输入他们读取的内容。取而代之的是,他们都向存储库要求排他读取锁定。第一个获胜,第二个被拒绝,因此继续到下一个文件。
如果要最大程度地减少使用者之间发生冲突的可能性,可以打开
shuffle=true
来随机化要使用的文件的顺序。
对于ftp使用者上缺少readLock=idempotent
的问题:您可能只需要一个下载文件的使用者即可构建单独的传输路径。这样,您的文件用户路由就可以处理它们幂等了。