如何增强SpringBootRESTAPI以处理数以万计或更多的传入请求?

如何增强SpringBootRESTAPI以处理数以万计或更多的传入请求?,spring,rest,spring-boot,load,Spring,Rest,Spring Boot,Load,所以我一直在准备和发布采访。我在两次采访中被问到这个问题,我无法给出令人满意的答案,或者可能不是他们想听的 问题是,让我们暂且不谈各种操作技术,如负载平衡、多实例、数据库复制等,您可以在应用程序(即RESTAPI)中做哪些更改,使其能够处理大量请求 到目前为止,我一直认为我们可以使任何数据库或其他API调用异步,让它们在后台的单独线程中运行,以便处理可以转移到其他请求。 我的一位同事说,使用缓存可以最大限度地减少对数据库的调用 可能会增加线程池的大小,但是线程非常昂贵,而且您只能创建这么多线程。

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

问题是,让我们暂且不谈各种操作技术,如负载平衡、多实例、数据库复制等,您可以在应用程序(即RESTAPI)中做哪些更改,使其能够处理大量请求

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

可能会增加线程池的大小,但是线程非常昂贵,而且您只能创建这么多线程。另外,如果池中的所有线程都很忙,则会阻止其他请求,直到有一个线程可用为止。所以,这似乎并没有被归类为解决这个问题的方法

总的来说,我们得出的结论是,在这种情况下,除了确保API只执行轻量级操作(如果这有意义的话),我们真的没有什么可做的

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


我想知道社区能否就此提供意见。您是如何处理这种情况的?

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

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

无国籍状态 使您的服务无状态

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

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

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

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

微埃里克体系结构 如果您正确地使用了微服务体系结构,那么每个服务将只接收与其域相关的请求,这将减少整个应用程序的需求

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

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

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

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

这种方法背后的原因是,从L2(甚至是主存)读取数据比从磁盘读取数据快几个数量级。多看几遍

如果应用程序是写密集型应用程序: 或者,上述方法是不够的,因为即使您正在缓存,您也必须在某个时候填充此缓存,然后根据您的需求转移到一个无sql/分布式数据库,如mongodb、cassandra、elasticsearch等。一些例子。 这些数据库是专为高吞吐量而设计的。您还可以在AWS上检查其等效项。可能必须对数据进行一些非规范化处理,以避免昂贵(或明显不受支持)的联接

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


祝你下次好运

嘿。谢谢你花时间回答这个开放式问题。嘿。感谢您抽出时间回答这个开放式问题。