2017-12-11 18 views
3

私はAkka Distributed Pub/Subを使用しており、出版社とサブスクライバは1つです。私の出版社は加入者よりもずっと高速です。ある時点後に出版社を遅らせる方法はありますか?Akka Distributed Pub/Subバックプレッシャー

出版社コード:

public class Publisher extends AbstractActor { 
    private ActorRef mediator; 

    static public Props props() { 
     return Props.create(Publisher.class,() -> new Publisher()); 
    } 

    public Publisher() { 
     this.mediator = DistributedPubSub.get(getContext().system()).mediator(); 
     this.self().tell(0, ActorRef.noSender()); 
    } 

    @Override 
    public Receive createReceive() { 
     return receiveBuilder() 
      .match(Integer.class, msg -> { 
       // Sending message to Subscriber 
       mediator.tell(
        new DistributedPubSubMediator.Send(
         "/user/" + Subscriber.class.getName(), 
         msg.toString(), 
         false), 
        getSelf()); 

       getSelf().tell(++msg, ActorRef.noSender()); 
      }) 
      .build(); 
    } 
} 

加入者コード:残念ながら

public class Subscriber extends AbstractActor { 
    static public Props props() { 
     return Props.create(Subscriber.class,() -> new Subscriber()); 
    } 

    public Subscriber() { 
     ActorRef mediator = DistributedPubSub.get(getContext().system()).mediator(); 
     mediator.tell(new DistributedPubSubMediator.Put(getSelf()), getSelf()); 
    } 

    @Override 
    public Receive createReceive() { 
     return receiveBuilder() 
      .match(String.class, msg -> { 
       System.out.println("Subscriber message received: " + msg); 
       Thread.sleep(10000); 
      }) 
      .build(); 
    } 
} 

答えて

1

、現在設計されたとして、私は元に「背圧」を提供する方法があるとは思いません送信者。 ActorRef.tellを使用してメッセージをmediatorに送信するので、ダウンストリーム受信者がバックアップしているという信号を得る方法がありません。これは、使用しているメソッドtellvoidを返すためです。あなたのtellあなたは、少なくともあなたは、特定の期間内に応答を受信しないときにお知らせします適切なTimeout値を設定することができますaskに切り替えると

スイッチが

を依頼します。ストリーム

"Back-pressure" is a primary feature of akka streams

スイッチ。したがって、ストリーム実装に切り替えることで、目的の目標を達成することができます。それが可能あなたの元データからのストリームSourceを作成する場合は

、あなたはmediatorからSinkを作成するためにSink.actorRefを使用し、仲介者への流量を制御するためにFlow.throttleを使用することができます。

関連する問題