休息:如何处理数千个相同的请求

时间:2019-01-07 10:55:22

标签: java rest web-services

我有一个休息的Web服务,该服务基本上需要一个数字,并提供数字是否为质数,即纯文本/真或假。

数百万的用户正在使用此服务。

现在,一个用户正在发送非常大的数字(例如15-20位数字/大数字),而我的服务正在花时间来计算数字是否为质数。该用户正在连续发送数千个相同数量的请求。那么如何处理同样的数千个请求。

例如:

在请求中发送101221323232324343号,我的服务花了3秒钟来确定该号是否为素数。现在,他每秒发送1000个请求。

如何处理这种情况?

3 个答案:

答案 0 :(得分:3)

您可以利用逐出的内存高速缓存来调整其有关最大内存大小或TTL的参数。有关一般信息,请检查LFU cache eviction。我建议Ben Manes使用caffeine library来提高效率,有很多实现。您可以使用数据库,但是在这种情况下,它的IO可能比新的计算昂贵,因此我可能会将缓存限制为仅内存。

答案 1 :(得分:2)

您可以在数据库中存储大于给定位数的值。每当收到这样的数字时,您都可以在数据库中存储它是否为质数。您还可以使用缓存来存储最后n个不同的值,因此,当请求数字时,请检查它是否太长。如果不是,只需计算。如果太长,请在缓存中搜索它。如果它在那里,请将其退回。如果不存在,请在数据库中搜索。如果存在,则将其添加到缓存(并可能删除最旧的值),然后将其返回给用户。如果它甚至不在数据库中,请对其进行计算,然后将其存储在数据库中,然后将其添加到缓存中,然后将答案返回给用户。

答案 2 :(得分:-2)

@NotThreadSafe 
public CheckIfPrime extends Servelet  {
    private Long lastNumber;
    private Long isLastNumberPrime;

    public Long operation(ServeletRequest req, ServeletResponse res) {
        if(getNumberFromRequest(req) == lastNumber) {
            return isLastNumberPrime;
        } else {
             return checkForPrimeNumber(getNumberFromRequest);
        }
    }

}

使用同步原语来满足类的不变式和后置条件(一种方法可以是使用AtomicLong而不是Long

如果您认为请求数量过多(占用内存),请考虑使用分布式缓存。

要获得很高的TPS,请使您的应用程序具有反应性。 checkForPrime()操作可以异步完成。为什么要阻塞调用线程?