tianxiaoliang commented on a change in pull request #1133:
URL:
https://github.com/apache/servicecomb-service-center/pull/1133#discussion_r688272564
##########
File path: datasource/etcd/ops.go
##########
@@ -86,3 +102,105 @@ func (ds *MetadataManager) getGlobalInstanceCount(ctx
context.Context, domainPro
}
return global, nil
}
+
+func (ds *MetadataManager) RotateMicroservice(ctx context.Context,
reserveVersionCount int) error {
+ key := path.GetServiceIndexRootKey("")
+ indexesResp, err := sd.ServiceIndex().Search(ctx,
etcdadpt.WithStrKey(key), etcdadpt.WithPrefix())
+ if err != nil {
+ log.Error("query all microservices indexes failed", err)
+ return err
+ }
+ serviceIDKeys := GetOldServiceIDs(indexesResp, reserveVersionCount)
+ if len(serviceIDKeys) == 0 {
+ return nil
+ }
+ serviceIDKeys = FilterUnused(ctx, serviceIDKeys)
+ if len(serviceIDKeys) == 0 {
+ return nil
+ }
+
+ log.Warn(fmt.Sprintf("start rotate %d microservices",
len(serviceIDKeys)))
+ n := UnregisterManyService(ctx, serviceIDKeys)
+ if n > 0 {
+ log.Warn(fmt.Sprintf("%d microservices rotated", n))
+ }
+ return nil
+}
+
+func FilterUnused(ctx context.Context, serviceIDKeys []*RotateServiceIDKey)
[]*RotateServiceIDKey {
+ matched := make([]*RotateServiceIDKey, 0, len(serviceIDKeys))
+ for _, serviceIDKey := range serviceIDKeys {
+ serviceID := serviceIDKey.ServiceID
+ instanceKey :=
path.GenerateInstanceKey(serviceIDKey.DomainProject, serviceID, "")
+ resp, err := sd.Instance().Search(ctx,
etcdadpt.WithStrKey(instanceKey),
+ etcdadpt.WithPrefix(), etcdadpt.WithCountOnly())
+ if err != nil {
+ log.Error(fmt.Sprintf("count microservice %s instance
failed", serviceID), err)
+ continue
+ }
+ if resp.Count > 0 {
+ continue
+ }
+ matched = append(matched, serviceIDKey)
+ }
+ return matched
+}
+
+func UnregisterManyService(ctx context.Context, serviceIDKeys
[]*RotateServiceIDKey) (deleted int64) {
+ pool :=
goutil.New(gopool.Configure().WithContext(ctx).Workers(poolSizeOfRotation))
+ defer pool.Done()
+
+ for _, key := range serviceIDKeys {
+ domainProject := key.DomainProject
+ serviceID := key.ServiceID
+ pool.Do(func(ctx context.Context) {
+ resp, err :=
datasource.GetMetadataManager().UnregisterService(util.SetDomainProjectString(ctx,
domainProject),
+ &pb.DeleteServiceRequest{ServiceId: serviceID})
+ if err == nil && resp.Response.IsSucceed() {
+ atomic.AddInt64(&deleted, 1)
+ }
+ })
+ }
+ return
+}
+
+func GetOldServiceIDs(indexesResp *kvstore.Response, reserveVersionCount int)
[]*RotateServiceIDKey {
+ total := indexesResp.Count
+ if total == 0 {
+ return nil
+ }
+ var (
+ counter = make(map[string]int, total)
+ matched = make(map[string]*pb.MicroServiceKey)
+ serviceVersionMap = make(map[string][]*kvstore.KeyValue, total)
+ )
+ for _, kv := range indexesResp.Kvs {
+ serviceVersionKey := path.GetInfoFromSvcIndexKV(kv.Key)
+ serviceVersionKey.Version = ""
+ serviceKey := path.GenerateServiceIndexKey(serviceVersionKey)
+ count := counter[serviceKey]
+ count++
Review comment:
可不可以第一次遍历的时候就完成版本大小对比并加入到裁剪map种
算法大致是:
一定保留最新的n个版本,并且不管实例有没有
--
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]