AlexStocks opened a new issue, #3570:
URL: https://github.com/apache/dubbo-go/issues/3570
## 问题描述
`registry/servicediscovery/service_discovery_registry.go` 的
`RegisterService()`(L103–139)在遍历 `metaInfo.GetExportedServiceURLs()` 的循环里,**对每个
URL 都调用一次 `s.metadataReport.PublishAppMetadata(metaInfo.App, metaInfo.Revision,
metaInfo)`**(L117):
```go
for _, url := range urls {
instance := createInstance(metaInfo, url, registryId)
metaInfo.Revision =
instance.GetMetadata()[constant.ExportedServicesRevisionPropertyName]
if metadata.GetMetadataType() == constant.RemoteMetadataStorageType {
...
err := s.metadataReport.PublishAppMetadata(metaInfo.App,
metaInfo.Revision, metaInfo) // L117 每 URL 全量写
...
}
err := s.serviceDiscovery.Register(instance)
...
}
```
由于 key 是 `app + revision`,每次发布的内容都是**相同的全量 metaInfo**(包含全部 exported
URLs)。若应用导出 N 个服务,则向 metadata 中心发起 **N 次全量写**,每次 payload 都是整个 metaInfo。
## 影响
- provider 启动时对后端(ZK/etcd/Nacos)写入放大 N 倍;
- 网络流量与延迟随导出服务数线性增长;
- metadata 中心压力上升。
## 建议修复
将 `PublishAppMetadata` 移出 `for _, url := range urls` 循环,在循环结束后(所有 instance
都已 `Register` 完成)**只发布一次**全量 metaInfo 即可。revision 在循环内已更新,单次发布即为最新状态。
## 参考
- `registry/servicediscovery/service_discovery_registry.go` L109–121(循环体内
L117 的发布)
- 接口 `MetadataReport.PublishAppMetadata`:`metadata/report/report.go` L55
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]