比如我给客户端发送10000个离线消息,他连线后,就通过for循环无间断给他发送。 那么客户端会不会自动断开连接? 以及gatewayworker服务器是否有什么影响。
这样做基本上客户端和服务端都会出问题。
从体验上来讲: 10000个离线消息全部同时发给用户,这个用户基本不会把10000个消息全部看完,假设每个消息1秒扫过也需要2-3个小时看完所有。一般只会看最新的几个或几十个。发送太多数据是一种浪费。
从性能上来讲: 第一,客户端瞬间接收10000个消息,客户端可能会直接崩溃,即使不崩溃客户端也会出现一定时间卡顿,非常影响用户体验。
第二,服务端性能损耗巨大,从存储中读取10000个消息是一个比较耗时耗内存的过程,一个用户还好,假如有成百上千个用户同时读取这么大的量,存储基本上直接死掉,整个业务直接挂掉。
cpu消耗巨大,按照你的说法for循环不间断的给一个客户发送10000条消息。每次调用接口都要消耗cpu的,如果是调用10000次接口完成这样的发送,cpu肯定会上涨,如果同时给成百上千的用户这样发送的话cpu消耗应该会非常可观。如果是调用1次接口,将10000条消息打包一次性发送cpu会节省很多。
带宽消耗巨大,10000条消息,假设每个消息大小200字节,给一个用户发送消息需要大概10000*200*8=15Mb/s的带宽才能实现秒发。如果需要同一时间给100个用户发送,需要1.5G的带宽才能实现秒发。一个idc机房出口带宽也就几十G,你算下你要花多少钱买带宽。
10000*200*8=15Mb/s
最终建议: 如果是要实现用户上线拉取离线消息,直接一个ajax请求到数据库里拉最后10条消息即可,如果用户想看更多,下拉消息框ajax继续加载上一个10条消息。这样基本上所有代价最小,性能最好,稳定性更好,用户体验更高。
这样做基本上客户端和服务端都会出问题。
从体验上来讲:
10000个离线消息全部同时发给用户,这个用户基本不会把10000个消息全部看完,假设每个消息1秒扫过也需要2-3个小时看完所有。一般只会看最新的几个或几十个。发送太多数据是一种浪费。
从性能上来讲:
第一,客户端瞬间接收10000个消息,客户端可能会直接崩溃,即使不崩溃客户端也会出现一定时间卡顿,非常影响用户体验。
第二,服务端性能损耗巨大,从存储中读取10000个消息是一个比较耗时耗内存的过程,一个用户还好,假如有成百上千个用户同时读取这么大的量,存储基本上直接死掉,整个业务直接挂掉。
cpu消耗巨大,按照你的说法for循环不间断的给一个客户发送10000条消息。每次调用接口都要消耗cpu的,如果是调用10000次接口完成这样的发送,cpu肯定会上涨,如果同时给成百上千的用户这样发送的话cpu消耗应该会非常可观。如果是调用1次接口,将10000条消息打包一次性发送cpu会节省很多。
带宽消耗巨大,10000条消息,假设每个消息大小200字节,给一个用户发送消息需要大概
10000*200*8=15Mb/s
的带宽才能实现秒发。如果需要同一时间给100个用户发送,需要1.5G的带宽才能实现秒发。一个idc机房出口带宽也就几十G,你算下你要花多少钱买带宽。最终建议:
如果是要实现用户上线拉取离线消息,直接一个ajax请求到数据库里拉最后10条消息即可,如果用户想看更多,下拉消息框ajax继续加载上一个10条消息。这样基本上所有代价最小,性能最好,稳定性更好,用户体验更高。