Войти Регистрация
Конкурентность

10. Рассылка SMS с ограничением параллельности

Средняя

Go · 34 строк

Рассылка уходит на 2 млн абонентов. SMS-шлюз держит не больше 20 параллельных запросов и при перегрузке отвечает ошибкой. Broadcast возвращает число отправленных SMS для отчёта.

Отметьте строки с ошибками.

В работе: Сервис массовых SMS-рассылок для абонентов.

Как проверяем Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Плюс 1 вопрос про поведение программы — на зачёт не влияют. Ответ один на подход: после него показываем разбор.
семафор на каналегонкагорутиныограничение нагрузки

Источник: на задачах МТС: SMS-рассылки абонентам. Условие пересказано своими словами.

Давали на собеседовании? Ответов пока мало — ваш поможет.
  1. package sms
  2. import (
  3. "context"
  4. "log"
  5. "sync"
  6. )
  7. type Gateway interface {
  8. Send(ctx context.Context, phone, text string) error
  9. }
  10. // Broadcast рассылает SMS, к шлюзу не больше 20 параллельных запросов.
  11. func Broadcast(ctx context.Context, gw Gateway, phones []string, text string) int {
  12. sem := make(chan struct{}, 20)
  13. var wg sync.WaitGroup
  14. sent := 0
  15. for _, phone := range phones {
  16. wg.Add(1)
  17. go func() {
  18. defer wg.Done()
  19. sem <- struct{}{}
  20. if err := gw.Send(ctx, phone, text); err != nil {
  21. log.Printf("sms %s: %v", phone, err)
  22. return
  23. }
  24. <-sem
  25. sent++
  26. }()
  27. }
  28. wg.Wait()
  29. return sent
  30. }