高并发场景下JMeter线程间高效传递数据的方案咨询
租户级多用户性能测试方案优化需求
核心测试要求
每个租户需分配2个用户,执行固定业务流程:
- 每个租户完成2个用户的登录操作
- 用户1创建销售订单
- 用户2更新该销售订单
- 用户1确认销售订单
- 用户2生成报表
当前核心问题
如何区分不同租户的不同用户身份,确保每个用户精准执行对应任务,避免出现所有线程被识别为同一用户的情况。
已尝试的方案及问题
1. CSV文件读取方案(失败)
通过CSV文件存储登录信息与租户名称,但所有线程采用相同读取逻辑,导致所有线程均被识别为用户1,无法实现用户身份区分。
2. JMeter全局属性存储方案(小规模可用,大规模内存不足)
将用户的CSRF-Token和JSessionID以tenantNumber_userNumber_csrfToken、tenantNumber_userNumber_jSessionId的格式存入JMeter全局属性,通过JSR223脚本完成属性的分配与销毁:
属性分配脚本:
def lastTenantId = vars.get("lastTenantId") def jSessionId = vars.get("jSessionId") def csrfToken = vars.get("csrfToken") def baseTenantVar = "${lastTenantId}_user" if (props.getProperty(baseTenantVar + "1_jSessionId") == null) { props.put(baseTenantVar + "1_jSessionId", jSessionId) props.put(baseTenantVar + "1_csrfToken", csrfToken) log.info("Assigned User 1 for tenant ${lastTenantId}") } else { props.put(baseTenantVar + "2_jSessionId", jSessionId) props.put(baseTenantVar + "2_csrfToken", csrfToken) log.info("Assigned User 2 for tenant ${lastTenantId}") }
属性销毁脚本:
def tenantNumber = vars.get("tenantNumber") props.remove("test${tenantNumber}_user1_jSessionId") props.remove("test${tenantNumber}_user1_csrfToken") log.info("removed User 1 for tenant ${tenantNumber}") props.remove("test${tenantNumber}_user2_jSessionId") props.remove("test${tenantNumber}_user2_csrfToken") log.info("removed User 2 for tenant ${tenantNumber}") props.remove("test${tenantNumber}_SO_id") log.info("removed the sale order id for tenant ${tenantNumber}")
登录后通过If控制器判断当前凭证是否匹配对应租户的用户1/用户2身份,进而执行对应任务。该方案在50用户以内的小规模测试中可满足需求,但当支撑1000、2000、5000级别的并发测试时,全局属性占用内存过高,内存效率不足。
求助
针对大规模并发场景,有哪些可行的替代方案可以实现租户级多用户的身份区分与任务分配?
内容的提问来源于stack exchange,提问作者JustAnotherDev
相关产品推荐
相关产品推荐

