codefest 2012. Сас А. — Как слать 100М писем каждый день

54
Как слать 100М писем каждый день (и спать спокойно) Сас Андрей, Badoo

Upload: codefest

Post on 28-Nov-2014

1.090 views

Category:

Documents


3 download

DESCRIPTION

 

TRANSCRIPT

Page 1: CodeFest 2012. Сас А. — Как слать 100М писем каждый день

Как слать 100М писем каждый день (и спать спокойно)

Сас Андрей,Badoo

Page 2: CodeFest 2012. Сас А. — Как слать 100М писем каждый день

А кто говорит?

Page 3: CodeFest 2012. Сас А. — Как слать 100М писем каждый день

А кто говорит?

Я:

•руковожу развитием почтовой рассылки, могу знать не все детали;

Page 4: CodeFest 2012. Сас А. — Как слать 100М писем каждый день

А кто говорит?

Я:

•руковожу развитием почтовой рассылки, могу знать не все детали;

•не админ (извините!).

Page 5: CodeFest 2012. Сас А. — Как слать 100М писем каждый день

А кто говорит?

Я:

•руковожу развитием почтовой рассылки, могу знать не все детали;

•не админ (извините!).

Хвастаюсь:

•год без пролёжек почтовой инфраструктуры;

Page 6: CodeFest 2012. Сас А. — Как слать 100М писем каждый день

А кто говорит?

Я:

•руковожу развитием почтовой рассылки, могу знать не все детали;

•не админ (извините!).

Хвастаюсь:

•год без пролёжек почтовой инфраструктуры;

•97% доставки в инбокс;

Page 7: CodeFest 2012. Сас А. — Как слать 100М писем каждый день

А кто говорит?

Я:

•руковожу развитием почтовой рассылки, могу знать не все детали;

•не админ (извините!).

Хвастаюсь:

•год без пролёжек почтовой инфраструктуры;

•97% доставки в инбокс;

•среднее время доставки почты – 25 с.

Page 8: CodeFest 2012. Сас А. — Как слать 100М писем каждый день
Page 9: CodeFest 2012. Сас А. — Как слать 100М писем каждый день

О чём буду рассказывать?

Page 10: CodeFest 2012. Сас А. — Как слать 100М писем каждый день

О чём буду рассказывать?

А как люди отправляют почту?

Page 11: CodeFest 2012. Сас А. — Как слать 100М писем каждый день
Page 12: CodeFest 2012. Сас А. — Как слать 100М писем каждый день

О чём буду рассказывать?

Как отправлять много-много писем,

быть уверенным в себе

и спать по ночам спокойно

Page 13: CodeFest 2012. Сас А. — Как слать 100М писем каждый день

Бизнес-задачи

1. Предоставить прозрачный API программистам.

2. Обеспечить отправку почты в объёмах до 100М писем в день.

3. Обеспечить доставку почты в инбоксы в 95%+ случаев.

Page 14: CodeFest 2012. Сас А. — Как слать 100М писем каждый день

О чём НЕ буду рассказывать?

Как сделать так, чтобы ваши письма не попадали в Spam

Page 15: CodeFest 2012. Сас А. — Как слать 100М писем каждый день

А что в этом сложного?

Казалось бы:

•поднял MTA

•сделал mail()

•...

•PROFIT!

Page 16: CodeFest 2012. Сас А. — Как слать 100М писем каждый день

А что в этом сложного?

Казалось бы:

•поднял MTA

•сделал mail()

Однако:

•отправка 1 письма = обработка 1 динамического хита

Page 17: CodeFest 2012. Сас А. — Как слать 100М писем каждый день

А что в этом сложного?

Казалось бы:

•поднял MTA

•сделал mail()

Однако:

•отправка 1 письма = обработка 1 динамического хита

•а ведь письма ещё нужно сгенерить

Page 18: CodeFest 2012. Сас А. — Как слать 100М писем каждый день

А что в этом сложного?

Казалось бы:

•поднял MTA

•сделал mail()

Однако:

•отправка 1 письма = обработка 1 динамического хита

•а ведь письма ещё нужно сгенерить

•смелость пойти и узнать правду!!1111

Page 19: CodeFest 2012. Сас А. — Как слать 100М писем каждый день

Откуда взялась цифра 100М?

• 50М – каждый день

• 70М – в пике

• 100М – просто красивая цифра

• 150М – «пасаны ваще ребята. молодцы, могёте!»

Page 20: CodeFest 2012. Сас А. — Как слать 100М писем каждый день

Особенности больших проектов

Наши мантры:

• нужно отправлять письма асинхронно

Page 21: CodeFest 2012. Сас А. — Как слать 100М писем каждый день

Особенности больших проектов

Наши мантры:

• нужно отправлять письма асинхронно

• по-настоящему (вдвойне) асинхронно!

Page 22: CodeFest 2012. Сас А. — Как слать 100М писем каждый день

Особенности больших проектов

Наши мантры:

• нужно отправлять письма асинхронно

• по-настоящему (вдвойне) асинхронно!

• требуется балансировка между серверами

Page 23: CodeFest 2012. Сас А. — Как слать 100М писем каждый день

Порядок отправки письма

1.Появляется необходимость создать письмо.

2.Постановка в очередь на создание письма.

3.Генерация письма по задачам из очереди на создание.

4.Постановка в очередь на отправку.

5.Отсылка письма из очереди на отправку.

Page 24: CodeFest 2012. Сас А. — Как слать 100М писем каждый день

Очередь на отправку

Наша реализация – на файлах. Преимущества:

1.Возможна работа без внешних сервисов.

2.Простота манипулирования письмами.

3.Легко получить статистику / логи.

4.Просто реализуются многократные попытки отправки.

Page 25: CodeFest 2012. Сас А. — Как слать 100М писем каждый день

SSMTP вместо sendmail

Это SMTP-клиент, эмулирующий работу sendmail.

Нам он нравится, т.к.:

•ничего лишнего, только отсылает письмо в MTA (hub)

•супер простой конфиг

•мы его слегка допилили (таймауты + параметры)

Page 26: CodeFest 2012. Сас А. — Как слать 100М писем каждый день

Балансировка между MTA

Первая версия – на базе железки F5 LTM:

•weighted round robin

•SMTP мониторинг

Текущая реализация – скрипты на PHP + мониторинг от F5 LTM:

•автоматическое управление всей балансировкой

•красивый веб-интерфейс

•скрипач (админ) не нужен!

Page 27: CodeFest 2012. Сас А. — Как слать 100М писем каждый день

Автоматизация при отправке

Хорошее место, чтобы делать добрые дела:

•подстановку мониторинговых параметров в ссылки

•подстановку картинок для мониторинга открытий

•проверку целостности и корректности письма

•подстановку технических заголовков

•и даже проверку работоспособности ссылок!

Page 28: CodeFest 2012. Сас А. — Как слать 100М писем каждый день

Железо почтового кластера

Page 29: CodeFest 2012. Сас А. — Как слать 100М писем каждый день

Как тюнить MTA?

• оптимизировать файловую систему

• увеличить число SMTP воркеров

• увеличить число DNS воркеров

• поставить локальный кэшер DNS-запросов

• раскладывать очередь по большому числу директорий

• увеличить лимиты на число соединений к одному MX серверу

• выставить лимиты на число писем в сессии

Page 30: CodeFest 2012. Сас А. — Как слать 100М писем каждый день

Наши MTA

Исторически – Communigate Pro:

•надёжный

•ОЧЕНЬ быстрый

Для «проблемных» почтовых сервисов – Postfix:

•более конфигурируемый

•есть возможность доработать напильником

Page 31: CodeFest 2012. Сас А. — Как слать 100М писем каждый день

Хм, Communigate Pro?..

Но ведь есть Postfix, Exim,

Hurricane, Message Systems, Zrinity

и даже Exchange!

Page 32: CodeFest 2012. Сас А. — Как слать 100М писем каждый день

Корпоративный комбайн

•Email – первоначальный, основной продукт

•Calendaring

•VoIP

•IM

•File storage

•IP PBX

•Presence

Page 33: CodeFest 2012. Сас А. — Как слать 100М писем каждый день

А кто им пользуется?

Page 34: CodeFest 2012. Сас А. — Как слать 100М писем каждый день

Однако, цифры

На старой машине с 1 диском SCSI 10k:

•5 миллионов писем в сутки

•до 100 писем в секунду в пике

Page 35: CodeFest 2012. Сас А. — Как слать 100М писем каждый день

Общее ощущение

+ чрезвычайно стабилен, вплоть до LA = 200 и очереди в 1М писем

+ высокая производительность отправки писем

+ не требователен к памяти и CPU

+ достаточно настроек для большинства проектов

* платный

– нет возможности менять настройки для разных почтовиков

– нет возможности допилить самим

– проблемы с выводом некоторых видов статистики

Page 36: CodeFest 2012. Сас А. — Как слать 100М писем каждый день

Статистика и мониторинг

Пока не измеряешь – не контролируешь.

Что было в начале?

•графики по числу писем в очереди на каждом почтовике

•сколько каких писем отправили за сутки

•статистика по LA / CPU usage / Memory usage в Zabbix

Page 37: CodeFest 2012. Сас А. — Как слать 100М писем каждый день
Page 38: CodeFest 2012. Сас А. — Как слать 100М писем каждый день

Чего не хватало больше всего?

• число файлов, ожидающих отправки в MTA

• число ошибок отправки писем в MTA

• среднее время отправки письма в MTA

• самые загруженные отправкой почты скриптовые машины

• среднее время доставки почты в отдельный почтовый сервис

Page 39: CodeFest 2012. Сас А. — Как слать 100М писем каждый день

Как реализовали?

Число файлов, ожидающих отправки в MTA:

• просто считаем файлы!

Число ошибок отправки в MTA:

• просто считаем файлы!

Самые загруженные отправкой почты скриптовые машины:

• лог в MySQL

Page 40: CodeFest 2012. Сас А. — Как слать 100М писем каждый день

Как реализовали?

Среднее время отправки в MTA:

• PINBA – наш собственный сервис мониторинга

Среднее время доставки почты в отдельный почтовый сервис:

• парсим логи MTA

• хитрая агрегационная структура (highload!!1111)

Page 41: CodeFest 2012. Сас А. — Как слать 100М писем каждый день
Page 42: CodeFest 2012. Сас А. — Как слать 100М писем каждый день
Page 43: CodeFest 2012. Сас А. — Как слать 100М писем каждый день
Page 44: CodeFest 2012. Сас А. — Как слать 100М писем каждый день
Page 45: CodeFest 2012. Сас А. — Как слать 100М писем каждый день
Page 46: CodeFest 2012. Сас А. — Как слать 100М писем каждый день
Page 47: CodeFest 2012. Сас А. — Как слать 100М писем каждый день

Зачем так много?

Page 48: CodeFest 2012. Сас А. — Как слать 100М писем каждый день

Dashboard нас спасёт?

1. Несколько dashboard’ов.

2. Даже dashboard’ы стали слишком сложными.

3. Детектировать аномалии даже на менее значимых графиках автоматически.

Page 49: CodeFest 2012. Сас А. — Как слать 100М писем каждый день

1984

Page 50: CodeFest 2012. Сас А. — Как слать 100М писем каждый день

Выводы

1. Быть гуру не надо, достаточно хотеть разобраться.

2. Правильная архитектура без мониторинга не спасёт.

3. Внезапно: отправка почты – тоже highload!

4. …

5. PROFIT!!!

Page 51: CodeFest 2012. Сас А. — Как слать 100М писем каждый день

Ваши вопросы *

* Кроме вопросов о том, как мы доставляемся в Inbox

Page 52: CodeFest 2012. Сас А. — Как слать 100М писем каждый день
Page 53: CodeFest 2012. Сас А. — Как слать 100М писем каждый день
Page 54: CodeFest 2012. Сас А. — Как слать 100М писем каждый день