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です:
私はここに私の答えを見つけたと思うします。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