Есть ли пример отправки сообщений между актерами с использованием "Akkling.Cluster.Sharding"?
Это может быть дубликатом.
Таким образом, я добился определенного прогресса. Однако мне сложно интерпретировать справочную документацию из API C# в нужный API Akka.FSharp.
Есть ли пример отправки сообщений между актерами с использованием "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()
В частности, у меня сложилось впечатление, что в системе с сегментированными кластерами требуется шард-область для отправки сообщений между актерами.
Как человек, который является новым для этой парадигмы, я изо всех сил пытаюсь создать простую программу обмена сообщениями типа "привет мир" между двумя участниками, используя функциональность шардинга.
Какие-либо предложения?
1 ответ
Если вы хотите, чтобы ваш осколочный узел был допустимым хостом / контейнером для осколочных актеров, он должен иметь область осколка, связанную с этим типом актера. Все сообщения, отправляемые застрахованным субъектам, отправляются через ссылку shardRegion.
В первом примере фрагмента вы показали, что строковые сообщения являются единственными допустимыми типами сообщений, вероятно, потому что ваш consumer
Поведение принимает строку как единственный допустимый тип сообщения.
Как вы можете видеть в spawnSharded
По определению, требуется 4 параметра. Здесь важен первый, который является функцией, которая используется для разрешения всей информации, требуемой подключаемым плагином для маршрутизации сообщения действительному субъекту / субъекту. Этот метод возвращает кортеж, где:
- Первый элемент - это идентификатор шарда, в котором живет целевая сущность.
- Второй элемент - это идентификатор самой сущности в области ее шарда. Таким образом, чтобы уникально идентифицировать объект среди всех других объектов в кластере, он должен предоставить уникальную пару shard-id / entity-id.
- Третий параметр - это фактическое сообщение, которое будет отправлено объекту. Его тип должен соответствовать типу входных данных функции рекурсивного цикла, используемых в качестве поведения вашего актера - в случае, если вы показали, это, вероятно, будет простой объект.
Так как в этом примере эта функция распознавания сообщений id
(идентичность), мы отправляем кортеж непосредственно в область шарда. Вы можете изменить эту функцию на любую другую, которую вы хотите указать что-то свое.
PS: если у вас есть дополнительные вопросы, вы можете обратиться за помощью к каналу Akka.NET.