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

bis0qfac  于 2022-11-05  发布在  Spring
关注(0)|答案(2)|浏览(171)

所以我一直在准备和安排面试,在两次面试中我都被问到了这个问题,我不能给出一个令人满意的答案,或者可能不是他们想听到的。
问题是,让我们抛开负载平衡、多示例、数据库复制等各种操作技术,您可以在应用程序(即REST API)中进行哪些更改,以使其能够处理大量请求?
到目前为止,我所想到的是,我们可以使任何数据库或其他API调用异步,让它们在后台的单独线程中运行,这样处理就可以转移到其他请求上。我的一个同事说,使用缓存可以最大限度地减少数据库调用。
也许可以增加线程池的大小,但是线程的开销很大,而且你只能创建这么多线程。而且,如果池中的所有线程都很忙碌,那么其他请求将被阻塞,直到有一个线程可用。所以,这似乎根本不属于解决这个问题的方法。
总的来说,我们的结论是,在这种情况下,除了确保API应该只执行轻量级操作(如果这有意义的话)之外,我们真的没有什么可以做的。
我在谷歌上搜索了同样的内容,但除了操作和线程池外,并没有发现其他任何东西。
我想知道社区是否可以提供他们的意见。你是如何处理这种情况的?

shstlldc

shstlldc1#

首先想到的问题是什么类型的请求?为了简化,我们假设有两个配置文件,读密集型或写密集型,并详细说明这两种类型。

**如果应用是读密集型的:**将大部分精力放在缓存上。你可以在几个级别上缓存,在REST级别上完全缓存响应。也可以在服务和仓库级别缓存,这取决于你的目标一致性级别。如果所有请求都是针对同一个keys,并且你的对象很小,不适合应用的内存,你可以使用本地解决方案,否则你需要一个缓存服务提供商来卸载缓存,比如Redis、Memcached等等。我不建议特别推荐任何一个,因为社区的偏好会不时变化。

这种方法背后的原因是,从L2(甚至主内存)阅读数据的速度要比访问数据库(实际从磁盘读取数据时)快几个数量级。查看更多次数here

**如果应用程序是写密集型的:**或者上述方法还不够,即使你在缓存,你也必须在某个时候填满这个缓存,那么是时候转移到一个非sql/分布式数据库,比如MongoDB,Cassandra,ElasticSearch等等,这取决于你的CAP需求。一些例子是here。这些数据库是专门为高吞吐量设计的。你也可以在AWS上检查它们的等价物。可能必须对你的数据进行一些反规范化,以避免昂贵的(或者明显不受支持的)连接。

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

s4n0splo

s4n0splo2#

有很多事情你可以做有最好的表现在Spring这里有几个

React式利用React式非阻塞线程模型。当您的应用程序充当传递时,这非常有益。基本上,如果您接收到一个休息请求,则您的应用程序需要向第三方应用程序发出休息请求,利用React式模型将允许在外部服务处理请求时重用这些线程。
无状态使您的服务无状态
安全性使用JWT,而不是每次都需要执行数据库查找的Oauth标记。

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

DB使用快速连接池(如Hikari)确保您的连接池具有最佳配置。优化查询。更快的响应时间意味着有更多的线程可用于处理。
线程管理正确配置用于执行程序的线程池,对应用程序性能有很大影响。但是,此配置必须基于系统的可用资源和应用程序的需要。
微服务体系结构如果您正确使用微服务体系结构,则每个服务将仅接收与其域相关的请求,这可以从整体上降低应用程序的需求。
服务器选择使用Undertow或Netty嵌入式服务器
优化JVM优化应用程序或容器的JVM内存使用情况。

相关问题