当前位置: 首页 > 知识库问答 >
问题:

用于在云中托管JavaPLAY应用程序的服务器架构

华凡
2023-03-14

这是一组问题,而不是一个非常具体的问题。在过去的几周/几天里,我对如何在“云中”正确地托管JAVA PLAY应用程序的信息感到困惑,因为很多信息分散在不同的服务上,我想把所有这些小部分集中在一起,因为很多事情都很重要,需要在完整的上下文中看到。然而,我把我的考虑转移到了问题的底部,因为它们主要是我的观点和主观发现,我不想对此负责。如果我做错了什么,请毫不犹豫地指出。

我们的场景:我们在Java PLAY框架中编写了一个非常直接的应用程序(https://www.playframework.com/),在iOS和Android上工作,并使用后端系统(用于管理、内容管理和API),将数据存储在MySQL数据库中。虽然大多数用户与服务器的交互都是快速简单的(登录、同步一些数据),但也有一些数据密集型任务(下载一些数据)

横向扩展:首先,我们的应用程序中只有1个EC2实例将在eu-1a中运行。我们需要评估一个实例实际需要多少资源,是否需要更多实例,以及更多实例是否真的有利于更快的响应时间。

跨区域的横向扩展:一旦应用程序从另一个区域产生大量用户负载,整个EC2实例应该复制并放到另一个区域,运行db读取副本(请参阅在amazon web services上设置全球可用的web应用程序和https://aws.amazon.com/de/blogs/aws/cross-region-read-replicas-for-amazon-rds-for-mysql/ ).

EC2实例的垂直扩展:在最近对旧主机设置的测试中,数据库被证明是瓶颈,而不是play应用及其服务器的硬件规格。因此,目前还不完全清楚垂直缩放会在多大程度上影响响应时间。如果是t2。微实例与m3一样好。例如,我们当然更愿意从底部往上爬。

RDS的纵向扩展:我们需要估计有多少流量到达数据库服务器,以及需要多少CPU/RAM/等。也许我们也会在这里工作。

全局重定向:使用Amazon Route 53(?)完成。Tokio的用户应该被重定向到在亚洲运行的EC2实例;从罗马到欧洲EC2实例的用户。这不仅会影响应用程序内的API调用,还会影响内容交付(双向)。

  1. 这个设置是决定性的吗?我是否缺少关键部件
  2. 关于全球重定向:Amazon Route 53是正确的工具吗?它与CloudFront有什么不同(我觉得CloudFront纯粹是用于内容/媒体分发的?)
  3. 如何为我的应用程序定义正确的数据/apiendpoint?当然,我不想在应用程序部署期间定义数据库读取副本的数据库endpoint。在AR53(问题2)设置期间也会发生这种情况吗?API调用也是如此,当然应用程序应该将调用指向https://myurl.com/api从那里它应该被重定向。这现实吗

我将非常感激各种各样的想法(!),同样关于下面写的背景信息。如果你能让我进一步阅读来解决我自己的问题,我也非常感谢——关于这一点,有大量的信息,但这使得很难缩小答案的范围。我在主机/服务器方面确实很有经验,但我非常确定,有真正的专家在等着给我一记耳光。:)

当前托管设置:负载平衡器在两台根linux服务器上分配流量,两台服务器都运行PLAY应用程序,其中一台还安装了MySQL。

目前的主机设置有3大缺陷:

  1. 没有垂直可扩展性:托管公司会为每个扩展步骤收取费用。目前服务器处于空闲状态,但如果应用程序运行迅速,我们可能很快就会出现容量不足的情况。空转时仍需支付费用,就好像永久性满载一样。这太贵了
  2. 不支持部署:目前,我们通过SSH连接,手动将正确的文件夹部署到文件系统,在服务器上重新编译,设置权限,应用数据库演化;对第二台服务器执行同样的操作(使用不同的数据库连接参数)。可能会出什么问题
  3. 没有全球可用性:在世界的另一个地区安装另一台服务器将意味着巨大的努力。我们可以创建一个数据库的同步副本,但再次部署将意味着停机时间、出错空间以及时间和金钱

Java PLAY的托管选项:关于这一点,有很多不同的博客帖子。简而言之:

  1. AWS:亚马逊网络服务是你最先开始寻找的地方之一。在这里,你可以以灵活的价格买到一切可能的东西。你给自己设置了一个EC2实例,一个MySQL RDS,你就可以开始了——所有这些都是免费的,所以你可以进行实验、玩游戏、测试你的东西

有很多选择和可能的设置/价格。尤其是在了解到使用boxfuse进行部署后(https://cloudcaptain.sh/)我选择了AWS,因为它从一个来源提供了我们所需要的一切。Boxfuse的月成本较低,但与AWS完美集成。除支持3种常见环境(dev/test/prod)外,还支持扩展。支持率很高。

共有2个答案

微生新翰
2023-03-14

>

我不确定你是否可以通过RDS在另一个区域设置读取副本,你可能必须通过在标准EC2实例上运行的MySQL服务器来设置。即使你可以,那也将是一些昂贵且高延迟的数据传输。

如果文件上传和下载是你唯一担心的,你只需要把云前线(亚马逊的CDN服务)放在你的应用程序前面,让它通过它的全局边缘服务器处理文件上传和下载。你甚至可以不用把你的整个应用程序移动到AWS就可以做到这一点。我建议首先阅读这篇博客文章。

张鸿志
2023-03-14

安装看起来不错。然而,我会做出一个改变:你的大杯-

R53可以很好地为每个最终用户选择最好的服务器。

对于EC2考虑有一个ELB自动缩放组设置。即使只是一个例子,你也可以获得永久健康监测和自动重生的好处。如果您期望更多负载,那么可以根据预期的瓶颈(cpu、网络i/o)自动扩展。这将为您提供一个更自主、更强大的设置,而不是根据您自己的监控分析手动进行上下缩放(即使如果您坚持使用不变的基础设施,缩放部分非常容易)

 类似资料:
  • 但是所有的答案和评论对链接帖子的回应也没有太大帮助

  • 我正在使用angular框架构建前端应用程序。有没有办法,我如何将应用程序部署到Azure Linux应用程序服务? 我已经用NodeJS堆栈创建了Web应用程序,并将其分配给Linux应用程序服务。我用命令构建了我的angular应用程序,并将其部署到这个web应用程序中。当我使用url:

  • 我在本地系统上安装了laravel 5.1并开发了一个应用程序。 现在我必须在一个实时服务器上托管它。我们拥有的实时服务器是我们自己的,并且在其上运行许多其他应用程序。 我刚刚将laravel文件夹放在了一个路径中(没有其他内容),但它没有像我预期的那样工作。 我读过一些答案,上面说我必须将公用文件夹复制到服务器的公用文件夹中,其余的复制到一个文件夹中,对吗? 我必须安装作曲家,并按照larave

  • 我有一个WCF服务,我试图在Sitecore 7.1应用程序中托管。具有相同配置的Web服务在空白Asp.net应用程序中托管时运行良好。但是当尝试从Sitecore应用程序运行它时,它不起作用(下面的错误)。我也尝试了这些解决方案,但没有运气。我不确定它们是否应该适用于最新版本的Sitecore。 https://adeneys.wordpress.com/2008/10/17/make-sit

  • 我想在spring应用程序中使用ManagedExecutorService。然而,spring无法注入它。降低误差。 原因:org.springframework.beans.factory.NoSuchBeanDefinitionException:找不到 [javax.enterprise.concurrent.ManagedExecutorService] 类型的合格 bean,用于依赖关

  • 我想避免使用WebViews从Google获取OAuth代币。(要求用户分享他的联系人、个人资料信息等)。为此我使用了Google Play服务API。 由于我的应用程序是基于云的(逻辑发生在云中),我必须将这些令牌保存在云中。我还必须让用户从多个设备登录(每次从新设备登录时都不需要向他询问谷歌权限) 我试图实现这个谷歌博客中提到的技术。 我尝试了博客中提到的方法。它并没有完全如我所愿工作。我还检