1

这可能是重复的。

因此,我取得了一些进展。但是,我发现将参考文档从 C# API解释为所需的Akka.FSharp API 具有挑战性

是否有使用“Akkling.Cluster.Sharding”在演员之间发送消息的示例?

到目前为止,我只能从我的客户端程序发送消息,而不是演员。

let consumer (actor:Actor<_>) msg = 
    printfn "\n%A received %A" (actor.Self.Path.ToStringWithAddress()) (box msg) |> string |> ignored

let system1 = System.create "cluster-system" (configurePort 2551)
let shardRegion1 = spawnSharded id system1 "printer" <| props (actorOf2 consumer)

shardRegion1 <! ("shard-1", "entity-1", "hello world 1")

上面的代码有效。但是,它仅适用于作为消息的字符串。我仍在努力让演员使用各种类型的消息相互发送消息。

笔记:

我得到了 Akka.Persistence.SqlServer 插件工作。

但是,我不清楚如何在 Akkling.Cluster.Sharding中改造以下设置:

open Akka.FSharp
let clusterHostActor =
    spawn system1 nodeName <| fun (inbox: Actor<_>) -> 
        let cluster = Cluster.Get system1
        cluster.Subscribe(inbox.Self, [| typeof<ClusterEvent.IClusterDomainEvent> |])
        inbox.Defer(fun () -> cluster.Unsubscribe(inbox.Self))
        let rec messageLoop () = 
            actor {
                let! message = inbox.Receive()                        
                match box message with
                | :? ClusterEvent.MemberUp      as event -> printfn "Member %s Joined the Cluster at %O" event.Member.Address.Host DateTime.Now
                                                            let sref = select (event.Member.Address.ToString() + "/user/listener") inbox
                                                            sref <! "Hello from clusterHostActor"
                | :? ClusterEvent.MemberRemoved as event -> printfn "Member %s Left the Cluster at %O"   event.Member.Address.Host DateTime.Now
                | other ->                                  printfn "Cluster Received event %O at %O" other DateTime.Now

                return! messageLoop()
            }
        messageLoop()

具体来说,我的印象是分片集群系统中需要一个分片区域,以便在参与者之间来回发送消息。

作为对这种范式不熟悉的人,我正在努力使用分片功能在两个参与者之间创建一个简单的“hello world”类型的消息传递程序。

有什么建议么?

4

1 回答 1

1

如果您希望您的分片节点成为分片参与者的有效主机/容器,它必须运行与该参与者类型关联的分片区域。所有发送到分片 Actor 的消息都通过 shardRegion 引用发送。

在第一个示例片段中,您已经证明,字符串消息是唯一有效的消息类型,这可能是因为您的consumer行为将字符串作为唯一有效的消息类型。

正如您在spawnSharded 定义中看到的那样,它需要 4 个参数。这里重要的是第一个,它是一个函数,用于解析分片插件所需的所有信息,以便将消息路由到有效的参与者/实体。此方法返回一个元组,其中:

  • 第一个元素是分片的标识符,目标实体所在。
  • 第二个元素是实体本身在其分片范围内的标识符。因此,要在集群内的所有其他实体中唯一标识实体,它必须提供唯一的 shard-id/entity-id 对。
  • 第三个参数是一个实际的消息,它将被发送到一个实体。它的类型应该与用作你的actor行为的递归循环函数输入的类型相匹配——如果你已经展示过,它可能是一个普通的对象。

由于在示例中,此消息解析器函数为id(identity),因此我们直接将元组发送到分片区域。您可以将该功能更改为您想要指定自定义内容的任何其他内容。

PS:如果您有更多问题,Akka.NET gitter 频道是您可以寻求帮助的地方。

于 2017-03-17T12:31:26.887 回答