gpt4 book ai didi

scala - 在实践中使用 Scala Actor 编写应用程序 II

转载 作者:行者123 更新时间:2023-12-05 00:08:28 26 4
gpt4 key购买 nike

关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。












想改进这个问题?将问题更新为 on-topic对于堆栈溢出。

3年前关闭。




Improve this question




因为我的第一个问题太长了,所以我将其作为一个单独的问题提出。这是另一个关于基于参与者的应用程序架构的问题。

通过应用程序跟踪消息路径

让我们看一段Java代码:

public void deleteTrades(User user, Date date) {
PermissionSet ps = permissionService.findPermissions(user)
if (ps.hasPermission("delete")) {
Set<Trade> ts = peristence.findTrades(date);
reportService.sendCancelReports(ts);
positionService.updateWithDeletedTrades(ts);
}
}

在这段代码中,我有 4 个独立的组件,以及程序 deleteTrades 所需的它们之间的交互。是明确的。它完全包含在方法 deleteTrades 中.

Actor 建模s 并用 4 个单独的参与者替换我的 4 个组件,我如何(在我的脑海中)跟踪程序涉及的内容?特别是如果我避免使用 !? 运营商,那么我很可能会发送一条消息 ConditionalDelete给我的 PermissionActor , 这将发送一条消息 GetTradesAndDelete给我的 PersistenceActor然后它将发送更多消息等。处理删除的代码将散布在我的应用程序中。

这也意味着几乎每个参与者都需要处理每个其他参与者(以便转发消息)。

就像我之前的问题一样,人们如何处理这个问题?是否有一个好的建模工具可以让您跟踪所有这些?人们是否使用 !? 我是否将太多组件转换为 Actor年代?

最佳答案

你肯定使用 5 个组件。有处理特定任务的 Actor ,还有一个协调者。

当然,您必须有的问题是如何异步链接它。嗯,它实际上有点简单,但它可能会使代码变得模糊。基本上,您向每个组件发送您想要的回复。

react {
case DeleteTrades(user,dates) =>
PermissionService ! FindPermissions(user, DeleteTradesPermissions(dates) _)
case DeleteTradesPermissions(dates)(ps) =>
if (ps hasPermission "delete")
Persistence ! FindTrades(date, DeleteTradesTradeSet _)
case DeleteTradesTradeSet(ts) =>
ReportService ! SendCancelReports(ts)
PositionService ! UpdateWithDeletedTrades(ts)
}

在这里,我们使用柯里化(Currying)在第一个返回答案中传递“日期”。如果有很多与交互相关的参数,最好将所有正在进行的事务的信息保存在本地 HashSet 中,并传递一个 token ,您将在收到答案时使用该 token 来定位该信息。

请注意,这个单一参与者可以处理多个并发操作。在这种特殊情况下,只需删除事务,但您可以添加任意数量的不同操作来处理。当一项操作所需的数据准备好时,该操作将继续。

编辑

以下是如何定义这些类的工作示例:
class Date
class User
class PermissionSet

abstract class Message
case class DeleteTradesPermission(date: Date)(ps: PermissionSet) extends Message
case class FindPermissions(u: User, r: (PermissionSet) => Message) extends Message

FindPermissions(new User, DeleteTradesPermission(new Date) _)

关于柯里化(Currying)和函数的一些解释。类(class) DeleteTradesPermission被 curry ,这样你就可以通过 Date在它上面,并有一些其他功能用 PermissionSet 完成它.这将是应答消息的模式。

现在,类(class) FindPermissions接收一个函数作为第二个参数。接收到这个消息的actor会将返回值传递给这个函数,并且会收到一个 Message作为答案发送。在此示例中,消息将具有 Date ,调用者发送的, PermissionSet ,回答者提供的。

如果没有预期的答案,例如 DeleteTrades 的情况, SendCancelReportsUpdateWithDeletedTrades就本示例而言,您无需传递返回消息的函数。

由于我们期望一个函数返回一个 Message 作为那些需要答案的消息的参数,我们可以定义这样的特征:
trait MessageResponse1[-T1] extends Function1[T1, Message]
trait MessageResponse2[-T1, -T2] extends Function2[T1, T2, Message]
...

关于scala - 在实践中使用 Scala Actor 编写应用程序 II,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1310964/

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