Skip to content

MicroserviceVersions存在并发问题 #3624

@yhs0092

Description

@yhs0092

测试版本

2.8.2

问题原理分析

问题出在 org.apache.servicecomb.registry.consumer.MicroserviceVersions#setInstances 方法中:

      versions.forEach((key, value) -> value.setInstances(new ArrayList<>()));  // 步骤1, 将 MicroserviceVersion 内的实例列表置空
      for (Entry<String, List<MicroserviceInstance>> entry : mergedInstances.microserviceIdMap.entrySet()) {
        // always update microservice versions, because we allow microservice info override, like schema info
        MicroserviceVersion newVersion = createMicroserviceVersion(entry.getKey(), entry.getValue());
        newVersion.setInstances(entry.getValue());
        versions.put(entry.getKey(), newVersion);  // 步骤2, 用新 MicroserviceVersion 替换旧的空 MicroserviceVersion
      }

如上述代码片段, 步骤1和步骤2之间, 其他执行微服务调用逻辑的线程从 MicroserviceVersions 中拿到的 MicroserviceVersion 是空的, 这会影响org.apache.servicecomb.core.registry.discovery.OperationInstancesDiscoveryFilter#sortedMicroserviceVersion方法的逻辑, 导致OperationInstancesDiscoveryFilter返回的可用实例列表为空, 业务微服务调用报错.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions