我有rest web服务,它基本上需要很长的时间作为一个数字,并提供无论数字是质数或不是,即纯/文本,真或假。
数以百万计的用户正在使用这项服务。
现在有一个用户正在发送非常大的数字,比如(15-20位数字/大数字),我的服务正在花时间来计算这个数字是否为质数。该用户连续发送数以千计的请求,请求的数量相同。那么如何处理同样数以千计的请求。
例如:
在请求中发送101221323232324343个数字,我的服务需要3秒来确定这个数字是否是质数。现在他每秒发送1000个请求。
如何处理此案?
发布于 2019-01-07 20:15:47
您可以利用逐出内存缓存来调整其与最大内存大小或TTL相关的参数。有关一般信息,请查看LFU cache eviction。有许多实现,我推荐Ben Manes的caffeine library,因为它的效率。您可以使用DB,但在这种情况下,它的IO可能比新的计算更昂贵,因此我可能会将缓存限制为仅限于内存。
发布于 2019-01-07 19:08:55
您可以在数据库中存储大于给定位数的值。每当收到这样的数字时,都可以将它是否为质数存储在数据库中。您还可以使用缓存来存储最后n个不同的值,因此,当请求一个数字时,您可以检查它是否太长。如果不是,只需计算。如果它太长,请在缓存中搜索它。如果它在那里,就返回它。如果它不在那里,在数据库中搜索它。如果存在,则将其添加到缓存中(并可能删除最旧的值),然后将其返回给用户。如果它甚至不在数据库中,则计算它,将其存储在数据库中,将其添加到缓存中,并将答案返回给用户。
发布于 2019-01-07 19:57:24
@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()操作可以异步完成。为什么阻塞调用线程?
https://stackoverflow.com/questions/54072996
复制相似问题