2

我正在开发一个在线预订系统(细节与我的问题并不真正相关)。它主要是用 C# 和框架 4.0 开发的。我有一个数据库,其中包含产品和这些产品的可用性等内容。数据库由 Web 服务访问,后者由 Web 应用程序查询,然后将要显示的信息发送到浏览器。在架构方面没有什么太花哨的,但我对这种系统没有太多经验。这个项目很老了;它已经开发了几年,而我六个月前刚刚加入,之前没有网络编程经验。

我目前遇到并发问题。如果我打开两个浏览器窗口(任何浏览器),在两个窗口中输入相同的查询并尽可能快地在两个页面上发布,我的 Web 服务中会出现未处理的异常。一个客户端获取数据,另一个接收到错误。编辑另外,我同时使用两台不同的计算机进行了测试,但我仍然可以获得未处理的异常。

我能够将问题追溯到大约一年前实施的缓存系统。没有锁定机制,缓存使用字典(不是线程安全的)。一些 Stack Overflow 问题帮助我查明了问题以及我应该如何纠正它(例如这个那个)。

话虽如此,我正在尝试重现该问题,而无需手动单击两个浏览器窗口并希望获得同时访问相同缓存的正确时机。我试图这样做的原因是我不喜欢实施一个当我不能可靠地证明它确实有效时应该有效的解决方案。此外,有很多地方已经(糟糕地)实现了缓存,我不确定是否可以通过手动“猜测”正确的时间来测试所有这些地方。

因此,我下载了Apache JMeter,并使用连接到我的两个浏览器的Fiddler2,我可以找到创建发送完全相同请求的测试计划所需的所有 HTTP 请求。

但令我沮丧的是,即使我将线程组设置为创建 40 个并发用户,JMeter 也无法重现该问题!他们每个人都正确接收数据,并且没有一个会触发我手动执行的未处理异常。我知道这不是 cookie 问题,也不是用户代理的区别,因为我使用多个浏览器和禁用的 cookie 进行了测试。由于 HTTP 请求是直接从 Fiddler2 创建的,因此隐藏字段或 URL 重写应该不是问题,并且不涉及动态字段名称或内容。我知道 Fiddler2 有一个“重播”功能,但即使这样也无法重现问题。这让我百思不得其解。

所以,我的问题是:为什么我不能用 JMeter 重现问题?有没有比 JMeter 更好的工具(对于免费软件来说它非常完整)来做到这一点?Jmeter 不做的浏览器做了什么(除了渲染页面,这真的不是这里的问题)?

任何想法将不胜感激!

4

1 回答 1

0

当您说 2 个 Windows 时,您确定他们使用 2 个会话,具体取决于浏览器和您打开第二个窗口的方式,您不会获得 2 个会话。

你确定你复制了浏览器和服务器之间的所有流量吗?

如果您有超过 1 个请求,那么您应该检查它是否不是来自浏览器的 2 个并行 Ajax 请求,如果是,您必须知道没有一些自定义脚本 jmeter 不会重现同一会话的 2 个并行请求(资源下载除外),那可能是你的问题。

问候

菲利普·M。

http://www.ubik-ingenierie.com

于 2012-08-07T08:07:07.390 回答