Если вы не знаете C #, но знакомы с моделью актера, пожалуйста, прочитайте мою проблему ниже, так как она больше касается архитектуры и управления данными.
Я очень младший разработчик C # и пытаюсьпонять, что такое модель актера. Я вроде как с этим покончил, но остался один момент, который я не могу получить.
Прежде чем я расскажу вам проблему, позвольте мне описать контекст, чтобы обеспечить вам лучшее понимание.
В качестве тестового примера я хочу создать приложение для воображаемого банка. Я собираюсь реализовать это приложение, используя akka.net и Orleans в целях обучения и чтобы иметь возможность сравнивать их.
Примеры использования:
- Как пользователь, которого я хочучтобы иметь возможность создать новую учетную запись;
- Как пользователь, я хочу иметь возможность войти в приложение, используя уникальный номер своей учетной записи;
- Как пользователь, я хочу иметь возможность вносить депозитденьги на мой счет;
- Как пользователь, я хочу иметь возможность выбрать другого пользователя и перевести определенную сумму денег на его счет;
- Как пользователь, я хочу иметь возможность снять деньги. сумма денег с моего счета.
Итак, есть следующие лица:
Определение отношений один к одному между пользователем и его учетной записью. Я собираюсь использовать ORM для хранения этих данных в моей базе данных. Очевидно, что модели выглядят примерно так:
public class User
{
public Guid Id { get; set; }
public string FullName { get; set; }
....
}
public class Account
{
public Guid Id { get; set; }
public string UniqueNumber { get; set; }
public string Balance { get; set; }
...
}
И я также хочу иметь двух актеров / зерен:
- AccountActor;
- TransactionService;
Их интерфейсы:
//Or IAccountGrain
public interface IAccountActor
{
void Deposit(Money amount);
void Withdraw(Money amount);
}
//Or ITransactionGrain
public interface ITransactionActor
{
void Transfer(IAccountActor from, IAccountActor to, Money amount);
}
Я не понимаю, как обрабатывать данные в реляционной базе данных. Давайте представим следующий сценарий:
50 пользователей находятся в сети и активно отправляют запрос через клиентское приложение на API REST приложения. Они снимают, вносят и переводят деньги практически без пауз.
Вопрос в следующем:
- Должен ли я создать одного актера на учетную запись пользователя? Я почти уверен, что мне нужно, потому что как тогда я могу реализовать тысячи транзакций между различными учетными записями.
- Как я могу связать учетную запись пользователя с AccountActor? Правильно ли, если я загружаю данные из базы данных с помощью репозитория перед активацией / запуском актера и устанавливаю состояние?
И главная проблема: Как сохранить состояние обратно в базу данных?
Давайте представим себе аккаунт А, у которого 1000 $. И происходит около 100 транзакций, инициированных пользователями, в которых участвует эта учетная запись. Учетная запись A меняет свое состояние с сообщения на сообщение.
Каков наилучший подход для сохранения этих изменений в базе данных? Я прочитал, что если я использую вызовы базы данных напрямую от субъекта, я потеряю все преимущества из-за заблокированных операций.
Должен ли я создать еще одного субъекта для обработки сообщений от других субъектов и записи изменений в базу данных с использованиемрепозитории?
Я имею в виду, что могу отправлять сообщения от AccountActor об изменениях учетной записи новому субъекту, куда я позвоню в соответствующий репозиторий. Но разве это не узкое место? Давайте представим 1000 пользователей онлайн и около 100 000 транзакций между аккаунтами. Тогда субъект, ответственный за сохранение изменений учетных записей в базе данных, может иметь слишком много сообщений для обработки.
Извините за длинный текст. Я пытался найти примеры приложений, которые используют Orleans или Akka.net, но я не нашел ничего, что использует базу данных.
Спасибо за ваше внимание.