Ennovative Solutions 将 Quarkus 与 AWS Lambda 结合使用,通过其新产品 PURQR 提供更好的客户体验

Ennovative Solutions 是一家来自比利时迪彭贝克的 IT 咨询和服务公司。通过与包括零售业在内的众多客户合作,他们发现许多客户由于糟糕的客户体验而导致销售额下降。因此,在 2019 年,他们创建了一个名为 PURQR(通过 QR 代码购买)的新应用程序,这是一个新的云平台,配备后端应用程序和移动应用程序,用于管理零售商的实体店展厅。通过使用移动应用程序,可以执行店内分析,例如热门产品和类别、业绩最佳的销售人员等,并为最终客户提供更加个性化的体验。该平台还管理预约和客户数据,以便当他们离开展厅时,他们可以通过邮件收到他们喜欢的东西的概览。此外,PURQR 还与客户的报价系统集成。例如,其目标之一是为客户提供更个性化的后续报价,以将其转化为销售。该解决方案还保留客户信息,以进行进一步的沟通以及可能的共同销售和追加销售机会。由于扫描产品是其流程的一部分,因此可以深入了解公司可以进货的热门产品。他们的云平台可以改善客户体验并提高销售额。

他们的 Quarkus 之旅

为了开发 PURQR,Ennovative Solutions 决定采用函数即服务方法,使用 AWS Lambda 作为无服务器计算平台。当 Ennovative Solutions 的软件工程师 Dennis Baerten 开始使用 AWS Lambda 时,他将其描述为“我遇到了在 AWS Lambda 中使用常规 Java 的长时间启动问题”。他们很快意识到,在这个无服务器计算平台上使用普通 Java 将无法提供他们所追求的性能和体验。这时,他们开始寻找其他选择。

从 Micronaut 到 Quarkus

Dennis 的一位同事告诉他看看 Micronaut,这是另一个支持 GraalVM 的框架。他尝试了 Micronaut,但遇到了使其与他正在构建的应用程序类型一起工作的困难。此外,没有 Micronaut 插件可以在 AWS 中构建他的本机映像。“Quarkus 比 Micronaut 具有更多可以编译为本机(与 GraalVM 兼容)的功能和扩展”,Dennis 断言。当他开始使用 Quarkus 时,Dennis 做的第一件事就是注册 Quarkus Zulip 频道。Dennis 与 Quarkus 社区互动并建立联系,并快速获得问题的回复,甚至在 Quarkus 中发现了一些错误。他甚至能够通过 GitHub Pull Requests 自己应用修复程序,这些程序最终被合并到 Quarkus 项目中。Dennis 表示“我非常重视并对 Quarkus 社区的支持感到非常满意,该社区非常活跃”。此外,Red Hat 支持 Quarkus 这一事实对 Dennis 也很重要。他熟悉 Hibernate 和其他由 Red Hat 赞助的开源技术。他知道 Red Hat 是 IT 世界的重要参与者,因此了解这一点使 Dennis 对该技术充满信心。知道 Red Hat 是 Quarkus 的赞助商,让他对使用它来实现他的应用程序的决定感到放心。

Ennovative Solutions 在概念验证阶段尝试了 Micronaut。但是,在了解 Quarkus 及其优于 Micronaut 的优势后,他们将所有内容迁移到 Quarkus。他们认为,其中一些好处包括

  • 通过 Zulip 获得出色的支持

  • 能够直接为项目做出贡献

  • 快速创新

  • 快速的项目发布节奏,可提供快速的错误修复和新功能

  • Quarkus 密切关注 GraalVM 的发展

  • Quarkus 是一个热门话题和创新技术,在 Java 会议上经常被提及

PURQR 高级架构

PURQR 由 7 个 Quarkus 微服务组成,这些微服务目前在生产中运行。自 2019 年 10 月以来,它们一直在生产中。

大多数微服务都是基于 HTTP 的,位于 Amazon API Gateway 后面,在后端,它们都是 AWS Lambda 函数。这些微服务是

  1. 外部产品视图 - 最终消费者查看产品的功能

  2. 产品存储库 - 这是产品信息所在的位置

  3. 公司设置 - 设置公司范围参数的界面

  4. 预约 - 客户预约功能

  5. 标签生成 - 生成 Dymo 标签的功能

  6. 通知 - 用于异步电子邮件的 SQS 消费者

  7. 摘要 - 聚合所有数据以在企业所有者的仪表板上显示

以下是使用 Quarkus 和 AWS Lamdba 的 PURQR 系统的高级示意图

PURQR high-levelArch

如上面的逻辑架构图所示,基于 Quarkus 的微服务都作为 AWS Lambda 函数运行。值得一提的是,所有这些微服务都在 Quarkus 本机模式下的测试和生产中运行,Quarkus 本机模式利用 GraalVM 本机映像。为了进行本地开发和调试,他们在本地机器上使用 AWS Serverless Application Model (SAM) 在 Quarkus JVM 模式下运行这些微服务。

最后,“迁移到 Quarkus 很容易。让一切在本机模式下运行花了几天时间。开发完整的应用程序花了大约两个月的时间”,Dennis 补充道。

Quarkus 的优势

Ennovative Solutions 发现 Quarkus 是一个非常有价值且功能丰富的 Java 堆栈,具有广泛的功能,可以实现任何类型的业务应用程序。在 Quarkus 为他们提供的众多优势中,在 AWS Lambda 函数中运行 Java 应用程序而没有冷启动的缺点就是其中之一。Quarkus 快速的启动时间是关键,因为他们希望在测试和生产环境中运行时,将 AWS Lambda 函数的冷启动时间缩短到最低限度。例如,“使用 Spring 和 AWS Lambda 将会受到阻碍,因为从我的研究来看,Spring 在 AWS Lambda 中的启动时间太长”,Dennis 提到 ( 1 , 2 , 3 )。此外,根据过去的经验,他看到“使用普通 Java 和 AWS Lambda,冷启动需要 6 到 7 秒,而使用 Quarkus 则需要大约 200 毫秒”,Dennis 补充道。但是,为了更彻底地进行研究,他采用了他最简单的函数之一(没有依赖注入、日志记录),并在普通 Java 和 Quarkus 本机模式(后者是 Quarkus + GraalVM 本机映像的组合)下在 AWS Lambda 中运行它。AWS Lambda 平台报告的测量结果如下

表 1. Quarkus 和 AWS Lambda - 测量结果
指标名称 普通 Java Quarkus 本机模式

冷启动时间 (ms)

584.13

222.07

执行时间 (ms)

76.12

6.67

消耗的内存 (MB)

102

72

在上表中,您可以看到从普通 Java 到 Quarkus 本机的冷启动时间减少了 62%,从普通 Java 到 Quarkus 本机模式的执行时间减少了 91%!对于内存消耗,从普通 Java 到 Quarkus 本机减少了 29%。

通过将 Quarkus 与 AWS Lambda 结合使用,Ennovative Solutions 能够降低云资源消耗成本,其中包括 AWS Lambda、SQS、DynamoDB、Route53 等的使用。目前,PURQR 拥有一小部分客户,因此他们的月度成本非常低。但是,Dennis 提到,随着他们的客户数量增长,他们的云资源消耗成本也会增加。“随着这些成本的增加,由于 Quarkus 相比普通 Java 和 Spring Boot 更有效地利用云资源和更快的启动时间,Quarkus 的优势将会显现出来”,Dennis 说道。

作为一名 Spring 开发人员,Dennis 发现 Quarkus 非常容易学习。他提到“我花了大约 3 天的时间来熟悉 Quarkus 堆栈”。事实上,他强调快速的学习曲线也吸引了他使用 Quarkus。他还对 Quarkus 文档印象深刻,他补充说“非常好”。Dennis 认为 Quarkus 指南非常详尽,并提供了良好的详细信息。这是他选择 Quarkus 的另一个原因。

经验教训

Quarkus 可以在 JVM 模式和本机模式下运行。如果您有兴趣在本机 Quarkus 模式下运行您的应用程序,Dennis 建议您首先检查 Quarkus 是否为您的所需功能需求提供扩展。例如,如果您想访问像 Kafka 这样的内存数据网格 (IMDG),他建议您首先搜索 Quarkus 扩展,看看是否有任何与此需求相关的扩展。Quarkus 扩展可以编译为本机,因此最好在开始使用 Quarkus 不提供扩展的库来实现您的应用程序之前,检查 Quarkus 是否提供您所需的功能。如果您没有找到要使用的第三方库的 Quarkus 扩展,那么 Dennis 建议您检查 Quarkus 项目问题,看看是否已经有待处理的请求来“quark”第三方库。此外,您还需要与第三方库作者/项目核实他们是否已经有 Quarkus 扩展或正在开发一个。您不希望在花费数小时开发后才发现无法将您的应用程序编译为本机可执行文件!如果您的目标是编译为本机,您需要避免这种情况。简而言之,这里的经验教训是“首先检查是否有可用于您需要的 Quarkus 扩展”,Dennis 建议道。

他们无法将实时编码与 Quarkus 一起使用,因为此功能目前不支持 AWS Serverless Application Model (SAM) 用于在其本地机器上运行的 AWS Lambda 函数。

最后,尽管学习 Quarkus 很快,但学习 Quarkus 本机模式的内部结构更具挑战性,并且需要更长的时间才能理解。

未来

Ennovative Solutions 计划继续使用 Quarkus 进行 PURQR 的未来开发以及其他解决方案。他们对这项新技术以及社区的参与和积极参与印象深刻。关于 Quarkus 项目,Dennis 的临别想法是“干得好!继续保持良好的工作,并继续接受来自社区的工作。”

有关 Quarkus 的更多信息