请问下关于推送堵塞的问题

0

你好.
问题描述:
在一个推送非常频繁的场景下,可能同一时间有N(N>5)条消息推送到web页面
现在发现会有偶尔漏掉消息的情况, 请问这个问题大概是哪个环节的问题.以及如何避免这个情况?

已邀请:

mlyykk

赞同来自:

我猜测的原因可能是因为我的web前端页面接收到数据之后做了太多其他的操作导致的.
push过来的是一段json, 然后前端页面会根据传过来的业务ID和其他参数进行判断,然后循环处理等操作,再进行不同的dom操作. 不知道是不是这个操作导致有的数据推送过来,没法更新页面dom导致的漏掉消息?
不知道我的猜测是否正确?

walkor

赞同来自:

可能的情况
1、业务问题,实际有的消息没有发送。(需要服务端把发送的消息在send前记录在磁盘上作为日志)
2、消息推送到网页了,但是因为网页js业务代码有bug导致没展示。(chrome 浏览器按f12 在network ->ws->Frames 里能看到服务端传来的数据,能确认服务端是否发送过来或者是否有缺失)
3、如果服务端推送非常频繁,并且客户端接收速度小于服务端发送速度,会导致消息挤压在内存缓冲区中(每个连接一个缓冲区),如果这种情况一直持续,会最终导致缓冲区满,导数据丢失。参考http://doc.workerman.net/315150 。如果有这种情况,运行php start.php status 里的send_fail字段会有非0的值,而且这个值一般会比较大。如果业务不能忍受丢失数据,可以监听onBufferFull,然后将数据写入磁盘,当onBufferDrain时从磁盘读出数据,继续发送。

maq

赞同来自:

如果你的场景只是瞬时流量波动比较大,平均下来相对于传输带宽还是没问题的,那么最简单的办法是扩大发送缓冲区(只要峰值别大到内存爆掉),就可以了。


但如果是平均流量比传输带宽还大,那么持续下来,多大的发送缓冲区也不够用,【写入硬盘】的办法也一样不够用,那就只能从业务逻辑层面重新规划了。

mlyykk

赞同来自:

抱歉,现在证实,并没有漏掉消息..是我web前端的处理问题. 打搅各位了.谢谢各位的热心解答.

要回复问题请先登录注册