这可能是重复的。
因此,我取得了一些进展。但是,我发现将参考文档从 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”类型的消息传递程序。
有什么建议么?