gpt4 book ai didi

c# - 奥尔良。阿卡网。理解 Actor 模型的问题

转载 作者:行者123 更新时间:2023-12-04 14:17:57 26 4
gpt4 key购买 nike

如果您不了解 C# 但熟悉 actor 模型,请阅读下面我的问题,因为它更多地涉及架构和数据管理。

我是一名非常初级的 C# 开发人员,正在尝试了解 actor 模型是什么。我已经完成了它,但还有一点我无法得到。

在我告诉你一个问题之前,让我描述一下上下文,以便为你提供更好的理解。

作为测试示例,我想为一家虚构的银行构建一个应用程序。我将出于学习目的同时使用 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; }
...
}

而且我还想有两个 Actor / Cereal :

  1. 客户 Actor ;
  2. 交易服务;

他们的接口(interface):

//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. 我应该为每个用户帐户创建一个参与者吗?我很确定我需要因为我如何才能实现数千个交易不同账户之间。
  2. 如何将用户帐户与 AccountActor 相关联?如果我之前使用存储库从数据库加载数据是否正确actor 的激活/启动和设置状态?

主要问题:如何将状态存回数据库?

让我们想象一个有 1000 美元的账户 A。并且它发生了大约 100 个由涉及此帐户的用户发起的交易。帐户 A 将其状态从消息更改为消息。

将这些更改保存到数据库的最佳方法是什么?我读到如果我直接从 Actor 调用数据库,我将失去所有的好处,因为阻塞操作。

我是否应该再创建一个 actor 来处理来自其他 actor 的消息并使用存储库将更改写入数据库?

我的意思是我可以从 AccountActor 发送有关帐户更改的消息到我将在其中调用适当存储库的新参与者。但是,这不是瓶颈吗?假设有 1000 个在线用户和大约 100,000 个帐户之间的交易。然后负责将帐户更改保存到数据库的参与者可能有太多消息需要处理。

抱歉,文字太长了。我试图找到使用 Orleans 或 Akka.net 的应用程序示例,但我还没有找到任何使用数据库的东西。

感谢您的关注。

最佳答案

您在这里遗漏了几个想法,但让我们按顺序回答问题。

Should I create one actor per user account? I'm pretty sure that I need because how then I can implement thousands of transactions between different accounts.

我假设您正在考虑的替代方案是每个用户帐户多个参与者,这是错误的。每个用户帐户只能有一个参与者,否则您将遇到您描述的同时请求可以两次提取相同资金的问题。

How can I associate the user account with the AccountActor?

您缺少拥有 AccountActor 的 UserActor。没有所有者就不能存在帐户,否则我们不知道谁拥有帐户中的钱。在现实世界中,人们通常不会向随机账户汇款。他们想将其发送给某个人,并使用发件人用户角色帐户来发送。

Is it correct If I load the data from database using repository before actor's activation/start and set up the state?

是的,事实上这是强制性的。没有 Actor 的状态, Actor 就没有多大用处。

What is the best approach to save these changes to database? I read that If I use calls to the database directly from the actor, I will lose all the benefits because of blocked operations. Should I create one more actor to process messages from other actors and writes changes to database using repositories?

您走在正确的轨道上,但还不完全正确。 actor 状态的保存是通过异步方法写入数据库来完成的。使用异步方法,主线程不会阻塞等待数据库写入发生,因此处理线程可以继续其业务。

当只有一个 actor 参与一个 Action 时,它可以通过 async 方法保存自己的状态。在银行登记簿中,总是涉及 2 个帐户,并且对两个帐户的写入都必须成功或失败,永远不会一个成功而一个失败。因此,TransactionActor 将打开一个 DB 事务并告诉每个 AccountActor 使用该 DB 事务保存其状态。如果其中一个失败,它会中止事务并且两个都失败。请注意,此方法是 TransactionActor 上的私有(private)异步方法,因此您可以获得并行处理的好处。

顺便说一句,您在 Orleans 中找不到任何写入数据库的示例,因为这些都是由框架为您处理的。保存方法是自动异步的,它们与数据库交互。您在 Orleans 所做的只是引用 Actor,状态会自动为您从数据库中提取。

关于c# - 奥尔良。阿卡网。理解 Actor 模型的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58308230/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com