Лучшим способом будет иметь отдельный объект, ответственный за хранение данных в БД. И актер просто отправит событие (не подразумевая SF-события) с некоторыми данными о выполненной операции, а другой объект поймает его и выполнит оставшуюся часть работы.
Но, конечно, вы можете реализовать эту вещь в себе актера, но он принесет две возможные проблемы:
- актер будет не в состоянии обрабатывать другие запросы, если будут какие-то проблемы с БД или связи между актера и БД, или если будет большая загрузка самой БД, и она будет обрабатывать запросы медленно. Актеру придется подождать, пока передача в БД завершится успешно.
- Возможная перегрузка БД со многими отдельными соединениями от многих участников вместо одного или нескольких соединений от другого объекта и пакетная вставка.
Итак, ваше окончательное решение будет зависеть от рабочей нагрузки вашей системы. Но определенно вам понадобится надежная очередь для безопасного хранения данных в БД, если значение таких данных слишком велико, чтобы позволить себе потерю.
Кроме того, я думаю, вы могли бы использовать диспетчер состояний по умолчанию для хранения журналов и информации о транзакциях до того, как они будут переданы в БД и удалены из состояния службы после завершения транзакции. Нет необходимости иметь постоянное хранение таких данных в службах.
И еще одно, что нужно учитывать - чтение из БД. Вероятно, если у вас есть база данных отношений и будет обновляться новыми записями только одна таблица +, если будет огромное количество участников, которые будут запрашивать такие данные при активации, у вас будет ухудшение производительности, поскольку эта таблица будет заблокирована для чтения или записи, если вы не будет настраивать его на поведение по-разному. Таким образом, возможно, вам понадобится система кэширования для чтения данных для активации актеров - зависит от вашей рабочей нагрузки.
И о внедрении пользовательского государственного менеджера: посмотрите пример this. В принципе, все, что вам нужно сделать, это реализовать интерфейс IReliableStateManagerReplica
и передать его в конструктор StatefullService
.