• 墙角儿的花
    2019-10-14
    有个大佬给我讲,用websocket在弱网下因为网络阻塞,tcp滑动窗口,不断断网重连,websocket自己又有自己的心跳机制,导致服务端压力很大,云云,我还没搞明白究竟什么意思。难道tcp本身不也是这样?

    作者回复: 网络阻塞和滑动窗口都是底层传输层的事情呀,和上层的websocket没啥关系,如果有由于传输内容大导致拥塞的问题需要解决的是websocket封装的业务内容是否足够精简,是否需要进一步压缩,和websocket本身无关。websocket自带的心跳机制浏览器很多并不自动支持,所以一般都是自己应用层来实现,自带的心跳机制只要服务端过滤掉也并不会影响连接本身的稳定性。所以最好还是通过双端抓包来具体分析,也有可能是由于链路中间的反向代理等服务导致的。

    
     3
  • 墙角儿的花
    2019-10-14
    回答问题,关闭清除客户端连接和待ACK列表

    作者回复: 👍

    
     2
  • lecy_L
    2019-10-15
    老师,我现在有个这样的在线教育的场景。实时性要求极高,延迟要在200ms以下,直播是用第三方的通道,鼠标互动等是自己的socket服务。如果采用发布订阅模式的话,队列会成为单点极有可能延迟高,有其他的设计方案参考吗?场景是房间教学,一个房间有几个或者10来个人
    
     1
  • lecy_L
    2019-10-14
    咨询个问题,望解答。
    网关机记录用户和链接的信息,finnal在jvm里面的。现在我有一个这样的场景,一个房间(类似群聊)有N个用户,按照上面的说法我要怎么链接到同一个服务器(多应用情况),或者是怎么通知其他链接?在线等,急

    作者回复: 直播那一章课程里有讲到哈,简单的话就用redis的发布订阅就可以。所有网关机订阅所有房间消息,各网关机认领本机维护的房间用户信息并下推。

     1
     1
  • yangzi
    2019-10-14
    回答问题:如果多次下推仍然没有成功,关闭客户端连接,将未回执的消息存储为离线消息。

    作者回复: 有点小问题:离线消息建议在消息存储完后就存上,这样离线buffer里的消息是连续的,便于后续检查获取。另外还需要清除 待ack列表中这条消息。

    
     1
  • Lamont
    2020-02-04
    WebSocket 长连接部分第一、三个代码块括号不匹配.

    核心消息收发逻辑处理部分最后一个代码块括号不匹配.


    
    
  • greensky01
    2020-02-03
    老师,“应用层心跳”一节中的代码示例:

    var self = this;
    this.timeoutObj = setTimeout(function () {
        ...
        self.serverTimeoutObj = setTimeout(function () {
             ...}, self.timeout)
        }, this.timeout)
    }

    请问这里的外层的 self = this 是为了什么?
    展开
    
    
  • 杨成龙
    2020-01-21
    老师,咨询个问题。为啥代码中,即使用了消息发送,也使用了下推消息(发送redis topic,然后监听到了topic之后,下推消息),那这样客户端岂不是会收到两遍消息?

    作者回复: 针对发送方设备,不需要回推这条消息,但是需要能更新最新一条消息的“版本号”或者“时间戳”,因为这个是在服务端才生成的,这样发送方设备就就能正确更新本地的消息“版本号”了。

    
    
  • overland
    2020-01-04
    运行起来现在心跳这块感觉有问题,每隔六分钟就主动断开连接了,那这样心跳就没意义了吧,有谁能帮忙回答下吗
    
    
  • overland
    2020-01-04
    请教老师个问题,demo上的将查询总未读数删掉,然后心跳机制,就六分钟自动断开了,为什么呢,心跳每两分钟发消息,难道不是有消息传输吗,求老师解答
    
    
  • rachel.li
    2019-11-06
    老师你好,我电脑redis已经启动,但是项目启动的时候报错启动不了redis。debug查看了错误说creating server tcp..........no such file or directory,然后谷歌了按网上的办法重新按顺序重新连接redis,启动项目还是报那个错,但是我其他项目是正常的。您有什么思路不

    作者回复: 你说的这个是示例代码运行的问题吗?示例代码默认会通过embedded 的方式在jvm里自动启动一个兼容redis协议的模拟redis供使用。如果本机还额外起了redis的话需要看下端口是否存在冲突。

    
    
  • 铁柱
    2019-10-28
    ack机制里提到“服务端会在这个连接维度的存储里,初始化一个起始值为 0 的序号(tid)”,但是老师您的代码里实际上所有的channel是公用一个websockethandler,也就是使用同一个对象,那么这个concurrenhashmap实际上是被所有连接共享的吧,这样设计难道不会造成ack消息确认被覆盖吗(eg:channel1中tid为1的ack被channel2中tid为1的ack确认覆盖了)

    作者回复: 嗯,看了一下确实存在这个问题,感谢反馈,最新代码已经修复这个问题啦,把待ack列表放入到channel的attr里面了,避免复用导致混乱的问题。

    
    
  • joylee109
    2019-10-14
    老师,你好。websocket 想服务器传送数据的时候, sender_id 是明文传送嘛?现在用户已经登录了网站,认证方式可能是:session ,或者 jwt 方式,或者其他方式。既然用户已经登录,为什么还要在传送数据到后端的时候,将sender_id 明文带上呢?感觉明文传送 sender_id 到后端不安全。

    作者回复: 对于经过认证的用户,实现上可以不需要再带上发送方uid,这里是想网关机不依赖认证信息,实现上网关机从session获取完全没问题。另外这里只是个演示demo,线上的话起码会走tls的wss协议。

    
    
我们在线,来聊聊吧