首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在REST中处理相同的并发请求

在REST中处理相同的并发请求
EN

Stack Overflow用户
提问于 2015-08-02 22:57:21
回答 2查看 1.9K关注 0票数 2

向大家问好!我要休息一下,以运动衫为基础,申请。此应用程序(由于其客户端的性质)在大致相同的时间(~2-5秒之间)接收相同的http请求(其中3-6个)。每个请求大约需要10秒来处理并带回大量数据(命中DB、执行数据按摩等)。在理想的世界中,我希望避免多次处理相同的请求,并考虑编写某种只允许唯一请求通过的请求筛选器,直到允许的请求返回时,其他请求才会被阻塞。阻塞的请求也将返回相同的数据给调用者(通过在服务器上查找缓存的响应)。

这种方法的优缺点是什么?除了改变客户端逻辑之外,还有其他更好的解决方案吗?)

EN

回答 2

Stack Overflow用户

发布于 2015-08-02 23:41:11

您可以为每个“键”创建一个要锁定的唯一对象。其中键是一些请求参数,在本例中是一个String。这样,您只需保持请求(因为同步),一旦计算完成,两个客户端大约同时获得结果。这样,客户端就不必发出多个请求,而不是首先要等待第一个客户端以缓存为主的客户端。

代码语言:javascript
复制
import java.util.HashMap;
import java.util.concurrent.ConcurrentHashMap;

public class Hold {
    private ConcurrentHashMap<String, String> holds =
            new ConcurrentHashMap<>(new HashMap<String, String>());

    // compose a "hash" for lack of better word, could append a timeout as well
    public String hashString (String string) {
        return string + "wackystuff";
    }

    public String doLongComputation () {
        // do crazy computation here
        return new String();
    }


    public synchronized String getResults (String key) {
        // give us a unique object for this key to lock on
        holds.putIfAbsent(key, hashString(key));

        // lock on that key
        synchronized (holds.get(key)) {
            // we have a non lock value so return it
            if (!holds.get(key).equals(hashString(key))) {
                // could do some timeout here
                return holds.get(key);
            }
            // the cache is empty so do the long computation
            holds.put(key, doLongComputation());
        }
        return holds.get(key);
    }

}

这只是一种狡猾的方法,在实践中的Java并发性一书中,有更健壮的方法,它在第5.19节中,代码示例可以找到这里

以下是这种方法的优缺点:

  • 客户只需提出一个请求。
  • 支持:你没有重新计算结果。
  • Pro:在串行情况下,没有单个客户端的等待时间会增加。
  • Con:在计算的过程中,您将挂起一个VM线程,这是每个客户端的情况。考虑到您已经查看了客户端,这不应该是一个问题。
  • Con:考虑一个很好的时间表来清除缓存可能很棘手。
票数 1
EN

Stack Overflow用户

发布于 2017-06-16 11:37:15

在开发与多个REST服务的集成过程中,为了避免不必要的对服务的调用,我们在接收到的响应(JSON字符串)数据库中创建了一个cash

对于每一个这样的现金记录,我们都会保存用于调用web服务的params。如果我们有一个请求,我们比较了参数与数据库中现有的。我们提出真正的请求,只为新的帕拉姆休息。另外,对我们来说也是必要的,因为有些要求不是免费的。

此外,我们还有一个param,它显示每个现金记录的验证日期(以小时(或数天)计),这样在一段时间后,如果很久以前就提出了接收免费信息的请求,我们就会自动提出一个真正的请求。

这种方法是在使用REST服务几年后创建的,它在我们的解决方案中运行得非常好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31777442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档