ogregor
@ogregor
арендатор vpn сервера debian

Что лучше возвращать из SQL запроса в Golang массив или канал?

Здравствуйте изучаю возможности работы с Golang. В частности есть вопрос относительно того, что производительнее в задаче получения данных из БД и отправки их по SMTP серверу, так как записей может быть несколько сотен тысяч

1) SQL -> канал структур -> go рутина отправка по SMTP (одно письмо - одна горутина)
2) SQL -> массив структур -> формирование пачки -> go рутина отправка по SMTP (пачка писем одна горутина)

Был бы очень признателен за развернутый совет.
  • Вопрос задан
  • 143 просмотра
Решения вопроса 2
Не пойму преимущества от второго метода - лишь сложности по формированию пачек.

  • От SQL нужно получить полный набор данных - массив структур
  • Создать два канала - для отправки структур на обработку и получение результата обработки
  • Создать фиксированное число горутин-воркеров (вас быстро посчитают спамером, если вы в свои несколько сотен тысяч потоков посылать письма будете), слушающих канал со структурами, отправляющие данные по SMTP и рапортующие результаты в обратный канал
  • Циклом for наскармливать в канал массив структур.


Вот простой пример описывающий такой тип задач https://gobyexample.ru/worker-pools.html
Если данных действительно слишком много для получения одним запросом, придется использовать курсор.
Ответ написан
@PapaStifflera
Родился, вырос...
Банальная очередь. Хотите in-process, хотите отдельный сервер (NAST, RabbitMQ etc.).
Из SQL пишете в очередь, из горутины читаете и обрабатываете как хотите. В случае отдельно стоящего сервера получите еще и масштабируемость.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы