使用 rpc、http 或 websockets,这对于从一台服务器到另一台服务器重复传输许多小块数据来说是最快的
Posted
技术标签:
【中文标题】使用 rpc、http 或 websockets,这对于从一台服务器到另一台服务器重复传输许多小块数据来说是最快的【英文标题】:go rpc, http or websockets,which is fastest for transferring many small pieces of data, repeatedly, from one server to another 【发布时间】:2015-09-14 01:29:13 【问题描述】:背景
我正在尝试在 go 中创建一个内存 + cpu 分析器,并希望将信息从正在分析的程序/服务快速传输到服务器,该服务器将通过保存数据来完成所有繁重的工作到数据库和/或通过 http 将其提供到站点;这将减少正在分析的程序的负载,以便进行更准确的测量。这将是正在传输的小块数据。我知道那里已经有一些库,但就像我说的那样,正在试验。
传输内容类型
我还没有决定具体的传输类型,但看起来像 HTTP 或 Websockets 的 JSON 和 RPC 的 Struct(如果我的研究正确的话)
总结
我可能会尝试每种方法,只是为了亲眼看看,但对使用 RPC 和 Websockets 的经验很少,希望得到一些意见或建议,这些意见或建议可能更快或更适合我正在尝试做的事情:
HTTP RPC 网络套接字 其他我没有想到的事情【问题讨论】:
但最重要的是你的数据库。 你发送数据的服务器是网络服务器吗?传输是否仅限于 HTTP?是用 Go 写的吗?您希望您的解决方案可以跨不同技术移植,还是可以与 Go 绑定? Jiang,此时数据库并不重要。 icza,数据只是被发送到另一个运行 go 程序的服务器,可能是一个网络服务器,也可能只是一个程序。没有传输不限于 HTTP。是的,它是用 go 写的。绑着走完全没问题。 【参考方案1】:正如您在评论中提到的,HTTP 不是必需的。
在这种情况下,为了寻找最快的传输解决方案,我将完全放弃 HTTP 传输层,而只使用普通 (TCP) 套接字连接,因为 HTTP 仅用于传输几个字节就会产生相当大的开销。
定义您自己的协议(这可能非常简单),打开一个到服务器的 TCP 连接,并按照您的要求每隔几秒左右发送一次数据包。
您发送(和接收)数据的协议可以很简单:
执行可选的身份验证或客户端/服务器识别(以确保您连接到所需的服务器/程序)。 使用标准库中的encoding/gob
packgae 通过连接以二进制形式发送数据。
所以基本上被分析的程序(客户端)应该打开TCP连接,并使用gob.NewEncoder()
包装连接来发送数据。服务器应该接受传入的 TCP 连接并使用gob.NewDecoder()
包装连接以接收数据。
客户端调用Encoder.Encode()
所以发送分析信息,它通常可以是一个结构值。服务器调用Decoder.Decode()
来接收分析信息,即客户端发送的结构。就是这样。
使用encoding/gob
包以二进制形式发送数据要求您使用相同的类型来描述双方的分析数据。如果您想要更大的灵活性,您还可以使用 encoding/json
包以 JSON 文本形式发送/接收分析信息。缺点是 JSON 需要发送更多数据,与二进制表示相比,生成和解析 JSON 文本需要更多时间。
如果丢失一些分析数据包(或接收重复数据)不是问题,您可能想尝试/尝试使用 UDP 而不是 TCP,这可能会更有效。
【讨论】:
UDP 是个好建议。也可以考虑使用 Google Protocol Buffers 来简化您的编解码器。 @Nicholas 如果分析数据被捕获/描述为 Gostruct
,Google 协议缓冲区只会使其复杂化并减慢速度(您可以通过一个简单的方法调用发送和接收 struct
使用encoding/gob
,不需要您的任何部分)。
非常感谢,正是我想要的!以上是关于使用 rpc、http 或 websockets,这对于从一台服务器到另一台服务器重复传输许多小块数据来说是最快的的主要内容,如果未能解决你的问题,请参考以下文章
netty,websocket,ipc(lpc和rpc),Nio之间的相互调用