Sobes.tech
Назад к вопросам
Middle+
7

Доработай решение для топ-10 по каждому namespace с учётом того, что сервисы могут быть в разных кластерах, но в одном namespace (нужно объединять)

Компании, где спрашивали
X5 groupX5 group

Ответ от нейросети

sobes.tech AI

Если сервисы могут быть в разных кластерах, но принадлежат одному namespace, то для топ-10 по каждому namespace нужно агрегировать данные по namespace, объединяя результаты из всех кластеров.

Подход:

  1. Собрать метрики или данные по сервисам из всех кластеров.
  2. Объединить данные по ключу namespace.
  3. Для каждого namespace объединить все сервисы из разных кластеров.
  4. Отсортировать сервисы по нужному критерию (например, по нагрузке) и выбрать топ-10.

Пример на Go (упрощённо):

type ServiceData struct {
    Namespace string
    Service   string
    Metric    int
}

// servicesFromClusters — срез данных из разных кластеров
func Top10ByNamespace(servicesFromClusters [][]ServiceData) map[string][]ServiceData {
    combined := make(map[string][]ServiceData)

    // Объединяем данные по namespace
    for _, clusterData := range servicesFromClusters {
        for _, svc := range clusterData {
            combined[svc.Namespace] = append(combined[svc.Namespace], svc)
        }
    }

    result := make(map[string][]ServiceData)
    for ns, svcs := range combined {
        // Сортируем по метрике по убыванию
        sort.Slice(svcs, func(i, j int) bool {
            return svcs[i].Metric > svcs[j].Metric
        })
        // Берём топ-10
        limit := 10
        if len(svcs) < 10 {
            limit = len(svcs)
        }
        result[ns] = svcs[:limit]
    }

    return result
}

Такой подход позволяет агрегировать и ранжировать сервисы по namespace, независимо от того, в каких кластерах они находятся.