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

mlyykk

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

2839 4 0
4个回答

mlyykk

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

  • walkor 2018-04-27

    只能自己去验证是否正确,别人肯定不知道的

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时从磁盘读出数据,继续发送。

  • mlyykk 2018-04-27

    应该是第三种情况,刚研读了一下帮助文档关于onBufferFull和onBufferDrain的,但还是不知道如何下手写这个数据,不知道能否给一个简单的示例. onBufferFull的参数里并没有data数据,那我从何处保存这个数据?直接跟onMessage一样保存post过来的数据吗? 另外,如果我把maxSendBufferSize的值设置的足够大能解决问题吗?

  • maq 2018-04-27

    onBufferFull 是在上一次 send 之后发现缓冲区满了触发的(但上一次 send 的数据并没有丢失),所以这只是一个通知,用于提醒你暂时不要再 send 了。

  • walkor 2018-04-27

    @3346 说的对

  • walkor 2018-04-27

    maxSendBufferSize 太大,如果客户端接收速度慢,服务端一直发送maxSendBufferSize还是会满。maxSendBufferSize太大如果buffer满了,也会导致程序占用内存变大。

maq

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

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

  • mlyykk 2018-04-28

    是的,我的场景就是会瞬间可能比较多条推送,但总体不算很大.只是瞬时的时候会丢失一些数据. 我现在处理一下web前端的dom操作流程优化,再扩大一下maxSendBufferSize的值试试.

mlyykk

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

  • 暂无评论
年代过于久远,无法发表回答
🔝