【问题标题】:Is It Necessary to Add Ack Mechanism To Websocket Server?Websocket服务器是否需要添加Ack机制?
【发布时间】:2023-04-03 14:35:01
【问题描述】:

我们正在通过golang+gin+json+gorilla websocket构建一个websocket服务器,将消息从服​​务器端推送到浏览器。

我们计划为前端提供一些订阅命令,这意味着来自服务器端的消息将发送给订阅目标主题的用户。

我的困惑是我们是否需要在这里添加 Ack 机制?例如,当客户端订阅一个主题时,服务器保存了这个映射:用户 --> 主题。

服务器是否有必要为每个订阅请求向客户端发送响应(就像我们对 RPC 请求所做的那样)?以及如何做到这一点?下面是我的消费

type MsgHeader struct {
    ReqId string  `json: reqId`
    Cmd   string  `json: cmd`

    // either of "req" or "rsp"
    // is it necessary to have this field???
    Type  string  `json: type`            
}

我的意思是应用程序级别的确认,就像我们对 RPC 请求所做的那样。对于 RPC 请求,即使响应本身为空,我们也会发送响应,例如:

type SubscriptionRsp struct {
     Code int
     Msg  string
     Data interface{}
}

【问题讨论】:

  • 什么样的Ack?如果你的意思是简单的数据包/消息确认,那已经内置在 TCP 中,它是 websockets 的基础。
  • 我的意思是应用程序级别的确认,就像我们为 RPC 请求所做的那样。对于 RPC 请求,即使 body 为 nil,我们也会发送响应,告诉用户订阅是否成功@HymnsForDisco
  • 是否需要确认应用程序的特定功能取决于应用程序本身。客户端可能在没有确认的情况下正常运行。它可能不能,或者不应该。这完全取决于服务和客户端的设计方式。

标签: go websocket gorilla go-gin


【解决方案1】:

不,没必要。

Websocket 规范 (RFC 6455) 没有强制要求。

一个数据帧可以由客户端或服务器在 在打开握手完成之后和该端点之前的任何时间 已发送关闭帧

Sending and Receiving Data 部分中没有提及其他有关确认消息的内容。

因此,任何 ACK 都完全是您的应用程序的实现细节。如果您开发一个有弹性的客户端来重试失败的消息,这可能会很有用,其中“失败”可能是一条成功发送到服务器但未按预期处理的消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 2011-03-18
    • 2016-12-12
    • 1970-01-01
    相关资源
    最近更新 更多