New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Naming Redo 任务存在影响最终一致性的问题 #9816
Comments
代码里面可以分析出 redo 任务的执行是周期性的,并不是由于连接断开等异常情况触发的。因此,在 redo 任务执行的过程中如果有其他指令正在正常执行,会导致回放的问题。如果其他指令执行之后马上又对状态进行修改,会被回放的指令所覆盖。 |
可能的解决方案:
|
redo是修正断线重连后状态的任务,断链只会修改状态,redo再根据状态判断是否执行重新注册或订阅的任务。 执行注册和注销应该最后也会修改这个状态,具体问题可能要排查一下,不能简单进行加锁。 另外版本号并不能解决问题,版本号和现在的状态是一样的,并发修改会导致执行前后顺序问题。 |
实例 A 和 B 的 serviceName、ip、port 信息一致,我理解在客户端的视角看来这就是同一个实例吧,那这个问题的本质其实是两个线程同时对一个实例进行操作,一个注册,一个反注册,最终状态由后完成的线程决定,我理解这里应该没啥问题。 不考虑批量注册的时候,redoData的key就是serviceName+groupName,nacos-client的注册和反注册接口也没有对instance进行判重,参数传进去就忠实操作。同一个 namingService 对象操作同一个instance,自然是哪个操作在后面生效就以哪个操作为终态。 |
最终一致性没问题,但是指令有序性在某个瞬间会有问题的。如果A和B的服务信息,ip,port都一样,那在A已经注册的情况下,又对A做反注册,然后又并发对B做注册,那B注册的结果可能会被A给覆盖,在这一时候查询拿到的结果就是错的。但是因为A反注册的没有Redo任务,而B的注册redo一直在,B会被重新注册上去。所以从整体来看,最终一致性没问题。但是,在A刚反注册B刚注册那会,可能会有问题 |
这是来自QQ邮箱的假期自动回复邮件。
您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。
|
这里两个问题 |
又反复看了几遍代码,我觉得在这样一个场景下还真的可能存在问题: @KomachiSion 大佬有空看看这个场景吗? |
) * [ISSUE #9816] check expected final state before remove redo data. * check expected final state before remove subscriber redo data. * update NamingGrpcRedoServiceTest when test remove * update NamingGrpcRedoService, set expect register status to false when subscribers deregister
Describe the bug
com.alibaba.nacos.client.naming.remote.gprc.redo.RedoScheduledTask
任务在反注册后马上注册时,对反注册任务 redo 会导致注册的实例失效。Expected behavior
按照指令提交的时序保证最终一致性。
Actually behavior
redo 任务导致后提交的指令失效
How to Reproduce
Steps to reproduce the behavior:
实例 A 和 B 的 serviceName、ip、port 信息一致
在反注册实例 A 成功之前
com.alibaba.nacos.client.naming.remote.gprc.redo.RedoScheduledTask
扫描到对应任务执行 redo,但是在执行 redo 成功之前,主线程先注册了实例 B。最终 redo 任务的结果会覆盖注册实例 B 的信息。Desktop (please complete the following information):
Additional context
对应 Dubbo 的测试任务:https://pipelines.actions.githubusercontent.com/serviceHosts/7adf70df-6981-4a3e-aa1b-09d8698255ce/_apis/pipelines/1/runs/4020/signedlogcontent/23?urlExpires=2023-01-08T13%3A05%3A15.4375164Z&urlSigningMethod=HMACV1&urlSignature=Pzbubkz7lP9ljHqs6QlzKZm36icBGDVb5toAcDx5%2FPs%3D
关键日志如下:
以下是测试反注册时使用的 instance metadata 不一致是否会成功反注册:
The text was updated successfully, but these errors were encountered: