Details
-
Bug
-
Status: Resolved
-
Minor
-
Resolution: Fixed
-
java-chassis-2.1.5
-
None
Description
背景:当前正在使用servicecomb-java-chassis 2.1.5版本,之前使用servicecomb-java-chassis 1.3.1版本,在1.3.1版本中,MicroserviceVersions会定时(30s)触发pullInstances来更新实例缓存,在2.1.5发现仅能通过实例更新事件触发MicroserviceVersions中的缓存更新,如果更新事件丢失,且后续没有实例新的更新事件,缓存一致性无法保证。
现象:实例注册后更新实例属性成功,在其他服务实例中进行服务间调用时指定transactionControl仅调用存在对应属性的服务实例,Load balancer报错无法找到可用实例。
原因分析:MicroserviceVersions在初始化时先进行了pullInstances之后将此microserviceVersions放入versionsByName的map中,在执行pullInstances时如果收到了更新事件,会触发MicroserviceManager里面的全量更新方法,此方法是通过遍历versionsByName中的MicroserviceVersions进行pullInstances的调用,此时之前创建的microserviceVersions未放入versionsByName中,导致丢失此次更新事件,之后缓存无法恢复,服务间调用持续失败。