2017-03-16 11 views
0

duplicate 일 수 있습니다."Akkling.Cluster.Sharding"을 사용하여 액터간에 메시지를 보내는 예제가 있습니까?

따라서 저는 약간의 진전을 이루었습니다. 그러나 reference documentation from the 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 내 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"유형의 메시징 프로그램을 만드는 데 어려움을 겪고 있습니다.

제안 사항?

답변

0

샤드 노드가 샤드 액터의 유효한 호스트/컨테이너가되기를 원하면 해당 액터 유형과 관련된 샤드 영역을 실행하고 있어야합니다. Shard 된 액터로 전송 된 모든 메시지는 shardRegion 참조를 통해 전송됩니다.

첫 번째 예에서 스 니펫은 문자 메시지 만 유일한 유효한 메시지 유형이며, consumer 동작이 유일한 유효한 메시지 유형으로 문자열을 사용하기 때문일 수 있습니다.

spawnShardeddefinition에서 볼 수있는 것처럼 4 개의 매개 변수가 필요합니다. 여기서 중요한 것은 메시지를 유효한 액터/엔티티로 라우팅하기 위해 샤딩 플러그인이 요구하는 모든 정보를 해결하는 데 사용되는 함수입니다. 이 방법은 튜플 반환

  • 첫번째 요소는 샤드의 식별자를 대상 엔티티에 살고
  • 번째 요소는 샤드의 범위 엔티티 자체의 식별자이다.. 따라서 클러스터 내의 다른 모든 엔터티 중에서 엔터티를 고유하게 식별하려면 고유 한 섀드 ID/엔터티 ID 쌍을 제공해야합니다.
  • 세 번째 매개 변수는 엔티티로 보낼 실제 메시지입니다. 그 유형은 액터 동작으로 사용되는 반복적 인 루프 함수 입력의 유형과 일치해야합니다. 표시된 경우에는 일반 객체 일 것입니다.

예에서 메시지 확인자 함수는 id (identity)이므로 샤드 영역에 튜플을 직접 보냅니다. 사용자 정의 항목을 지정하려는 다른 기능으로 해당 기능을 변경할 수 있습니다.

PS : 더 많은 질문이 있으면 Akka.NET gitter channel이 도움을 얻을 수있는 곳입니다.