분산 클러스터에서 구독 게시
기본 정의
독립 실행 형 환경에서 구독 및 릴리스는 매우 일반적이지만, 클러스터 환경에서 너무 많은 문제와 가난한 구현;
AKKA가 해당 구현을 제공하고, 클러스터 환경에서 노드간에 배우, 서로의 테마의 보도 자료 활성화를 구독
키에 의존하는 미디어 배우 : akka.cluster.pubsub.DistributedPubSubMediator
![](https://img2018.cnblogs.com/blog/142846/201907/142846-20190718204136354-599405872.png)
구독 신청 :
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 클러스터 게시 및 구독 방송 메시지는 모니터 뉴스 주제는 당신이 그것을 적용 많은 장면에 매우 편리합니다, 해당 로직을 수행하는 걱정