如何增强Spring Boot REST API以处理数以万计或更多的传入请求



所以我一直在准备和进行面试。在其中两次采访中,我被问到了这个问题,但我无法给出一个令人满意的答案,或者可能不是他们想听的。

问题是,让我们把各种操作技术放在一边,比如负载平衡、多个实例、数据库复制等等,你可以在你的应用程序(即REST API)中做什么改变,使其能够处理大量请求?

到目前为止,我的想法是,我们可以使任何数据库或其他API调用异步,让它们在后台的单独线程中运行,以便处理可以转移到其他请求。我的一位同事说要使用缓存来最大限度地减少对数据库的调用。

也许会增加线程池的大小,但线程成本很高,而且您只能创建这么多线程。此外,如果池中的所有线程都很忙,那么其他请求将被阻止,直到某个线程可用为止。所以,这似乎真的没有被归类为解决这个问题的方法。

总的来说,我们得出的结论是,在这种情况下,除了确保API只执行轻量级操作之外,我们真的没有什么可做的了。

我在谷歌上搜索了同样的内容,但除了操作和线程池之外,没有发现任何其他内容。

我想知道社区是否可以对此提供意见。你是如何处理这种情况的?

为了在春季获得最佳性能,您可以做很多事情。

反应式利用反应式非阻塞线程模型。当你的应用程序充当传递时,这是非常有益的,基本上,如果你收到一个rest请求,那么你的应用需要向第三方应用程序发出rest请求,利用反应式模型将允许在外部服务处理请求时重用这些线程。

无状态使您的服务成为无状态

安全性使用JWT,而不是每次都需要执行数据库查找的Oauth令牌。

缓存尽可能缓存所有内容。尽可能使用本地缓存而不是分布式缓存

DB使用像Hikari这样的快速连接池请确保您的连接池具有最佳配置。优化查询。更快的响应时间意味着有更多的线程可用于处理。

线程管理正确配置用于执行器的线程池,并对应用程序性能产生重大影响。但是,此配置必须基于系统的可用资源和应用程序的需要。

Microserice体系结构如果您正确使用微服务体系结构,每个服务将只接收与其域相关的请求,这可能会减少整个应用程序的需求。

服务器选择使用Undertow或Netty嵌入式服务器

优化JVM优化应用程序或容器的JVM内存使用情况。

首先想到的问题是什么类型的请求?为了简化,假设有两个简介,阅读密集型或写作密集型,并对两者进行详细说明。

如果应用程序是阅读密集型的:将大部分精力用于缓存。您可以在多个级别进行缓存,在REST级别完全缓存响应。还可以根据目标一致性级别在服务和存储库级别进行缓存。如果所有的请求都是针对同一个keys的,并且你的对象很小,无法容纳在应用程序的内存中,你可以使用本地解决方案,否则你需要一个缓存服务提供商来卸载缓存,比如Redis、Memcached等。我并不特别鼓励任何人,因为他们不时会改变社会的偏好。

这种方法背后的原因是,从L2(甚至主存储器)读取比达到db(实际从磁盘读取时)快几个数量级。点击此处查看更多次数

如果应用程序是写密集型的:或者以上方法是不够的,即使你在缓存,你也必须在某个时候填充这个缓存,那么根据你的CAP要求,是时候转移到一个无sql/分布式数据库了,比如MongoDB、Cassandra、ElasticSearch等等。这里有一些例子。这些数据库是专门为高吞吐量而设计的。你也可以在AWS上查看它们的等价物。可能必须对数据进行一些去规范化处理,以避免代价高昂(或者明显不受支持)的连接。

我不确定更改数据库是否在这些问题的范围内,但缓存和数据库通常是可以实现最大性能改进的地方。

祝你下次好运!

最新更新