Акка Актеры: Обработка ошибок БД без потери данных

Сценарий
БД для приложения снизилась. Это приводит к тому, что любой субъект, ответственный за передачу важных данных в БД, не получая соединение

Предпочтительное поведение
Важные данные записываются в db, когда он возвращается в будущем в будущем.

Текущая реализация
Актер ловит DBException, обертывает данные в класс case DBWriteFailed и отправляет сообщение своему супервизору. Затем диспетчер планирует другую запись в будущем (например, 1 минуту), используя system.scheduler.scheduleOnce(...), чтобы мы не слишком крутились в кругах, ожидая возврата базы данных.

Эта реализация, безусловно, работает, но я чувствую, что может быть лучший способ.

  • Протокол становится немного беспорядочным, когда участник, совершивший акт, должен ответить первоначальному отправителю после успешной фиксации.
  • Регулярный поток сообщений для участника-актера никоим образом не дросселируется, и актер будет успешно обрабатывать новые сообщения, вероятно, не сможет подключиться к БД для каждого из них.
  • Если сообщения слишком долго попадают в этот цикл повторных попыток, почтовые ящики действующих участников начнут баллотироваться. Важно, чтобы эти данные были зафиксированы, но ничто из этого не имеет значения, если приложение сканируется до остановки или сбоев из-за чрезмерного использования памяти.

Я новичок в akka, и я в значительной степени неопытен, когда речь заходит о супервизорных стратегиях, но я чувствую, что могу использовать один из тех, кто может справиться с этой логикой повторения.

Есть ли общий подход в akka для решения такой проблемы? Я на правильном пути или я должен идти в другом направлении?

Любая помощь приветствуется.

Ответ 1

Вы можете использовать автоматический выключатель Akka, чтобы уменьшить попытки подключения. Вместо того, чтобы использовать планировщик в качестве очереди повтора, я использовал бы буфер (с максимальным ограничением размера) внутри актера и повторил их, когда автоматический выключатель снова закрывается (onClose callback должен отправить сообщение самому себе). Альтернативой может быть объединение автоматического выключателя с штамповым почтовым ящиком.

Ответ 2

Если вы планируете реализовать полный переход на другой ресурс в своем приложении

Не.

Не переносите ответственность за возврат отказа в базе данных на уровне приложения. Что касается вашего приложения, база данных должна быть просто готова и готова принять чтение и запись.

Если ваша база данных опускается часто, потратьте время на то, чтобы ваша база данных была более надежной (для этого существует множество ресурсов в Интернете: поиск в Интернете для таких терминов, как "репликация", "высокая доступность", "балансировка нагрузки", и "кластеризация", и учиться из военных рассказов других в highscalability.com). Все это действительно зависит от причины сбоев в работе БД (например, когда-то я превысил NIC на главном БД и "исправил" проблему с перебоями, включив GZIP на проводе).

Вы будете рады, что соблюдаете разделение проблем, если идете по этому пути.

Если вы планируете реализовать нечетное разбрызгивание логики повторения и обработки ошибок DB

Если вы не ожидаете, что ваше приложение станет заменой базы данных, то Patrik answer - лучший способ.