Кластер Akka в Java для получения IMAP с использованием Java Mail API
-
21-12-2019 - |
Вопрос
Я хочу запустить некоторую задачу, которая будет подключаться к IMAP
и перенести данные электронной почты для хранения в базе данных.
Теперь такая работа будет иметь огромный объем, чтобы поддержать многих IMAP
Счета.Я хочу использовать возможности кластера Akka, который может запускать эти задания на заранее определенном наборе компьютеров в сети и выполнять повторные попытки в случае ошибок при получении данных из IMAP
хозяева.
Я хочу создать кластер akka, который запустится IMAP
получить задание (через актера ??!!).
IMAP
это сложный протокол, он может не удаться подключиться к удаленному хосту.В таком случае актер должен повторить попытку несколько настраиваемых раз для подключения и получения данных.
В конце концов он должен действовать как мой IMAP
получить задний конец.
Как мне это сделать?
Решение
Мы активно используем Akka, в том числе для подключения и обработки новых сообщений из учетных записей электронной почты пользователей с использованием JavaMail/IMAP.Отказоустойчивость является важной частью головоломки.Вот примерно как устроен наш бэкэнд:
- Узел супервизора имеет актера, который выбирает пользователей из БД для обработки.
- Рабочие актеры IMAP уведомляют руководителя, когда они готовы к работе (подробнее об этой архитектуре «вытягивания работы» см. в блоге моего коллеги Райана Таннера: http://blog.goconspire.com/post/64901258135/akka-at-conspire-part-5-the-importance-of-pulling)
- Supervisor отправляет сообщение ProcessAccount — настраиваемый объект, включающий токен Gmail OAuth (вы также можете использовать традиционные учетные данные имени пользователя и пароля) — простаивающему работнику IMAP.
- Работник IMAP использует JavaMail для чтения и обработки новых сообщений.В случае ошибки он отправляет сообщение FailedProcessing — пользовательский объект, включающий код ошибки и удобочитаемую строку — обратно субъекту-супервизору.В случае успеха он отправляет CompletedProcessing.
- Супервизор обновляет запись пользователя в базе данных, включая установку кода ошибки в случае сбоя обработки.
- Помимо периодической обработки работоспособных учетных записей, супервизор повторяет обработку ошибочных учетных записей.Наш вариант использования таков, что мы пытаемся выполнить повторную обработку только один раз в день, но вы могли бы делать это гораздо чаще.
Используя кластеризацию Akka, мы отделяем работников от супервайзеров.Сочетание этого подхода с описанным выше механизмом вытягивания работы делает нас относительно толерантными к неисправимым ошибкам, например:OutOfMemoryErrors, в рабочих.
Другие советы
Используйте JavaMail.Прочтите Часто задаваемые вопросы по JavaMail.