Алгоритм распределения нагрузки между SMTP-серверами
В данный момент я решаю задачу по создании системы массовых рассылок почты — не спам, письма будут получать зарегистрированные пользователи, подисавшиеся на рассылку по определенным событиям. Решение должно соответствовать таким требованиям:
1. Предполагаемая нагрузка — около 500 тыс. писем в сутки.
2. Нужно иметь возможность на ходу добавлять новые SMTP-сервера, при этом должен наблюдаться рост производительности рассылки.
Если коротко, выбранное мной решение такое:
Работают два демона (написанные на Python3):
1. Первый демон достает из БД (MongoDB) список адресов получателей, и шаблон письма, и формирует персональные письма («Уважаемый ...») по шаблону. Сформированные письма он добавляет в очередь, организованную на Redis.
2. Второй демон слушает очередь Redis, берет с нее письма, и отдает их SMTP-серверам.
Возможен допил обоих демонов — чтобы они работали в несколько процессов.
У меня есть 2 таких вопроса:
1. Хотелось бы заранее знать, какое звено в этой системе будет самым слабым: я предполагаю, что пропускная способность SMTP-сервера — нужно отдавать письма SMTP-серверам не быстрее, чем они смогут их рассылать.
2. Как правильно распределить нагрузку между SMTP-серверами, чтобы добавление новых серверов приносило реальный прирост производительности.
Буду благодарен за любой совет от компетентного в этом вопросе человека.
1. Кроме пропускной способности SMTP, вам нужно отдельно контролировать лимиты по каждому сервису (mail.ru, rambler.ru, yandex.ru etc) — если будете слишком часто слать на один сервис (несколько писем в минуту), быстро попадаете в фильтры и блек-листы, и никто не посмотрит, белый у вас сайт/рассылка или не очень. Конкретные цифры с лимитами писем для каждого сервиса можете загуглить, я их не знаю, но они есть.
2. Обыкновенный round-robin, т.е. каждый новый добавленный SMTP участвует в кольцевой очереди на отправку очередного письма.
Если же контролируете доставку/прочтение — то можно по каждому SMTP отдельно вести его рейтинг (по доставке писем), и учитывать этот рейтинг при выборе сервера (чем выше доставка — тем больше можно пока что отправить, но не переусердствовать).
Большое спасибо за ответ.
Да, про лимиты по сервисам я знаю, и задаюсь вопросом — как собственно обойти это ограничение. Как например такие большие сервисы типа Facebook или Linkedin шлют письма миллионами и не попадают в блек-листы и фильтры.
Большие сервисы во-первых Return Path Certified,
во-вторых у них высокий Sender Score,
в третьих Transactional Emails очень сильно отличаются от Marketing Emails.
И естественно у них не один SMTP сервер: как правило такие компании сотнями арендуют IP адреса, с которых и ведут свою рассылку.
К тому-же имейте ввиду, что Вам нужно будет построить репутацию для ваших SMTP серверов, как только это сделаете, то можно будет поднять лимиты рассылки.
Не морочьте себе голову с такой сложной архитектурой: с Вашей нагрузкой и один PHP скрипт справится. Ваше бутылочное горлышко — это лимиты рассылки на SMTP серверах