如果您不了解 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; }
...
}
而且我还想要两个演员/谷物:
- 会计演员;
- 交易服务;
他们的接口:
//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 发起请求。他们几乎没有任何停顿地取款、存款和转账。
问题是:
- 我应该为每个用户帐户创建一个演员吗?我很确定我需要,因为这样我才能在不同账户之间实现数千笔交易。
- 如何将用户帐户与 AccountActor 关联?如果我在演员激活/启动之前使用存储库从数据库加载数据并设置状态,是否正确?
主要问题: 如何将状态保存回数据库?
让我们想象一个有 1000 美元的账户 A。并且它发生了大约 100 次由涉及该帐户的用户发起的交易。帐户 A 将其状态从消息更改为消息。
将这些更改保存到数据库的最佳方法是什么?我读到如果我直接从参与者调用数据库,我将因为阻塞操作而失去所有好处。
我是否应该再创建一个参与者来处理来自其他参与者的消息并使用存储库将更改写入数据库?
我的意思是我可以从 AccountActor 发送有关帐户更改的消息到我将调用适当存储库的新演员。但是,这不是瓶颈吗?让我们想象一下有 1000 个在线用户和大约 100 000 个帐户之间的交易。然后负责将帐户更改保存到数据库的参与者可能有太多消息需要处理。
对不起,很长的文字。我试图找到使用 Orleans 或 Akka.net 的应用程序示例,但我没有找到任何使用数据库的东西。
谢谢你的关注。