Java 垂直或水平扩展应用程序的策略

Java 垂直或水平扩展应用程序的策略,java,Java,我希望这里有经验的Java开发人员能够分享一些关于这个问题的见解,我们已经尝试解决了这么多个月 我们目前正在构建一个JavaWeb应用程序,该应用程序将用作其数据库。web应用程序本身基本上已经“完成”了,除了一个主要问题,即数据库的设计不是为了在水平扩展环境中使用[I可能是错误的],还有一个事实,即我们在用作应用程序服务器时受到了很大的限制 水平缩放的问题 我们的服务器不是一个典型的服务器,它只处理CRUD数据库请求,并且可以快速返回响应,它处理定制逻辑,根据逻辑的不同,这可能需要0到10秒(

我希望这里有经验的Java开发人员能够分享一些关于这个问题的见解,我们已经尝试解决了这么多个月

我们目前正在构建一个JavaWeb应用程序,该应用程序将用作其数据库。web应用程序本身基本上已经“完成”了,除了一个主要问题,即数据库的设计不是为了在水平扩展环境中使用[I可能是错误的],还有一个事实,即我们在用作应用程序服务器时受到了很大的限制

水平缩放的问题

我们的服务器不是一个典型的服务器,它只处理CRUD数据库请求,并且可以快速返回响应,它处理定制逻辑,根据逻辑的不同,这可能需要0到10秒(硬限制)。这给我们带来了一个问题,如果应用程序没有水平扩展,那么这些请求处理将成为一个“阻塞”问题。它会在几秒钟内阻止其他请求

垂直缩放的问题

考虑到第一个问题,垂直扩展是我们下一个最好的选择,但是NGINX单元(至少它的Java运行时)不能很好地处理这个问题,它的运行时只能对请求进行单线程处理。因此,即使我们扩展服务器单元的内核和内存,也只会以单线程方式处理请求,这也会造成“阻塞”问题

这让我们再次想到为什么我们不通过配置单元来生成更多进程(因为您可以将单元硬设置为允许1到n个进程)来水平扩展的概念,问题在于数据库,Jetbrains XODU由应用程序通过锁定在一个进程中的嵌入式Java对象访问。当它锁定到一个进程时,从另一个进程访问它将不起作用。因此,目前,我们以最大“1”进程运行我们的单元

我们试图通过使用堆外缓存来解决这个问题,但是数据库对象无法序列化,因此这个对象只能到达应用程序进程的堆,其他进程无法访问这个对象。他还试图研究跨多个Java进程共享对象,但这似乎不是现实

在给定的约束条件下,解决这一问题的最佳方法是什么?使用Jetbrains Xodus和NGINX装置