【问题标题】:Spring boot jar on azure websites performance issues天蓝色网站性能问题上的 Spring Boot jar
【发布时间】:2016-11-08 21:14:21
【问题描述】:

我有一个构建为 spring boot fat jar 的应用程序。 我根据"official" documentation 将它托管在 azure 网站中,web.config 也类似:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <handlers>
            <add name="httpPlatformHandler" path="*" verb="*" modules="httpPlatformHandler" resourceType="Unspecified" />
        </handlers>
        <httpPlatform processPath="%JAVA_HOME%\bin\java.exe" arguments="-Djava.net.preferIPv4Stack=true -Dserver.port=%HTTP_PLATFORM_PORT% -jar &quot;%HOME%\site\wwwroot\my-web-project.jar&quot;">
        </httpPlatform>
    </system.webServer>
</configuration>

应用程序在结构上是单片的,不是太大,但会进行一些映射,并且有一些层要初始化,因此本地启动时间约为 12 秒。 它在内存数据库中运行 H2 仅用于测试目的。

实际部署并让它在 azure 网站上运行从来都不是真正的问题,但存在一些真正的性能问题,至少在我的设置方面是这样。

一些感兴趣的设置:

  • 标准 S1 实例(在撰写本文时成本约为 40 美元/月)。
  • Webapp 配置为:
    • Tomcat8(不应该真的很重要,因为胖 jar 运行嵌入式 tomcat)
    • JDK 8
    • 始终开启

为了能够将这些数字与我在具有相似(但不相同)规格和价格范围的 Azure VM 上运行应用程序的设备进行比较,并在该虚拟机上运行应用程序。

以下是一些结果:

应用的启动时间:

  • Azure 网站:~2 分钟
  • 虚拟机:30 秒

冷电话:

部署/启动应用程序并让它在第二天拨打电话。

  • Azure 网站:31119 毫秒
  • 虚拟机:219 毫秒

后续调用:

在冷调用之后直接调用,但到另一个端点。

  • Azure 网站:2685 毫秒
  • 虚拟机:223 毫秒

我的问题是: 有谁知道运行托管在 azure 网站上的 spring boot fat jars 是否可行? 由于有来自 Microsoft 的官方文档,人们会认为它是,当然在技术上它是,但它在生产中是否可行?

我并没有真正讨论过 AWS、Azure 和 Google App Engine ....., 或编写战争/罐子或如何托管它。

我有理由这样想。如果不可能,我还有其他选择,但想先探索一下这个想法,看看是否有其他人有更好的经验?

编辑:只是为了添加信息。所有调用的数据库都是空的。因此,这不应该增加任何开销。没有数据实际上是只获取空列表。

【问题讨论】:

  • Azure 应用服务 (PaaS) 与属于不同类型 Azure 服务的 Azure 虚拟机 (IaaS) 比较没有正确答案。由于MS选择不同的硬件和软件来构建这些服务,我认为在相同的硬件和软件下不进行任何测试是没有意义的。请参考链接Azure Pricing了解它们之间的区别。
  • @Peter Pan 不,这不是一个“公平”的比较。但他们之间的比较并不是真正的问题。进行比较是为了提示在“类似情况”下的调用时间应该是多少。与运行 azure 网站的实例相比,我要比较的 VM 在规格上相差不远。如果我这样说:我对应用程序的调用相当简单。 2685ms 对于这种调用来说是一个荒谬的时间。我想在 azure 上运行的 VM 上对其进行测试,看看我是否做错了什么,但 VM 的响应更符合我的预期。
  • @PeterPan 我强调了实际问题的部分,以便更清楚我的要求。
  • @alefr 我有/有相同的用途。我从azure team 得到的答案是,将linux webapp 用于opensource 比较windows webapp 更好。在那里使用容器很容易部署,但对于java,您需要带上自己的custom container。如果您对azure webapp 上的 java 速度慢有任何其他解决方案,请分享:)
  • @oak 这很有趣。我没有听说过带有容器的 Webapp(我们从 webapps 转移到其他套件)。我们今天通常将我们的应用程序/服务打包在一个 docker 容器中,对于其中一些容器来说,这似乎是一个很好的匹配。考虑到这看起来值得探索的时间。

标签: spring-mvc spring-boot azure-web-app-service


【解决方案1】:

虽然这是一个老问题,而且我的答案并不有价值,因为我对 Azure 一无所知,但我想分享我的研究成果。我有几个 Spring Boot 微服务和一个相对较大的服务(我的本地机器上的 170 MB fat jar 在大约 70 秒内启动)。 Azure 在数十(如果不是数百)秒内启动小型微服务......我的意思是非常小的微服务(来自 Spring Cloud 的配置服务器的示例等......那里没有什么特别的事情)。如果涉及到大的 - Azure 启动它并在 2 分钟后......再次启动它......一次又一次......一次又一次。结果它永远不会开始。

这一切都在 B3 应用服务计划中。这么大的计划。

最后,在我(非常主观)看来 - Azure 不是 Java 应用程序的可行选择。

【讨论】:

  • 感谢您的回复 Piotr。我们自己运行了几个测试,我们有最简单的休息服务(只是直接从内存中响应,没有缓存的序列值)。我们设置了一个 ping 服务,以不同的时间间隔调用其余端点,并根据 ping 的时间间隔看到不同的结果(尽管为站点启用了 always on。转移到我们没有的 azure VM'不会遇到这些问题。因此,最终我们使用虚拟机和负载均衡器以及废弃的 azure 网站设置了自己的基础架构,这不是一个可行的选择。
  • 为了扩展我的评论,我们让 ping 服务在每个间隔运行几天。如果有人有兴趣,这些数字是可用的。太糟糕了,Azure 网站提供了很多不错的功能,例如部署槽、暂存环境、开箱即用的红/绿部署。虽然设置我们自己并不太麻烦(而且我们的服务现在无论如何都不能与网站一起使用,因为我们已经迁移到容器化环境),但为您完成它总是很好:)
【解决方案2】:

关于运行托管在 Azure 网站上的 spring boot fat jars 的问题是可行的,请参阅我对 SO 线程 Deploying Springboot to Azure App Service 的回答,并关注官方的 document 对于 spring boot 部分。

希望对您有所帮助。有任何问题,请随时告诉我。

【讨论】:

  • 感谢@PeterPan 的回复。我通读了您链接的帖子,但我的问题不是实际部署。我已经完成了所有工作,并使用了官方文档来使其正常工作。所以没关系。我想知道的是是否有人让它在生产环境中工作,因为网站调用时间太长而无法实现(我测试的 vm 使用相同的内置 jar 并且具有合理的调用时间)。我知道如果需要的话,我可以发起一场战争并进行测试,但此时我更感兴趣的是了解胖罐。
  • 就目前而言,我最好的选择似乎是测试在使用 tomcat/jetty 的 azure 网站上托管战争是否效果更好,或者如果我想坚持使用 fat jar 方法,则远离 azure 网站。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多