.NET实现的消息推送导致服务器很卡

问题描述

通过Page.RegisterAsyncTask(asynctask);实现了消息的推送,但是当用户达到7、80的时候,服务器网络通讯就会变得很卡,有没有遇到这种情况的,怎么解决?//请求页面代码//没有消息则开始监听this.AsyncTimeout=newTimeSpan(0,0,Global.thread_sleep);//启动监听PageAsyncTaskasynctask=newPageAsyncTask(OnBegin,OnEnd,OnTimeout,null);//Registertheasynchronoustask.Page.RegisterAsyncTask(asynctask);//Executetheregisterasynchronoustask.Page.ExecuteRegisteredAsyncTasks();

publicclassListeningResult:IAsyncResult{bool_IsCompleted=false;publicHttpContextcontext;privateAsyncCallbackCallBack;privateobjectextraData;publicThreadItemit_current;publicListeningResult(HttpContextcontext,AsyncCallbackcb,objectextraData){this.context=context;this.CallBack=cb;this.extraData=extraData;}publicvoidSend(stringas_ResponseID){//SendThreadList.AsyncSend(context.Response,as_ResponseID);//Beginif(CallBack!=null){CallBack(this);}_IsCompleted=true;}//超时结束线程2014-1-16目前的方式不会走这里了,留着备用publicvoidEnd(){context.Response.Write("null");//nullit_current.Thread=null;//Beginif(CallBack!=null){CallBack(this);}_IsCompleted=true;;}#regionIAsyncResult成员publicobjectAsyncState{get{returnnull;}}publicWaitHandleAsyncWaitHandle{get{returnnull;}}publicboolCompletedSynchronously{get{returnfalse;}}publicboolIsCompleted{get{return_IsCompleted;}}#endregion}

解决方案

解决方案二:
Chrome+F12看看Network是不是死循环了?
解决方案三:
滥用轮询是任何高并发程序设计的万恶之源,而许多人则是没有这个基本的概念。只有在特定的情况下才轮询——几乎没有并发的情况下。只要是你说“我启动线程去监听啦”,这一下子就暴露出问题来了。真正的监听,使用事件驱动方式来设计,当没有请求发来时不会占用任何线程,哪里是什么“死循环、阻塞”式的?!
解决方案四:
线程(的执行部分)只运行几十毫秒就结束了(或者说就把线程归还给系统线程池了)。弄81个线程去死循环的思路,这跟实际应该具有的设计思路实在是天壤之别的。在高性能的系统中,往往要求并发处理几千甚至几万个并发客户端连接,如果都搞你这种思路,那么用128G内存、32核心安腾服务器,也可能撑不住。而用正常的异步并发处理思路,普通的个人电脑配置就够了。从编程上说,你的代码一定是非常复杂、冗余、纠结的,甚至可能会有Thread.Sleep(...)这种垃圾语句(在正常的服务中出现这种语句本身就是很荒唐的,说明开发人员实在是“没有办法”了)。正常的高并发系统异步处理的逻辑,很精简。只不过是因为需要从“画流程图上”就真正体现出回调或者事件的机制,要比那种“顺序同步、阻塞式”的逻辑稍微要多动脑筋而已。
解决方案五:
要跟网页端进行双向通讯,应该使用websocket机制(不论是windowsservice还是asp.net应用架构都支持服务器端)。基本上最近2年的浏览器都支持websocket(对ie用户来说,考虑10以上的用户吧)不要把你的服务器折腾坏了。你的服务器可以腾出大量资源去做各种“后台”统计运算,例如给成百上千类型的用户的爱好的产品排个序啥的,甚至你可以用轻量级的widnowsservice机制来服务于web客户端请求(而不需要安装IIS和启动asp.net),而不要为了尝试一些10年前的什么垃圾的“网页长连接机制”而浪费掉。
解决方案六:
引用2楼sp1234的回复:

滥用轮询是任何高并发程序设计的万恶之源,而许多人则是没有这个基本的概念。只有在特定的情况下才轮询——几乎没有并发的情况下。只要是你说“我启动线程去监听啦”,这一下子就暴露出问题来了。真正的监听,使用事件驱动方式来设计,当没有请求发来时不会占用任何线程,哪里是什么“死循环、阻塞”式的?!

这样是不是就完全否定了comet的负载能力?80个长连接就承受不了了?
解决方案七:
引用5楼PLAYROME的回复:

Quote: 引用2楼sp1234的回复:
滥用轮询是任何高并发程序设计的万恶之源,而许多人则是没有这个基本的概念。只有在特定的情况下才轮询——几乎没有并发的情况下。只要是你说“我启动线程去监听啦”,这一下子就暴露出问题来了。真正的监听,使用事件驱动方式来设计,当没有请求发来时不会占用任何线程,哪里是什么“死循环、阻塞”式的?!

这样是不是就完全否定了comet的负载能力?80个长连接就承受不了了?

comet模式即使在高频通讯的情况下也不会比websocket差多少,在低频通讯的情况下可能会更好,所以问题的根源不会出在comet。比如也是采用comet模式,比赛的时候长连接数量超过500的时候CPU利用率也就1-2%之间(当然CPU是16核心的),而且长连接涉及的业务逻辑计算量相对于其它业务逻辑算是重量级的。我举这个例子,只是想说明comet模式不存在严重的性能问题,真正的性能问题在于你的业务逻辑,与采用某种连接模式没有多少关系。我上面提到的死循环,意思是说客户端是不是在不断(即使没有数据更新的时候)的请求服务器,导致每个客户端每秒的请求数量几十或者上百。如果客户端请求数量正常,那就应该是业务逻辑本身的问题了,比如是否依赖于数据库而没有充分使用数据缓存,而且数据库压力达到了瓶颈。
解决方案八:
没有做过测试,大家好像都说得很有道理,顶贴~

时间: 2024-12-23 14:37:00

.NET实现的消息推送导致服务器很卡的相关文章

微信小程序 消息推送php服务器验证实例详解

微信小程序 消息推送php服务器验证实例详解 微信文档(靠下有个"接入指引"):https://mp.weixin.qq.com/debug/wxadoc/dev/api/custommsg/callback_help.html 设置页面("设置">>"开发设置"): https://mp.weixin.qq.com/wxopen/initprofile?action=home&lang=zh_CN 1.设置服务器域名 比如:

Android中利用App实现消息推送机制的代码_Android

1.消息推送机制 服务器器端需要变被动为主动,通知客户一些开发商认为重要的信息,无论应用程序是否正在运行或者关闭. 我想到了一句话:don't call me,i will call you! qq今天在右下角弹出了一个对话框:"奥巴马宣布本拉登挂了...",正是如此. 自作聪明,就会带点小聪明,有人喜欢就有人讨厌. 2.独立进程 无论程序是否正在运行,我们都要能通知到客户,我们需要一个独立进程的后台服务. 我们需要一个独立进程的后台服务. 在androidmanifest.xml中注

Android消息推送实现程序

1.消息推送机制 服务器器端需要变被动为主动,通知客户一些开发商认为重要的信息,无论应用程序是否正在运行或者关闭. 我想到了一句话:don't call me,i will call you! qq今天在右下角弹出了一个对话框:"奥巴马宣布本拉登挂了-",正是如此. 自作聪明,就会带点小聪明,有人喜欢就有人讨厌. 2.独立进程 无论程序是否正在运行,我们都要能通知到客户,我们需要一个独立进程的后台服务. 我们需要一个独立进程的后台服务. 在androidmanifest.xml中注册s

企业公众服务号微信红包编程是否要进入开发者模式,如果消息推送 给了别的服务器 开发模式关闭怎么办?

问题描述 企业公众服务号微信红包编程是否要进入开发者模式,如果消息推送 给了别的服务器 开发模式关闭怎么办? 企业公众服务号微信红包编程是否要进入开发者模式,如果消息推送 给了别的服务器 开发模式关闭怎么办? 解决方案 公众号,如果想要响应外部程序调用,就必须使用开发者模式 消息推送给别的服务器?我没完全弄明白你的意思. 你的程序,如果需要调用公众号的接口,必须要在该公众号中填写程序所在服务器的URL.KEY和TOKEN, 当程序调用的时候,公众号会根据这些信息来响应,通过接口推送的信息,只会出

哪位大虾对Wxv.Comet这个服务器消息推送的demo有研究?告诉我如何处理中文乱码

问题描述 哪位对Wxv.Comet这个服务器消息推送的demo有研究?告诉我如何处理中文乱码,有源码,知道的请加我QQ:278997770不甚感激! 解决方案 解决方案二:有没有高手能帮我看看.我可以把源码发给你!不要沉啊.十万火急啊.解决方案三:顶顶顶,顶上去...以后你们做B/S即时消息绝对有用的.这是非长连接的一个即时消息源码.跟网页QQ一个道理.但是是老外的作品,发中文出乱码.本人太菜看不懂其中的逻辑,连修改编码都不知道在哪里修改.哪位大哥能帮帮我解决方案四:真没人知道吗?不会吧

我做了一个消息推送系统,客户端与服务器建立长连接,但是由于客户端越来越多,服务器怎样做集群呢

问题描述 我做了一个消息推送系统,客户端与服务器建立长连接,但是由于客户端越来越多,服务器怎样做集群呢 我做了一个消息推送系统,客户端与服务器建立长连接,但是由于客户端越来越多,服务器怎样做集群呢 解决方案 这个有很多方案.首先你要说你用的是什么语言做的消息推送系统. 例如Java,还是C++,还是其他的. 另外 把连接接入与业务处理分开,那么做分布式自然很简单.内部可以使用 RPC进行通信.等级每个用户的实时地址. 解决方案二: 用java语言做的,使用的androidpn

消息推送选择什么方案对服务器压力最小?

问题描述 服务器端使用PHP+MySQL,客户端主要是Android和IOS设备,现在需要实现IM聊天的功能,涉及到消息推送.现在想到的两个方案:1.HTTP轮询,每隔一定时间(5秒)像服务器发送HTTP请求查询消息.2.使用XMPP或Socket,服务器主动推送消息请问这两种方案哪种对服务器的压力最小?(假设暂不考虑消息的实时性)感谢各位!(如果能详细说明一下就更好了) 解决方案 轮询的话 问题是 每隔几秒都要去请求 比较耗电人人网聊天 XMPP,gmail好像也是 http://www.my

交互设计:浅析手机消息推送设计

消息是提醒用户有更新的内容,可能短信.邮件.好友申请和日程安排.消息的作用在于主动提醒用户,不需要主动刷新程序或者网页去检查更新,比如 Android的sina微博,必须手动刷新程序才能更新微博或者查看好友申请.这种做法可以节省流量,对于手机包月用户而言非常有必要的.用户专注于当 前任务时,可以接收到其他应用程序推送的消息,用户可以及时处理多任务. 推送机制 最基础的方法是程序实时联网获取消息,但是程序会占用内存,频繁联网耗费电量,程序各自链接自有服务器还会占用很多进程.以轮询(poll)的 方

IBM WebSphere Cast Iron与WebSphere MQ Telemetry Transport协作实现业务消息推送

基于物联网的 WebSphere MQ Telemetry Transport(简称 MQTT)相关技术在云计算和移动设备之间架起一道桥梁,在低带宽和不稳定的移动互联网中为您提供可靠的网络服务. 云计算.移动互联网.物联网是当前最炙手可热的几个关键词,也是未来最具发展潜力的几个关键技术.云计算可以为人们提供强大的计算能力和存储能力,能够有效地解决移动设备计算能力不足和存储量小的局限性,然而实现这一切的前提是拥有良好的网络环境,包括稳定的链接和高速的传输条件.然而当前移动互联网正处于起步阶段,无法