В Яндексе есть сервис для добросовестных отправителей писем — Почтовое отделение .
(Для недобросовестных у нас на Почте Антиспам И Кнопка «Отписаться» .
) С его помощью они смогут понять, сколько своих писем удаляют пользователи Яндекс.
Почты, сколько времени они их читают и за сколько дочитывают. Меня зовут Антон Холодков, и я занимался разработкой серверной части этой системы.
В этом посте я расскажу о том, как именно мы его разрабатывали и с какими трудностями столкнулись.
Для почтовика интерфейс Почты полностью прозрачен.
Достаточно зарегистрировать свой домен или электронную почту в системе.
Сервис собирает и анализирует данные по множеству параметров: имя и домен отправителя, время, спам/не спам, прочитано/непрочитано.
Также реализована агрегация по полю list-id — специальному заголовку для идентификации рассылок.
У нас есть несколько источников данных.
Во-первых, система доставки писем в метабазы.
Он генерирует события, указывающие на то, что в систему поступило письмо.
Во-вторых, веб-интерфейс почты, где пользователь меняет статус письма: читает его, помечает как спам или удаляет. Все эти действия должны уйти в хранилище.
Жестких требований ко времени при сохранении и изменении информации нет. Добавление или изменение записи может занять довольно много времени.
На этом этапе статистика будет отражать предыдущее состояние системы.
При больших объемах данных это незаметно для пользователя.
Одно-два его действия, еще не вошедшие в базу, не смогут изменить статистику на сколько-нибудь существенную величину.
В веб-интерфейсе очень важна скорость отклика — подтормаживания выглядят неприглядно.
Кроме того, важно предотвратить скачок значений при обновлении окна браузера.
Такая ситуация возникает, когда данные извлекаются из той или иной головки.
Хотелось бы сказать несколько слов о выборе платформы.
Мы сразу поняли, что не каждое решение сможет справиться с тем потоком данных, который у нас есть.
Изначально было три кандидата: МонгоБД , Постгрес , наша собственная группа Люсене+Зоопарк .
От первых двух мы отказались из-за недостаточной производительности.
Особенно большие проблемы были при вставке большого количества данных.
В результате мы решили воспользоваться опытом наших коллег и использовали комбинацию Lucene+Zookeeper — ту же комбинацию, что используется при поиске в Яндекс.
Почте.
JSON стал стандартом для связи между компонентами внутри системы.
Java и Javascript имеют удобные инструменты для работы с ним.
В C++ мы используем yajl и boost::property_tree. Все компоненты реализуют REST API. Данные в системе хранятся в Apache Lucene. Как вы знаете, Lucene — это библиотека, разработанная Apache Foundation для полнотекстового поиска.
Он позволяет хранить и извлекать любые предварительно индексированные данные.
Мы превратили его в сервер: научили хранить данные, добавлять их в индекс и сжимать.
Используя http-запрос, вы можете искать, добавлять, изменять.
Существуют также различные типы агрегирования.
Чтобы обеспечить обработку каждой записи об изменении состояния во всех головках кластера, используется Zookeeper, еще один продукт Apache Fondation. Мы улучшили его и добавили возможность использовать его как очередь.
Был написан специальный демон для извлечения и анализа данных из Lucene. В нем содержится вся логика работы.
Вызовы веб-интерфейса превращаются в http-запросы к Lucene. Также реализована логика агрегации, сортировки и другой обработки данных, необходимая для отображения данных в веб-интерфейсе.
Когда пользователи выполняют действия в веб-интерфейсе, информация об этих действиях сохраняется через Zookeeper в Lucene. Каждое действие — например, нажатие кнопки «Спам» — меняет состояние системы, и необходимо аккуратно модифицировать все данные, на которые оно влияет. Это самая сложная часть системы; нам потребовалось больше всего времени, чтобы переписать и отладить его.
Первая попытка решения проблемы была, что называется, «в лоб».
Мы хотели хранить записи о статусе сообщений в Lucene «на лету».
Данные должны были агрегироваться в реальном времени во время извлечения.
Это решение отлично работало на небольшом количестве записей.
Обобщение сотен записей заняло микросекунды.
Все выглядело великолепно.
Проблемы начались, когда записей было большое количество.
Например, тысячи сообщений уже были обработаны за считанные секунды.
Десятки тысяч – десятки секунд. Это раздражало пользователей и нас.
Необходимо было искать пути ускорения вывода данных.
При этом агрегация обычных пользователей с десятками, сотнями и тысячами писем в день не представляла проблемы.
Проблемой стали отдельные почтовики, рассылавшие сотни тысяч писем за очень короткое время.
Для них невозможно было рассчитать данные в реальном времени.
Решение было найдено после анализа запросов веб-интерфейса.
Типов запросов было немного, и все они сводились к суммированию данных или поиску среднего значения ряда данных.
Мы добавили в базу записи агрегации и начали их модифицировать при добавлении или изменении записей о статусе письма.
Например, пришло письмо и к общему счетчику добавилась единица.
Пользователь удалил письмо — вычел единицу из общего счетчика и добавил единицу к удаленному счетчику.
Пользователь пометил письмо как спам и добавил его в счетчик «спам».
Количество записей, которые необходимо обработать для выполнения запроса, стало меньше, и это значительно ускорило агрегацию.
Zookeeper упрощает обеспечение целостности данных.
Для изменения записей агрегирования требуется время, но мы можем позволить себе небольшую задержку данных.
Что произошло в конце? В настоящее время в системе Lucene имеется четыре машины, а в Zookeeper — три.
Входные данные поступают с 10 машин и выдаются на шесть фронтенд-машин.
Система обрабатывает 4500 запросов на изменение и 1100 запросов на чтение в секунду.
Объем хранилища на данный момент составляет 3,2 терабайта.
Система хранения Lucene + Zookeeper показала себя очень стабильной.
Вы можете отключить узел в Lucene на лету или добавить узел.
Zookeeper сохранит историю и загрузит необходимое количество событий на новую машину.
Через некоторое время мы получим голову с актуальной информацией.
Одна машина в кластере предназначена для хранения резервных копий данных.
Несмотря на сжатые сроки разработки, система оказалась надежной и быстрой.
Архитектура позволяет легко масштабировать как по вертикали, так и по горизонтали, а также добавлять новые возможности анализа данных.
Который мы обязательно добавим для вас в ближайшее время.
Теги: #открытый код #Большие данные #API Яндекса #почта #рассылки #lucene
-
Деньги Ни За Что?
19 Oct, 24 -
Игры «Поиск Скрытых Предметов»
19 Oct, 24 -
Hbo Go — Сериал Hbo На Android И Ios
19 Oct, 24 -
Ms-Dos – С 30-Летием
19 Oct, 24 -
Amazon Купил Audible
19 Oct, 24 -
Cnews Awards Или It-Бизнес По-Русски
19 Oct, 24