这可能是duplicate。是否有使用“Akkling.Cluster.Sharding”在演员之间发送消息的示例?
因此,我已经取得了一些进展。但是,我认为将reference documentation from the C# API解释为期望的Akka.FSharp API具有挑战性。
有没有使用“Akkling.Cluster.Sharding”在actor之间发送消息的例子?
截至目前,我只能从我的客户端程序发送消息,而不是演员。
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内following setup明确:
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”类型的消息程序。
有什么建议吗?