对 Spring Web Flow 进行负载测试

工程 | Rossen Stoyanchev | 2007 年 6 月 22 日 | ...

对 Web Flow 应用程序进行负载测试类似于对任何其他 Web 应用程序进行负载测试 - 我们将使用负载测试工具来模拟并发客户端访问量的增加,以捕获必要的性能统计数据。

对于 Web Flow,负载测试需要考虑几个重要因素

  1. 负载测试必须维护独立的“cookie 存储区域”,以便每个客户端请求都可以携带一个独立的 HTTP 会话。
  2. 我们需要一种机制来从初始响应中提取唯一的流程执行密钥,并将其用于自定义同一流程会话中的后续请求。

Apache JMeter 是一款开源性能测试工具,可以满足这两个考虑因素。

对于 1),我们在每个执行 Web Flow 功能的测试组的根目录添加一个 HTTP Cookie Manager 元素。Cookie Manager 确保每个模拟的客户端请求都可以拥有自己的 cookie,独立于其他客户端请求,从而允许 servlet 容器通过 jsessionid cookie 跟踪独立的 HTTP 会话。

对于 2),我们在启动流程的 HTTP Request 元素之后立即添加一个正则表达式提取器。提取器的目的是解析 HTTP 响应,使用我们提供的正则表达式查找某些文本,并将该文本作为变量提供给后续的 HTTP Request 元素使用。以下是一个正则表达式提取器配置示例

引用名称:flowExecutionKey 正则表达式:name="_flowExecutionKey" value="(.*)" 模板:$1$ 匹配编号:0

通过以上配置,我们现在可以在同一流程会话中属于同一流程会话的后续 HTTP Request 元素中嵌入变量 ${flowExecutionKey}。

现在让我们用它来对 Web Flow 进行负载测试。为了正确地执行具有代表性的 Web Flow 功能,我创建了一个示例 Web Flow 应用程序来模拟一个 6 步购物车的流程,收集用户的送货地址、送货选项、信用卡、账单地址、订单确认以及最后的订单摘要输入。此流程中的各个步骤包括数据绑定和验证、视图状态、操作状态、决策状态和子流程状态 - 这些都是我们期望在典型的 Web Flow 应用程序中找到的内容。但是,该应用程序使用存根而不是实际的数据库访问代码,以避免将此类数字包含在整体统计数据中。我们希望在此测试中仅关注 Web Flow 本身。

在构建应用程序并创建 JMeter 脚本后,我添加了一个聚合报告元素来记录不同负载级别测试的性能统计数据。

使用我的 Lenovo T60 双核笔记本电脑运行 Ubuntu 和 Apache Tomcat 5.5 版本作为 servlet 容器,配置为最多 150 个并发连接,我观察到以下结果

用户 90% 最大值 请求/秒 KB/秒 总请求数
20 102 596 351 380 18000
60 372 5942 338 366 18000
80 463 10287 336 364 18000
100 550 11144 315 342 18000
150 687 20691 306 332 18000

真实的负载测试应该在真实的硬件上进行,并基于真实的用例。没有替代方案。但是,我们可以从上述数字中得出某些结论。

上述数字表明,在执行核心 Web Flow 功能时,即使并发用户数量大幅增加,吞吐量仍然保持稳定。90% 用户的响应时间仍然不到一秒。随着负载的增加,最差响应时间会上升,但这并不奇怪,因为用于测试的硬件不足。

使用上述技术,您可以对自己的 Web Flow 应用程序进行负载测试。

jmeter-snapshot.JPG

swf-shoppingcart-regexp.txt

获取 Spring Newsletter

通过 Spring Newsletter 保持联系

订阅

领先一步

VMware 提供培训和认证,以加速您的进步。

了解更多

获取支持

Tanzu Spring 在一个简单的订阅中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区中所有即将举行的活动。

查看全部