【问题标题】:Enforcing ordered communication between actors执行参与者之间的有序通信
【发布时间】:2015-12-08 17:21:17
【问题描述】:

我有一个问题,要求我的演员按照消息发送的顺序处理消息。在 Akka 中,actor A 和actor B 之间的消息总是保证按照发送的顺序到达。在 Service Fabric 中的 Reliable Actors 中似乎并非如此。在我的测试用例中,消息是以不确定的顺序接收的。

我可以通过在处理第一条消息之前不发送下一条消息来强制排序,但这会破坏整个观点。我真的很想发送并忘记消息,但知道它们将由接收参与者按顺序处理。

有没有人看到这样做的模式?我认为 Orleans Actors 具有相同的乱序消息可能性。也许奥尔良的解决方案也适用于此。

【问题讨论】:

  • 两个演员之间的火与忘是什么样的?两者都是单线程的吧?所以我认为订购是自然发生的?
  • 是的,两者都是单线程的,但消息是通过 Service Fabric 基础结构路由的。如果参与者 A 向参与者 B 发送三个消息(M1、M2、M3),则参与者 B 可能会以不同的顺序处理它们,例如 M2、M3、M1,
  • 但是演员 A 怎么能在不等待任何一个的情况下发送 M1、M2 和 M3 呢?在那种情况下,你正在用线程做一些特别的事情,对吧?否则我会假设因为应该在 A 发送 M2 之前处理 M1,这没关系。
  • 消息的发送是异步的。所以我可以发送一条消息,然后发送另一条消息,而无需等待第一个消息的结果。每个参与者都是单线程的,但也有处理消息的 Service Fabric 中介。因此,对于两个参与者,至少涉及三个线程。
  • 根据我的理解,当你在ActorProxy上调用一个方法时,当该方法完成时,调用由ActorProxy执行。虽然它是异步的(可等待的),但它不是异步的。你有指向解释你所说的文档的指针吗?

标签: azure-service-fabric orleans


【解决方案1】:

奥尔良不保证消息传递给演员的顺序(除非你一次发送一个,因为你已经打折了):

https://github.com/akka/akka-meta/blob/master/ComparisonWithOrleans.md#messaging-guarantees

但是,如果您在 Orleans 中使用流(使用正确的底层流提供程序),则可以控制排序:

http://dotnet.github.io/orleans/Orleans-Streams/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    • 1970-01-01
    • 2013-08-28
    • 2019-05-07
    • 2012-12-21
    • 1970-01-01
    • 2016-09-10
    相关资源
    最近更新 更多