Реализуйте QueryReplicas, который шлёт запрос параллельно во все реплики.
Как только первая реплика вернула успех — остальные отменяются через ctx,
и возвращается её результат.
Правила:
- На основе
ctx создаётся производный отменяемый контекст; он передаётся
всем репликам.
- Все реплики стартуют одновременно.
- Первый успех «выигрывает»: его результат возвращается, остальные отменяются
через
cancel().
- Если все реплики завершились ошибкой — возвращается ошибка.
// QueryReplicas шлёт запрос параллельно во все реплики; как только ПЕРВАЯ
// вернула успех — отменяет остальные через ctx и возвращает её результат.
func QueryReplicas(ctx context.Context, replicas []func(ctx context.Context) (string, error)) (string, error) {
// Ваша реализация
}
Подсказка: ctx, cancel := context.WithCancel(ctx), defer cancel(),
буферизованный канал результатов размером len(replicas), по первому успеху —
cancel() и возврат; считайте ошибки, чтобы понять, что упали все.
На что смотрит интервьюер:
- Производный
WithCancel-контекст, передаётся всем репликам.
- Параллельный запуск и отмена остальных по первому успеху (
defer cancel()).
- Буферизованный канал результатов — нет утечки горутин.
- Корректная обработка случая, когда все реплики упали.