- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果您不了解 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 :
他们的接口(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 积极发出请求。他们几乎没有任何停顿地取款、存款和转账。
问题是:
主要问题:如何将状态存回数据库?
让我们想象一个有 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/
连接到奥尔良服务器的正确方法是什么? 可以说我有一个移动应用程序,我想从该应用程序连接到奥尔良服务器。 我应该直接连接到奥尔良还是使用某些前端服务器(为什么?) 如果直接使用,我应该使用奥尔良流或自定
我正在评估 Microsoft Orleans 作为自定义分布式缓存(以及其他功能)的基础。 我能够使用 MembershipTableGrain 创建一个用于评估目的的不可靠集群。一切都按照文档中的
我目前正在为我们的组织了解 MS Orleans。据我了解,只要所有数据库更新都通过 Grains 进行,Orleans Grains 就会与数据库保持同步。 但是如果有一些批量处理过程(例如数据文件
我目前正在为我们的组织了解 MS Orleans。据我了解,只要所有数据库更新都通过 Grains 进行,Orleans Grains 就会与数据库保持同步。 但是如果有一些批量处理过程(例如数据文件
我刚刚开始学习 Microsoft Orleans,我想知道如何最好地处理我们的一个场景。我们将有一个接收请求的 REST 服务,该请求最终会导致在外部系统中创建一条新记录。该记录将具有长 Id 值。
如果您不了解 C# 但熟悉 actor 模型,请阅读下面我的问题,因为它更多地涉及架构和数据管理。 我是一名非常初级的 C# 开发人员,正在尝试了解 actor 模型是什么。我已经完成了它,但还有一点
我是一名优秀的程序员,十分优秀!