使用扩展:github.com/gorilla/websocket
对client的消息写与心跳如下:
```golang
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方法.
求问:如何修改才能保障消息的不丢失?
更多评论
https://baike.baidu.com/item/MQTT/3618851
4、有三种消息发布服务质量:
“至多一次”,消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。
“至少一次”,确保消息到达,但消息重复可能会发生。
“只有一次”,确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。
你需要的是这种吧?
#1