关于webscoket开发的消息送达率

new_golang · 2019-03-25 18:23:29 · 689 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2019-03-25 18:23:29 的主题,其中的信息可能已经有所发展或是发生改变。

使用扩展:github.com/gorilla/websocket

对client的消息写与心跳如下:

func (c *Client) write() {
    pingTicker := time.NewTicker(pingPeriod)
    defer func() {
        pingTicker.Stop()
        Manager.Unregister <- c
        c.Socket.Close()
    }()
    for {
        select {
        case point, ok := <-c.send:
            if !ok {
                c.Socket.WriteMessage(websocket.CloseMessage, []byte{})
                fmt.Println("send err:", point)
                return
            }
            point.PushTime = time.Now().Unix()
            msg, _ := json.Marshal(point)
            fmt.Println(point.Content)
            writeMessage := c.Socket.WriteMessage(websocket.TextMessage, msg)
            if writeMessage != nil {
                offline(point)
            }
        case <-pingTicker.C:
            c.Socket.SetWriteDeadline(time.Now().Add(writeWait))
            err := c.Socket.WriteMessage(websocket.PingMessage, []byte("ping"))
            c.Socket.WriteMessage(websocket.TextMessage, []byte("ping"))
            if err != nil {
                fmt.Println("time out:", err)
                return
            }
        }
    }

}

正常情况下使用conn.send <- point投递消息,client都正确接收了(50ms/条 10000条) 但是客户端手动断网之后(异常离线),当pingTicker.C响应到client离线时,出现了消息丢失的情况即client最后一条消息与离线消息断层. 也就是client异常离线后c.Socket.WriteMessage(websocket.TextMessage, msg)正常发送了消息 err==nil无法触发offline方法. 求问:如何修改才能保障消息的不丢失?


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

689 次点击  
加入收藏 微博
2 回复  |  直到 2019-03-25 19:30:15
jarlyyn
jarlyyn · #1 · 6年之前

https://baike.baidu.com/item/MQTT/3618851

4、有三种消息发布服务质量: “至多一次”,消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。 “至少一次”,确保消息到达,但消息重复可能会发生。 “只有一次”,确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。

你需要的是这种吧?

new_golang
new_golang · #2 · 6年之前
jarlyynjarlyyn #1 回复

https://baike.baidu.com/item/MQTT/3618851 4、有三种消息发布服务质量: “至多一次”,消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。 “至少一次”,确保消息到达,但消息重复可能会发生。 “只有一次”,确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。 你需要的是这种吧?

是要达到这种效果,但是用webscoket的方式.主要是确保消息的不丢失.如果全部做成队列的形式,又不如轮询有效性高.

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传