我正在开发一个在线预订系统(详情与我的问题无关)。它主要是使用框架4.0在C#中开发的。我有一个DB,其中包含产品和这些产品的可用性。数据库由Web服务访问,后者由Web应用程序查询,Web应用程序又将要显示的信息发送到浏览器。在建筑方面没有什么太花哨的东西,但我对这种系统没有多少经验。这个项目很老了;它已经开发了几年,我刚刚在六个月前跳过,之前没有网络编程经验。
我目前遇到并发问题。如果我打开两个浏览器窗口(任何浏览器),在两个窗口中输入相同的查询并尽可能快地在两个页面上发布,我在我的Web服务中得到未处理的异常。其中一个客户端获取数据,另一个收到错误。 编辑:此外,我同时使用两台不同的计算机进行了测试,但我仍然可以获得未处理的例外情况。
我能够将问题追溯到大约一年前实施的缓存系统。没有锁定机制,缓存使用字典(不是线程安全的)。一些Stack Overflow问题帮助我查明了问题以及我应该如何纠正它(例如this one和that one)。
话虽这么说,我试图重现这个问题,而不必手动点击两个浏览器窗口,希望能够获得同时访问同一缓存的正确时机。我试图这样做的原因是,当我无法可靠地证明它实际工作时,我不喜欢实现应该工作的解决方案。此外,还有许多地方已经(严重)实施了缓存,而且我不确定我是否可以通过手动“猜测”正确的时间来测试所有这些地方。
因此,我下载了Apache JMeter,并使用Fiddler2连接到我的两个浏览器,我可以找到创建测试计划所需的所有HTTP请求,以发送完全相同的请求。
但令我失望的是,JMeter无法重现这个问题,即使我设置我的Thread Group来创建40个并发用户!他们每个人都正确地接收数据,并且没有人通过手动操作来触发我得到的未处理的异常。我知道这不是cookie问题,也不是用户代理的差异,因为我测试了多个浏览器和禁用的cookie。由于HTTP请求是直接从Fiddler2创建的,因此它不应该是隐藏字段或URL重写的问题,并且不涉及动态字段名称或内容。我知道Fiddler2有一个“重播”功能,但即使这样也无法重现问题。这让我感到困惑。
所以,我的问题是:为什么我不能用JMeter重现问题?有没有比JMeter更好的工具(这对于自由软件而言是完全完备的)呢? Jmeter没有做什么浏览器(除了渲染页面,这真的不是问题)?
任何想法都会非常感激!
答案 0 :(得分:0)
当你说2个Windows时你确定他们使用2个会话,这取决于浏览器和你打开第二个窗口的方式,你将不会得到2个会话。
您确定要重现浏览器和服务器之间的所有流量吗?
如果您有超过1个请求,那么您应该检查它是否不是来自浏览器的2个并行Ajax请求,如果是这样,您必须知道没有一些自定义脚本jmeter不会为同一会话重现这两个并行请求(资源除外)下载),这可能是你的问题。
此致
Philippe M。