를 첫 번째 예에서 : 나는 첫 번째 시도가 일을해야 생각하는 이유를 위해
하나가 Route
만들 때 AdaptiveLoadBalancingRouterLike
특성에, AdaptiveLoadBalancingRounter.scala
보고있다, 이해하기 당신은 오직 하나의 루트로 보낼 라우터를 사용하고 있습니다. 내가 읽은 문서에서이 라우터는 다른 노드에서 사용 가능한 메트릭을 사용하여 가장 강렬하게 보이지 않는 노드를 선택하고 해당 노드에있는 경로에 메시지를 보냅니다. 나는 당신이이 설치를 위해보고있는 행동이 기대된다고 생각합니다.
두 번째 예에서는 클러스터 된 환경에서 BraodcastRouter
을 사용하는 것에 대한 문서에서 아무 것도 보지 못했기 때문에이 방법이 지원되는지 잘 모르겠습니다. 그런데, 내 생각 엔 비어있는 경로 목록 (Nil
)을 가지고 BraodcastRouter
을 만드는 것이 당신이 보는 행동의 원인이되는 것입니다. 그걸 BroadcastRouter(100)
으로 변경하면 다른 동작이 나타날 수 있습니다. 그러나 다시, 나는 (문서의 예제가 없다는 것을 기반으로) BroadcastRouter
을 사용하는 것이 지원된다고 (그리고 나는 틀릴 수도 있음) 생각하지 않는다.
클러스터에 브로드 캐스트 유형 라우터가 필요한 이유를 이해할 수 있도록 사용 사례를 좀 더 설명 할 수 있습니까?
편집
FWIW, 나는 다음과 같은 코드로 작업하는 일이있어. 첫째, 구성 :
akka {
actor {
provider = "akka.cluster.ClusterActorRefProvider"
}
remote {
transport = "akka.remote.netty.NettyRemoteTransport"
log-remote-lifecycle-events = off
netty {
hostname = "127.0.0.1"
port = 0
}
}
cluster {
min-nr-of-members = 2
seed-nodes = [
"akka://[email protected]:2551",
"akka://[email protected]:2552"]
auto-down = on
}
}
그런 다음, 나는 다음과 같은 코드를 사용하여 두 개의 노드 (2552의 다른 2551에 하나)를 시작 :
object ClusterNode {
def main(args: Array[String]): Unit = {
// Override the configuration of the port
// when specified as program argument
if (args.nonEmpty) System.setProperty("akka.remote.netty.port", args(0))
// Create an Akka system
val system = ActorSystem("ClusterSystem")
val clusterListener = system.actorOf(Props(new Actor with ActorLogging {
def receive = {
case state: CurrentClusterState =>
log.info("Current members: {}", state.members)
case MemberJoined(member) =>
log.info("Member joined: {}", member)
case MemberUp(member) =>
log.info("Member is Up: {}", member)
case UnreachableMember(member) =>
log.info("Member detected as unreachable: {}", member)
case _: ClusterDomainEvent => // ignore
}
}), name = "clusterListener")
Cluster(system).subscribe(clusterListener, classOf[ClusterDomainEvent])
}
}
class FooActor extends Actor{
override def preStart = {
println("Foo actor started on path: " + context.self.path)
}
def receive = {
case msg => println(context.self.path + " received message: " + msg)
}
}
내가 다음 3 "노드를"해고, 다음 코드를 사용하여 내 클라이언트 노드 : 메시지를 보낸 경우
object ClusterClient {
def main(args: Array[String]) {
val system = ActorSystem("ClusterSystem")
Cluster(system) registerOnMemberUp{
val router = system.actorOf(Props[FooActor].withRouter(
ClusterRouterConfig(AdaptiveLoadBalancingRouter(HeapMetricsSelector),
ClusterRouterSettings(
totalInstances = 20, maxInstancesPerNode = 10,
allowLocalRoutees = false))),
name = "fooRouter")
router ! Broadcast("bar")
}
}
}
, 나는 그것을보고는 모두 서버 노드의 VM, VM 당 10 배우로 수신받을.
내 라우터와 라우터의 차이점은 로컬 라우트를 지정하지 않았기 때문에 maxInstancesPerNode
에 대해 routeesPath
을 바꿨다는 것입니다. 이게 도움이 되길 바란다.
메일 링리스트에서 묻는 질문 : 메시지를 보낼 때 클러스터에 실제로 구성원이 두 명 있다는 증거를 제시 할 수 있습니까? –
전체 코드를 제공 할 수는 있지만 그래도 RoundRobinRouter가 모든 멤버에게 메시지를 보내고 (ii) 네트워크의 모든 구성원을 반복하는 "수동"브로드 캐스트가 작동하는 것 같습니다. –