请教 高并发下 .net 返回文件下载 以及 记录来路 的效率取舍问题. 求大神.
明明俺是写程序的...但现在基本是公司全能了..有什么需求就要去满足什么需求.. 抱怨下.哈哈..
是这样,现在 需要我提供一个页面比如 : http://www.123.net/link.aspx?id=1001 这样别人访问进来, 页面就返回一个 Setup_1001.exe 给客户端. 根据提交进来的ID号, 返回文件名.代码如下:
Response.ContentType = "application/x-zip-compressed";
Response.AddHeader("ContentDisposition", "attachment;filename=Setup_"+id+".exe");
string filename = Server.MapPath(@"Setup.exe");
Response.TransmitFile(filename);
然后还要记录客户访问此页面时的来路 (Request.UrlReferrer) 然后把ID号和 来路URL记录到数据库.
数据库采用SQL 2005 使用一个简单的存储过程... 有记录就返回 无记录就写入.
功能都没有问题, 但网页编程经验不多, 想请教有经验的人, 以上方法,在高并发情况下(每天大概10W访问),能否工作正常,会不会出现客户端访问时,几秒也没有反应的情况.
比如那个返回文件给客户端下载..我不知道.net 里是怎么实现的..TransmitFile 在WINDOWS里是把文件传输交给系统去处理, 而.net 里应该是一样的? 应该不是读到内存,把数据返回给客户端这种消耗大的动作吧? 和静态地址比起来,效率如何.?
还有如果说在数据库操作那里,频繁的访问,能否造成性能下降等, 虽然我有想过分时段性操作数据库,比如每分钟只有前10秒才去访问数据库, 因为只记录来路,不统计次数等等,没必要每次都去访问数据. 但还是拿不准.
说这么多,就想问下,上面那个文件下载的代码,已经访问数据库的功能, 在面对大概每天10W访问量的时候,能否毫无压力..?
------解决方案--------------------关于“能否工作正常,会不会出现客户端访问时,几秒也没有反应的情况.”,这个其实是瞬时的压力,跟“10w”没有直接的联系。假设只有100个人下载exe文件,也可能如此。因此你的 link.aspx 文件可以限制下载线程数,例如最多只能有30个,如果超过30,那么你可以返回一个403错误。
------解决方案--------------------关于你的那个数据库操作,什么“分时段操作”是匪夷所思的。我好像是指在csdn这类地方某些帖子才会看到煞有介事地这样设计的。这个说法在这个多核多线程编程时代,明显是画蛇添足的。
如果必须记录到数据库,那么就立刻记录数据库好了。只不过,既然结果跟ashx输出毫无关系,那么你对数据库的操作可以使用另外一个子线程去操作数据库,子线程就算因数据库事务操作阻塞模式而操作数据库,也不会阻塞处理网页的主线程操作。asp.net本身处理客户端消息是多线程的,再加上你对数据库保存数据的操作也是异步的,对你的ashx应该没有什么影响。