当前位置: 首页 > 知识库问答 >
问题:

维特。x和Rx Java为服务调用实现缓存

曾典
2023-03-14

例如,在一个Veritcle中使用UserService,通信通过事件总线进行。来代表它:

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的解决方案有多好(因为这里是共享状态)通过使用computeIfAbent方法?

即使我们使用的是事件循环

我应该使用ReplySubject来实现缓存吗?vert的最佳实践是什么。x rx java

看起来就像缓存一样。computeIfAbsent是否在EventLoop上运行?是否安全,因为它是连续的?

很抱歉很多问题,我想我可以归结为:在Vert中实现“现金支付”服务呼叫的最佳实践是什么。x和Rx Java?

整个例子如下:

共有1个答案

赵景曜
2023-03-14

我想我在这里找到了答案:http://blog.danlew.net/2015/06/22/loading-data-from-multiple-sources-with-rxjava/ -

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

当我用地图保存的时候。放(…)显式而不是使用ComputeFabSent

作为日志,我在事件循环中,我可以安全地使用非同步现金地图

 类似资料:
  • 我正在使用RxJava和和操作符: 返回从缓存列表构建的可观察,而方法使用Retrofit获取实体。 除非两个用户快速订阅返回的可观察对象,否则这非常有效。我猜在进行第二次订阅时,第一次订阅的网络请求没有完成。在这种情况下,执行了两个网络请求。我想避免。 我尝试创建一个单线程调度程序,以便仅在第一次调用结束时执行第二次调用,但没有运气: 以及: 我曾尝试将subscribeOn调用放在可观察链的较

  • Quarkus有类似于开箱即用?(在文件中找不到任何提及) 要穿上某种服务方式, 这将在一段时间内保留/缓存prev响应,并保留调用堆栈/日志。 类似于那个Spring注释?

  • 使用RxJava,我需要将一个项目流缓冲到3个组中,但如果传入项目之间的间隔超过500ms,则刷新缓冲区。 bufferWithTimeOrCount()操作符正是我想要的,但它似乎只针对RxJS和Rx实现。NET,我需要使用RxJava来实现这一点。 是否有方法复制bufferWithTimeOrCount()的行为,并获得我对现有RxJava 1的期望。x运算符? 尝试每隔500毫秒发出一个新

  • 编译以下代码时: 我得到一个错误: 错误消息试图说明什么?还有,怎么修? 有一个相关的问题,但解决方案是修改特征<code>a</code>(在我的例子中对应于<code>可绘制</code>),但这在这里是不可能的,因为<code>可以绘制</code>来自外部库。

  • 我正在实现一个使用Swift Stack的Joss客户机调用外部服务的Lagom服务。如何缓存此信息以避免每次调用服务时都调用外部服务?

  • 本文向大家介绍SpringCloud使用Feign实现服务调用,包括了SpringCloud使用Feign实现服务调用的使用技巧和注意事项,需要的朋友参考一下 Spring Cloud Feign简介 Spring Cloud Feign也是一个基础工具类,它整合了Spring Cloud Ribbon和Spring Cloud Hystrix,除了提供这两者的强大功能以外,它还提供了一种声明式的