Это хорошая идея использовать кинезис для передачи сообщений в akka.net
В настоящее время мы создаем систему акторов с принципами DDD поверх Akka.NET.
У нас есть несколько упущений в том, как сделать наш сервис более устойчивым:
- По крайней мере одна доставка по умолчанию между актерами
- Устойчивость актёров почтовых ящиков
- FSMActors хранят входящие сообщения, которые не могут быть обработаны немедленно - устойчивость?
- Шаблон Pub/Sub (и устойчивость)
Мы не уверены, что делать, если некоторые сообщения теряются, и поэтому мы не можем перейти к следующему состоянию, чтобы завершить запрос, в котором участвуют несколько участников.
Моя идея состояла в том, чтобы использовать систему потоковой передачи событий, такую как kinesis, для передачи сообщений arround. Затем мы повсюду обладаем устойчивостью и просто должны знать, какое событие в потоке мы обработали. Я что-то упускаю? Как вы думаете, это глупая идея? Это нарушает некоторые лучшие практики?
1 ответ
Доставка по крайней мере один раз является осознанным выбором, когда дело доходит до Akka.NET (и фактически всех популярных реализаций модели актера). В прошлом у оригинальной Akka из JVM были реализации почтовых ящиков над постоянными очередями, но эта идея была отброшена несколько лет назад как неудачный эксперимент.
- Akka.NET сильно ориентирован на передачу сообщений. Для каждого запроса пользователя могут быть обработаны десятки (или сотни) сообщений между участниками. С обменом сообщениями в памяти это быстро и просто (Akka.NET может передавать миллионы сообщений в секунду на одной машине).
- Обычно то, о чем вы думаете, когда дело доходит до надежной обработки, не является надежным, постоянным почтовым ящиком, который имеет значение. Подсказка состоит в том, чтобы надежно обработать сообщение - вы можете легко удалить сообщение из очереди или журнала, и компьютер сломается, прежде чем вы закончите его обрабатывать.
- По крайней мере, однократная обработка заставляет вас либо иметь возможность распознавать дубликаты (которые, кроме повторных поставок, не являются экономически эффективными для каждого отдельного субъекта), либо проектировать всю вашу логику обработки так, чтобы она работала идемпотентно.
В некоторых случаях достаточно подтверждения, то есть пользователь отправляет запрос и ожидает, что ответ придет в течение некоторого времени ожидания. Если ответ не пришел, т. Е. Потому что некоторые сообщения были утеряны, просто отправьте запрос запрашивающей стороне (и, возможно, попросите его / ее повторить попытку).
Другой распространенный способ - использовать очередь / журнал в определенных местах, например, как слой перед вашей актерской системой. Таким образом, все пользовательские запросы сначала отправляются в постоянную очередь, из которой они впоследствии выбираются системной логикой субъекта. Как только действующие лица завершат обработку запроса, они смогут зафиксировать его и удалить из очереди. Если произошел какой-либо сбой, весь процесс (или его часть) просто повторяется.