我是一名非常初级的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个用户在线并通过客户端应用程序积极向应用程序的REST API发出请求。他们几乎没有停顿地提取、存款和转账。
问题是: 1.我是否应该为每个用户帐户创建一个actor?我非常确定需要这样做,因为如何才能实现不同账户之间的数千次交易。 2.我如何将用户帐户与AccountActor关联起来?如果我在actor的激活/启动之前使用repository从数据库加载数据并设置状态,这样做是否正确?
主要问题是:如何将状态保存回数据库? 假设账户A有1000美元,用户发起了大约100笔涉及该账户的交易。账户A的状态在消息之间发生变化。 什么是将这些更改保存到数据库的最佳方法?我读到如果我直接从actor调用数据库,我会失去所有好处,因为操作会被阻塞。
我是否应该创建一个额外的actor来处理其他actor发送的消息,并使用repository将更改写入数据库? 我的意思是,我可以从AccountActor发送关于帐户更改的消息到新actor,在那里我将调用适当的repository。但是,这不是瓶颈吗?让我们想象在线1000个用户,有大约10万个账户之间的交易。那么负责将帐户更改保存到数据库的actor可能有太多消息要处理。
对于这篇长文,我感到抱歉。我试图找到使用Orleans或Akka.net的应用程序示例,但我没有找到任何利用数据库的东西。 谢谢您的关注。