2017-08-18 4 views
0

Veritcleで異なるサービスでUserServiceを使用すると、イベントバスを介して通信が行われます。それを表現するために :どこか別のマシン上の別の垂直方向の/マイクロサービスでVertxはRx-Javaを使用してサービスコールのキャッシングを実装します

class SomeOtherService { 

    final UserService userService = new UserService(); 

    // Mutable state 
    final Map<String, Single<String>> cache = new HashMap(); // Not Synchronized ? 

    public Single<String> getUserSessionInfo(String id) { 
     // Seems it is not save ! : 
     return cache.computeIfAbsent(id, _id -> { 
       log("could not find " + id + " in cache. Connecting to userService..."); 
       return userService.getUserSessionInfo(id); // uses generated proxy to send msg to the event bus to call it 
      } 
     ); 
    } 
} 

//。私たちが加入し、スケジューラについて決定

class UserService { 

    public Single<String> getUserSessionInfo(String id) { 
     return Single.fromCallable(() -> { 

      waitForOneSecond(); 

      log("getUserSessionInfo for " + id); 

      if (id.equals("1")) 
       return "one"; 
      if (id.equals("2")) 
       return "two"; 

      else throw new Exception("could not"); // is it legal? 

      } 
     ); 
    } 

とクライアントのコード、:

final Observable<String> obs2 = Observable.from(new String[] {"1", "1"}); 


     // Emulating sequential call of 'getUserSessionInfo' to fork in separate scheduler A 
     obs.flatMap(id -> { 
        log("flatMap"); // on main thread 
        return someOtherService.getUserSessionInfo(id) 
              .subscribeOn(schedulerA) // Forking. will thread starvation happen? (since we have only 10 threads in the pool) 
              .toObservable(); 
       } 
     ).subscribe(
       x -> log("next: " + x) 
     ); 

質問、それが共有状態であるので、(キャッシュにHashMapを使用するためのソリューションどのように良いですここでは)computeIfAbsentメソッドを使って?

我々はイベントループ&イベントバスを使用しているにもかかわらず、それはそのログイン操作(のようなgetUserSessionInfo(id)が別々のスケジューラ/スレッドで起こると仮定すると、共有状態と、可能な並行性の問題から私たちを保存しないのでしょうか?

私はReplySubjectを使用すべき代わりにvert.x + RX-javaに関するベストプラクティスは何ですか?キャッシュを実装するには?

cache.computeIfAbsentとしてルーンをイベントループで実行されたとして、それがシーケンシャルであるので、それが安全であるようだ?

申し訳ありません...たくさんクエストの私は、Vert.xとRx-Javaのサービスコール用にCashを実装するベストプラクティスは何ですか?

全例がhereです:

+0

私はここに私の答えを見つけたと思うします。http://blog.danl ew.net/2015/06/22/loading-data-from-multiple-sources-with-rxjava/ - Observable source = Observable .concat(メモリ、diskWithCache、networkWithSave) 。ファースト();私がcomputeIfAbsentを使用する代わりに明示的にmap.put(..)を使って保存すると、 – ses

答えて

0

私はここに私の答えを見つけたと思う:http://blog.danlew.net/2015/06/22/loading-data-from-multiple-sources-with-rxjava/ - 私はmap.put(..)を使用して、それを保存するときcomputeIfAbsentを使用するのではなく、明示的に

Observable<Data> source = Observable .concat(memory, diskWithCache, networkWithSave) .first(); 

をし、

とログとして私は、私が使用しても安全だイベントループによ非sychronized現金マップ

関連する問題