关于asp.net下业务调度的问题,请高手指点

arcore 2008-01-16 06:41:21
现有一B/S结构的项目,asp.net平台,C#开发。在业务处理那块,适当的进行了一些抽象,分出了业务层和数据防问层。

现在的问题是:要求上万人能同时在线访问,而我在网上查了相关的资料,自己写一个基于TCP的Server是较理想的选择,用IOCP则是最优方案;但是我们现在要马上用,临时改已经来不及了,所以想在IIS和现有的项目上下点功夫,看有没有方法提升性能。

在连接上,以IIS的性能,要达到上万,估计不可能。于是,我想到,是否可以让业务处理那一块再优化一下,采取线程池的方式,用一个单独的线程来调度工作线程进行业务处理,处理完了,再返回给客户端?

于是乎,产生一个问题:
在Web Server端,收到一个请求,再把请求调度线程,由调度线程来决定如何执行或是什么时候扫行请求的业务处理,但是,如何返回给客户端呢?如果是自己写基于TCP或是用IOCP的Server,比较好处理,因为是有Socket Handle的,但是在Web上面,如何返回在工作线程中处理完了的结果给不同的客户问IE?

小弟对.net并不熟悉,请大家指点,先谢了。
...全文
156 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
arcore 2008-02-26
  • 打赏
  • 举报
回复
bingdian37
======多谢。

希望大家多提意见。
cat_hsfz 2008-02-26
  • 打赏
  • 举报
回复
你的业务真的那么耗时吗?如果一般数据库操作,那么没必要调度。如果你要把视频压flv,或者类似的耗时操作,建议你分离。
lishijie910123 2008-02-26
  • 打赏
  • 举报
回复
好东西,学习
wpasp 2008-02-26
  • 打赏
  • 举报
回复
创建一个高性能的并发web应用程序,需要调节的地方很多。一个最主要的因素是代码中是否有效的使用了.net提供的性能辅助特性。

比如适度的使用Cache、Application管道、DLL库的静态成员可以明显的从根本上增大效率。

另一个是将常用的页或数据生成静态html页面,省去每次访问都需要解析的过程。

如果你的数据会很多,并且对每一个请求都要很高的稳定性,可以使用MSMQ(消息队列)辅助。再下来就是将你的web应用分布到多台服务器,建立负载均衡的计算机群。
wxdxy 2008-02-18
  • 打赏
  • 举报
回复
有多核思想
bingdian37 2008-02-18
  • 打赏
  • 举报
回复
关于IIS的连接数,听说不是太多啊
不过万人在线和万人并发,不太一样啊

要加速应用程序

1是在程序本身下功夫
适当的使用缓存
加快asp.net管道处理速度

缓存就不说了,对于asp.net的处理速度
以你上面的JobManager为例,感觉没有必要放到aspx文件里面
如果放到httpmodule里面完成,效率会好很多,因为http处理管道可以在httpmodule层就结束,避免了aspx文件的解析.
至于浏览器访问的地址,可以是一个虚地址,比如myjobManager.aspx,然后你在httpmodule里拦截这样的请求,进行处理,直接返回.

至于结果如何返回,可以考虑xmlhttp定时访问服务器,看有没有结束处理,如果已经结束处理,则取回结果,定时访问的时候,可以考虑使用退避指数来动态改变访问间隔,避免服务器压力恶性增长

2.硬件啊
分布到多台服务器上,毕竟一台服务器能力有限啊

自己的一点拙见,希望对你有所帮助.
mobin4211 2008-02-18
  • 打赏
  • 举报
回复
不懂,帮你UP下
arcore 2008-02-18
  • 打赏
  • 举报
回复
up up
arcore 2008-01-26
  • 打赏
  • 举报
回复
up
arcore 2008-01-21
  • 打赏
  • 举报
回复
To qq22345111:

谢谢回复。你的意思我明白,但是并没有解决我的问题。

Web Server有很多业务要处理,比如说,有Job1, Job2, Job3。可以抽象一个业务处理类Job,它有一个DoJob方法,来实现业务逻辑以统一的方式去处理与返回。

现在,假如我有一个JobManager.asps,JobManager.cs里面定义了一个“业务调度”类JobManager,JobManager类的内部管理了一个Job列表和线程池,来实现业务队列管理和工作线程的调度。每一个工作线程(Job Thread)的线程函数里面调用了Job类的DoJob方法。


这样,对于每一个客户端的请求,不管以何种方式,最终都会到达JobManager,进入工作队列,再进入线程调度,再进入工作线程,到达Job.DoJob方法。我现在的问题是,DoJob方法执行完成以后,它应该怎么把结果返回到特定的客户端IE?这个问题不是设计上的问题,而是编码上的问题,比如,是用HTTPResponse的什么什么方法么?等等。。。

请指点。
qq22345111 2008-01-17
  • 打赏
  • 举报
回复
比如说,有三台电脑,一台Web Server,一台Client1和一台Client2,现在,Client1和Client2具有不同的业务功能,并同时访问WebServer。在Web Server端,收到Client1和Client2的请求以后,开工作线程进行业务调度,等工作线程把业务请求执行完了,调度线程(或工作线程)如果知道应该返回给哪一个Client呢?

这个东西可以这样考虑,比如,Client1只是执行Client1的工作
Client2只是执行Client2的工作
同时,Client1要传递一个参数或者业务给Client2,但是,这个中间有一个Web Server
来实现中转,那么Web Server的工作压力就很到,这样就形成了一个新的模式,单一的接口登陆Web Server,
Web Server三分(IIS单独使用一个服务器,数据库放开,应用程序放开)就可以实现减小压力了;
如果说你想知道 等工作线程把业务请求执行完了,调度线程(或工作线程)如果知道应该返回给哪一个Client呢?
这个问题的方法是,在Web Server建立一个halsh表,用来存放调度线程(或工作线程)的请求以及要达到的Client
,这样就可以唯一的确定,你是从什么地方发出的请求并且要到达那里;这样就可以认为,各个Client之间在没有相互调度线程
的时候是独立的......既相互独立又相互完整!
问题就解决了!
arcore 2008-01-17
  • 打赏
  • 举报
回复
To : lihongdian

你可以建立一个Web site试一下,里面就一个First.aspx文件,啥也不做,就显示一些文本内容。然后,用几台电脑,开压力测试软件(1000线程),同时访问Web site,你看看客户端有什么结果。

我们这里,测试的结果很不理想。
arcore 2008-01-17
  • 打赏
  • 举报
回复
其实,小弟想问的是:

比如说,有三台电脑,一台Web Server,一台Client1和一台Client2,现在,Client1和Client2具有不同的业务功能,并同时访问WebServer。在Web Server端,收到Client1和Client2的请求以后,开工作线程进行业务调度,等工作线程把业务请求执行完了,调度线程(或工作线程)如果知道应该返回给哪一个Client呢?
arcore 2008-01-17
  • 打赏
  • 举报
回复
To : lihongdian

你说的是DBMS的连接池管理吧?

IIS的连接与Socket相关的,我在网上找了一些资料,说IIS的Socket连接数是比较少的。

如果IIS的Socket达到上万的话,不是不能用,而是很快请求都在队列里了,反应时间很慢,客户端经常要等很长时间。

所以,我想加快在业务处理那一块的效率,比如说,以前业务那一块1s可以处理100个业务,现在加上业务调度来并发处理业务,可以1s处理1000个,这样,就大大加快了反应时间。
lihongdian 2008-01-16
  • 打赏
  • 举报
回复
上万人的连接在IIS看来也不是什么难事啊,

并不需要什么线程池去处理.IIS连接池设置好就可以了.

在连接的时候设置属性

Max Pool Size=100000; // 最大连接池数

Min Pool Size=0; // 最小

Connection Lifetime=0;

packet size=32767;

Connection Reset=false;

async=true // 实现异步

在连接的地方写上这些代码即可: 如shangducms 的 db.cs

SqlConnection   con   =   new   SqlConnection("server=(local);database=&qapos;"   +   database   +   "&qapos;;uid=&qapos;"   +   uid   +   "&qapos;;pwd=&qapos;"   +   pwd   +   "&qapos;;Max   Pool   Size=100000;Min   Pool   Size=0;Connection   Lifetime=0;packet   size=32767;Connection   Reset=false;   async=true"); 


就可以优化了.如果还有问题,,可以设置一台服务器专门进行数据层的访问和数据库的放置,再建立一个webservice与主服务

器连接.将webservice编译成dll方法调用就可以了,即保护了数据库的安全,,又防止网站应访问连接多而出现的打开缓慢

的现象..并且建议你查阅一下.net的优化方案,,可以保证上万人浏览没有任何问题.
沅江汐水 2008-01-16
  • 打赏
  • 举报
回复
缓存。。

cookie可以减少服务器的压力
cloudgamer 2008-01-16
  • 打赏
  • 举报
回复
用缓存

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧