Есть ли пример отправки сообщений между акторами с помощью Akkling.Cluster.Sharding?

Это может быть дублировать.

Таким образом, я добился определенного прогресса. Однако мне сложно интерпретировать справочную документацию по C# API к нужному 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()

В частности, у меня сложилось впечатление, что shard-region требуется в шардированной кластерной системе для обмена сообщениями между субъектами.

Как человек, который плохо знаком с этой парадигмой, я изо всех сил пытаюсь создать простую программу обмена сообщениями типа «привет, мир» между двумя актерами, используя функцию сегментирования.

Какие-либо предложения?


person Scott Nimrod    schedule 16.03.2017    source источник


Ответы (1)


Если вы хотите, чтобы ваш узел сегмента был действительным хостом/контейнером для сегментированных субъектов, на нем должна работать область сегмента, связанная с этим типом субъекта. Все сообщения, отправляемые сегментированным субъектам, отправляются через ссылку shardRegion.

В первом примере фрагмента кода вы показали, что строковые сообщения являются единственными допустимыми типами сообщений, вероятно, потому, что ваше поведение consumer принимает строку в качестве единственного допустимого типа сообщения.

Как видно из spawnSharded definition принимает 4 параметра. Здесь важна первая функция, которая используется для обработки всей информации, требуемой подключаемым модулем сегментирования, чтобы направить сообщение допустимому действующему субъекту/объекту. Этот метод возвращает кортеж, где:

  • Первый элемент — это идентификатор шарда, в котором живет целевая сущность.
  • Второй элемент — это идентификатор самого объекта в рамках его шарда. Таким образом, чтобы уникально идентифицировать сущность среди всех других сущностей в кластере, она должна предоставить уникальную пару shard-id/entity-id.
  • Третий параметр — это фактическое сообщение, которое будет отправлено объекту. Его тип должен совпадать с типом ввода функции рекурсивного цикла, используемого в качестве поведения вашего актера — в случае, если вы показали, это, вероятно, будет простой объект.

Поскольку в примере эта функция распознавателя сообщений — id (удостоверение личности), мы отправляем кортеж непосредственно в регион сегмента. Вы можете изменить эту функцию на что-то еще, что вы хотите указать что-то пользовательское.

PS: если у вас есть дополнительные вопросы, gitter-канал на Akka.NET — самое подходящее место. когда вы можете найти помощь.

person Bartosz Sypytkowski    schedule 17.03.2017