Orleans. Akka.net. Проблема с пониманием актерской модели - PullRequest
1 голос
/ 09 октября 2019

Если вы не знаете 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; }
    ...
}

И я также хочу иметь двух актеров / зерен:

  1. AccountActor;
  2. 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 приложения. Они снимают, вносят и переводят деньги практически без пауз.

Вопрос в следующем:

  1. Должен ли я создать одного актера на учетную запись пользователя? Я почти уверен, что мне нужно, потому что как тогда я могу реализовать тысячи транзакций между различными учетными записями.
  2. Как я могу связать учетную запись пользователя с AccountActor? Правильно ли, если я загружаю данные из базы данных с помощью репозитория перед активацией / запуском актера и устанавливаю состояние?

И главная проблема: Как сохранить состояние обратно в базу данных?

Давайте представим себе аккаунт А, у которого 1000 $. И происходит около 100 транзакций, инициированных пользователями, в которых участвует эта учетная запись. Учетная запись A меняет свое состояние с сообщения на сообщение.

Каков наилучший подход для сохранения этих изменений в базе данных? Я прочитал, что если я использую вызовы базы данных напрямую от субъекта, я потеряю все преимущества из-за заблокированных операций.

Должен ли я создать еще одного субъекта для обработки сообщений от других субъектов и записи изменений в базу данных с использованиемрепозитории?

Я имею в виду, что могу отправлять сообщения от AccountActor об изменениях учетной записи новому субъекту, куда я позвоню в соответствующий репозиторий. Но разве это не узкое место? Давайте представим 1000 пользователей онлайн и около 100 000 транзакций между аккаунтами. Тогда субъект, ответственный за сохранение изменений учетных записей в базе данных, может иметь слишком много сообщений для обработки.

Извините за длинный текст. Я пытался найти примеры приложений, которые используют Orleans или Akka.net, но я не нашел ничего, что использует базу данных.

Спасибо за ваше внимание.

...