先说场景,当前有一台服务器,和400台客户端。
客户端需要时时上报设备信息(电量、充电状态、任务进度等信息)。
服务端也有一定可能下发任务(或许控制某一台设备重启,或者控制某一个设备关机之类的)。
……
当前的解决方案是,服务端写了一个asp.net api接口,客户端时时上报。
原本呢,我是每秒钟上报一次的。。负荷太大了,最后降低为10秒上报一次后来改成了30秒上报一次。
而照成的后果,就是服务端下发命令变得不再及时,比如我看到设备的某个页面,需要截图,
这时候服务端下发个截图命令,运气不好,30秒后,屏幕画面早就变更了。
……
这时候我就想,有其他方案么,socket可以么,应该是实时的吧。
这个我接触的不多,只有学习的时候,做过几个tcp和udp的demo,不是太了解在负荷方面的情况。
……
写到这里,突然感觉问题有些歪了,额,socket的负荷,应该和客户端上报数据的频率有关系吧。
我假设,socket客户端上报数据的频率和http一致。
更准确的说,我保持长链接,只希望达到两个目的:(1、心跳,监控设备是否存活。2、命令的及时下发)。我不了解socket保持长链接的机制,不知道这样一直连接在一起,会不会一直有数据交流,会不会加大负荷,所以来询问一个问题。
如果有因为不懂而问的比较傻的,还请见谅唉。

解决方案 »

  1.   

    WebSocket
      

  2.   

    这种场景是需要一个tcp服务器,而不是http服务器
    如果由于其他原因一定要http的话,也可以采用websocket几百个长连接对服务器来说根本不是什么事
      

  3.   

    任务给个优先级,实时任务优先级高,优先执行。常规任务有空在执行。现实也是如此,“客户投诉优先处理,常规开发延后”也可以跟现实一样,把投诉和开发分开,一般公司也是这么做,有开发做开发的,做支持先应付投诉so,新建“支持组”---------redis,etcd,consel都行,你们“投诉”的(也就是你说常规信息上报)直接走这边。需要实时控制的,另外走。sokect,kafaka,mq,websockect,rpc都成。个人建议kafaka,mq,因为还是“分开”思路,网络复杂,最好不要直连,分开处理。当然这是异步的,这个其实没啥办法,毕竟网络在那里,延迟在那里,你就是用teamview远程管理,一样会延迟,网络不好,teamview延迟30秒不也是非常正常的
      

  4.   

    同上,     你这是在做运控嘛? 
    个人建议 搭建tcp服务器
      

  5.   

    了解一下websocket你就会知道ajax轮训和http长连接多不好用了
      

  6.   

    你这个需求 就需要 服务器推送了, 但是http 没有推送,  可以采用 websocket 或者 写个 tcp的服务端吧
      

  7.   

    1.tcp自带live机制,不过据说有坑,所以,最保险的方法,就是自己实现心跳包,实际上就是定时发一个小包就行了,这样你就能及时知道设备是否在在线,因为有时候,可能是网络故障,或者设备故障,可能性很多,你后台只需要监听客户端的包即可,超过一个时间,比如2S没有收到数据,就可以认为设备下线了.2,对于一个tcpserver来说,400个同时连接是小意思了所以,考虑你的需求,别用http协议了,直接用tcp协议吧,直接用c/s做个tcpserver就可以了