Как выполнить неидемпотентные действия (отправить по электронной почте) в рамках модели Actor (например, akka.net)? - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь использовать модель актерской модели (akka.net с постоянством akka.net, но ищу общий ответ) для построения «рабочего процесса обработки заказа виджетов».

Довольно стандартный:

  1. Виджет заказов клиентов
  2. Платеж обработан
  3. Подтверждение по электронной почте отправлено клиенту
  4. Отправить сообщение в список выборана склад
  5. Склад отправляет сообщение «Виджет отправлен» обратно
  6. Отправляет клиенту сообщение «Ваш товар отправлен»

Теперь скажем, между 4и 5 происходит развертывание / перезапуск сервера.Это приведет к регидратации актера (-ов) (предположим, что пока нет снимка).Это означает, что мы снова обработаем платеж и повторно отправим заказ по электронной почте.Однако оказывается, что нашим клиентам не нравится эта «особенность»!

Как предотвратить повторение неидемпотентных действий при использовании каркаса модели актера?

Я думал о том, чтобы у меня был отдельный магазин «платеж обработан для таблицы БД заказа»;но мне кажется, что я борюсь с фреймворком / парадигмой, и мне интересно, есть ли «правильный» способ сделать это!

Ответы [ 2 ]

0 голосов
/ 17 ноября 2018

Хорошо, получается, что это довольно просто.

С сохранением akka.net после восстановления системы сообщения воспроизводятся.Правильное состояние может быть воссоздано путем (повторной) обработки этих сообщений.

Однако существует свойство IsRestoring, которое можно проверить, чтобы увидеть, является ли это первой или последующей обработкой.Предположительно, у другой модели актерской модели есть что-то похожее.

Итак, вы делаете что-то вроде:

private void ProcessPayment (Order message)
{
    if(!this.IsRestoring){
        //Perform non-idempotent payment process
    }
}
0 голосов
/ 16 ноября 2018

Чтобы создать надежный процессор рабочего процесса, вы должны хранить ВСЕ данные процесса рабочего процесса в постоянном хранилище.

Вы можете использовать базу данных, систему обмена сообщениями, например Kafka, или использовать готовое управление рабочим процессом.программного обеспечения.

Поскольку вы уже используете Akka, Akka Persistance также может быть вариантом.

UPDATE

Создание системы, которая продолжает работать правильно при наличииСистемные сбои и перезапуски - важная задача, гораздо более сложная, чем разработка структуры актера.То есть вы не можете просто взять какую-либо структуру актера и добавить к ней отказоустойчивость.

...