我有一个休息的Web服务,该服务基本上需要一个数字,并提供数字是否为质数,即纯文本/真或假。
数百万的用户正在使用此服务。
现在,一个用户正在发送非常大的数字(例如15-20位数字/大数字),而我的服务正在花时间来计算数字是否为质数。该用户正在连续发送数千个相同数量的请求。那么如何处理同样的数千个请求。
例如:
在请求中发送101221323232324343号,我的服务花了3秒钟来确定该号是否为素数。现在,他每秒发送1000个请求。
如何处理这种情况?
答案 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()
操作可以异步完成。为什么要阻塞调用线程?