AKKA 클러스터는 게시 및 클러스터에 회원님의 사이트에 분산 가입

분산 클러스터에서 구독 게시

기본 정의

독립 실행 형 환경에서 구독 및 릴리스는 매우 일반적이지만, 클러스터 환경에서 너무 많은 문제와 가난한 구현;

AKKA가 해당 구현을 제공하고, 클러스터 환경에서 노드간에 배우, 서로의 테마의 보도 자료 활성화를 구독

키에 의존하는 미디어 배우 : akka.cluster.pubsub.DistributedPubSubMediator


구독 신청 :

DistributedPubSubMediator.Subscribe 방법 배우 로컬 중개 등록.
성공적인 구독 및 DistributedPubSubMediator.SubscribeAck 및 DistributedPubSubMediator.UnsubscribeAck 확인 응답을 취소. 이 구독 확인 메시지가 등록 된 것을 의미하지만, 여전히 다른 노드로 복제 할 약간의 시간이 소요됩니다. 노드 사이에서 발견 및 등록이 메시지를 일으킬 수있는 몇 가지 지연이 즉시 전달되지 않습니다됩니다!

출시 :

당신은 중개인의 로컬 DistributedPubSubMediator.Publish에 메시지를 보내 소식을 게시합니다.
배우가 종료되면, 그들은 자동으로 레지스트리에서 제거하거나 명시 적으로 DistributedPubSubMediator.Unsubscribe 제거 할 수 있습니다.

 

구현 예

패키지 pubsub의 

수입 akka.actor.AbstractActor의
 수입 akka.actor.ActorRef
 수입 akka.actor.ActorSystem의
 수입 org.slf4j.LoggerFactory
 수입 scala.PartialFunction
 수입 scala.runtime.BoxedUnit
 수입 akka.cluster.pubsub.DistributedPubSubMediator의
 수입 akka.actor.Nobody .tell의
 수입 akka.actor.Props가
 가져 java.time.Clock.system의
 수입 akka.cluster.pubsub.DistributedPubSub가
 가져 akka.actor.Nobody.tell의
 수입 com.typesafe.config.ConfigFactory를 


/ **  
 에 의해 * 만든 : tankx를
 * 날짜 : 7분의 2,019 / (16)
 * 설명 :发布订阅模式
 * / 
/ ** 
 *定义发布者
 * / 
클래스 펍 () : AbstractActor () { 

    개인 var에 로그 = LoggerFactory.getLogger (출판 : 클래스 된 .java) 

    var에 중재자 : ActorRef = DistributedPubSub.get ( context.system) .mediator () 

    재미 createReceive를 (우선) : 수신 { 
        반환 . receiveBuilder ()를 matchAny ( ::)를 수신 .build을 () 
    } 

    개인 재미 MSG (수신 : 모든를) { 

        log.info를 ( "派发事件: $의 MSG " )
         의 경우  (MSG는 문자열입니다) {
            mediator.tell (DistributedPubSubMediator.Publish (TOPA, MSG), 자기) 
        } 


    }

 
} 

/ ** 
 * 정의 가입자 
 * / 
클래스의 하위 () : AbstractActor () { 

    개인 var에 LoggerFactory.getLogger = 로그 (하위 :: 클래스 된 .java ) 

    재정의 재미 사전 () { 
        // 가입 등록 
        VAR 중재자 = DistributedPubSub.get합니다 (는 getContext (). 시스템 ()). 중재자 () 
        mediator.tell (DistributedPubSubMediator.Subscribe (TOPA, 자기), 자기) 

        println 메소드 ( "가입 로그인 " )
         // ActorRef.noSender ()가 가입 정보를받을 수 없습니다 DistributedPubSubMediator.SubscribeAck
         //mediator.tell (DistributedPubSubMediator.Subscribe (TOPA, 자기), ActorRef.noSender ()) 

        // 移除订阅
         // DistributedPubSub.get (는 getContext (). 시스템 ()). 중재자 (). 말 (DistributedPubSubMediator.Unsubscribe (TOPA 자기), ActorRef.noSender는 ()) 
    } 


    ) 재미 createReceive을 (오버라이드 (override) : {수신 
        반환 . receiveBuilder () matchAny ( : 수신) .build () 
    } 

    개인 재미 MSG (수신 : 모든를) { 

        경우 (MSG) { 
            이다 문자열 -> log.info ( "收到事件: $의 MSG" ) 
            입니다 DistributedPubSubMediator.SubscribeAck -> log.info ( "订阅事件: $의 MSG" )
             다른 -> log.info ( "无对应类型") 
        } 


    } 


} 

// 定义主题 
VAR TOPA : 문자열 = "TOPA"

재미 getSystem가 (포트 : INT) : ActorSystem { 

    발 설정 = ConfigFactory.parseString (
         "akka.remote.netty.tcp.port = $ 포트" 
    ) .withFallback ( 
        ConfigFactory.load ( "application_pub.conf" ) 
    ) 

    VAR actorSystem = ActorSystem .create ( "custerPubSystem" , 구성); 


    반환 actorSystem 
} 


재미 주 () { 

    var에 시스템을 = (3660 getSystem가를 ); 

    var에 subActor = system.actorOf (Props.create (하위 :: 클래스 된 .java)) 
    에 Thread.sleep ( 1000) // 让서브完全起来

//     var에 pubActor = system.actorOf (Props.create (출판 : class.java))
 //     pubActor.tell ( "안녕하세요", ActorRef.noSender ())
 // 
//     pubActor .tell ( "세계", ActorRef.noSender ())
 // 
//     Thread.sleep를 (3000) 

}

 

위의 가입이 시작되면, 다음 이벤트를 배포하는 노드를 시작

패키지 pubsub의 

수입 akka.actor.ActorRef의
 수입 akka.actor.Props는
 가져 akka.cluster.pubsub.DistributedPubSub의
 수입 akka.cluster.pubsub.DistributedPubSubMediator 

/ ** 
 tankx : * 작성하여 
 * 날짜 : 2019년 7월 18일 
 * 설명 : 
 * / 
재미 주 () { 

    var에 시스템 = getSystem가 (3661 ); 

    Thread.sleep를 ( 3000 ) 

    ActorRef : VAR 매개체 = DistributedPubSub.get (시스템) .mediator () 
  
     (1..1000에서 I ) { 
        mediator.tell (DistributedPubSubMediator.Publish (TOPA, "消息XXXXXX」), ActorRef.noSender ()) 

        에 Thread.sleep ( 2000 ) 
    } 

}

 

프로필

akka { 
  액터 { 
    제공자 = "akka.cluster.ClusterActorRefProvider" 
  } 

  클러스터 { 
    시드 -nodes = [
       "akka.tcp : //[email protected] : 3660" 
    ] 
  } 

  원격 { 
    활성화 -transports의 = "akka.remote. netty.tcp " ] 
    netty.tcp { 
      호스트 이름 ="127.0.0.1 " 
      포트 = 0 
    } 
  } 

}

 

종속 JAR

    ( "$ akkaVersion : akka-actor_2.13 com.typesafe.akka는"컴파일 ) 
    (컴파일 "akka-remote_2.13 : com.typesafe.akka $ akkaVersion은" ) 
    (컴파일 "com.typesafe.akka : akka 클러스터 -tools_2.13 : $ akkaVersion ")

 

결과 :

[. CusterPubSystem-akka.actor 55.941 : 20 2019년 7월 18일 :. 19 기본 . -dispatcher 4-] 77- pubsub.Sub은 INFO 이벤트가 나타날 메시지 XXXXXX
 2019년 7월 18일 20 :. 19 : 55.942 [custerPubSystem-Akka. . 액터 기본 -dispatcher-4] 정보 pubsub.Sub가 77- 이벤트를 수신 : 뉴스 XXXXXX

 

결론 :

배우 사이의 노드 간 AKKA 클러스터 게시 및 구독 방송 메시지는 모니터 뉴스 주제는 당신이 그것을 적용 많은 장면에 매우 편리합니다, 해당 로직을 수행하는 걱정

 

추천

출처www.cnblogs.com/tankaixiong/p/11209895.html