go rpc、http 或 websockets,这是将许多小块数据从一个服务器重复传输到另一个服务器的最快方式
go rpc, http or websockets,which is fastest for transferring many small pieces of data, repeatedly, from one server to another
背景
我正在尝试在 go 中创建一个内存 + cpu 分析器,并希望快速传输信息,也许每秒,从正在分析的 program/service 到一个服务器,它将完成所有工作通过将数据保存到数据库 and/or 来减轻繁重的工作,通过 http 将其提供给站点;这将减少正在分析的程序的负载以进行更准确的测量。传输的将是小块数据。我知道已经有一些图书馆了,但就像我说的,正在试验中。
传输内容类型
我还没有决定具体的传输类型,但看起来像 JSON 用于 HTTP 或 Websockets 以及用于 RPC 的 Struct(如果我已经正确完成了我的研究)
总结
我可能会尝试每一个,只是为了亲眼看看,但我对使用 RPC 和 Websockets 的经验很少,并且想要一些可能更快或更适合我正在尝试做的事情的意见或建议:
- HTTP
- RPC
- 网络套接字
- 我没有考虑的其他事情
正如您在评论中提到的,HTTP 不是必需的。
在这种情况下,为了寻找最快的传输解决方案,我会完全放弃 HTTP 传输层,而只使用普通 (TCP) 套接字连接,因为 HTTP 仅传输几个字节就会产生相当大的开销。
定义您自己的协议(可能非常简单),打开到服务器的 TCP 连接,并根据您的要求每隔几秒左右发送一次数据包。
您发送(和接收)数据的协议可以很简单:
- 进行可选的身份验证或 client/server 身份验证(以确保您已连接到您想要的 server/program)。
- 使用标准库中的
encoding/gob
packgae 通过连接以二进制形式发送数据。
所以基本上配置程序(客户端)应该打开 TCP 连接,并使用 gob.NewEncoder()
wrapping the connection to send data. The server should accept the incoming TCP connection and use gob.NewDecoder()
包装连接以接收数据。
客户端调用 Encoder.Encode()
so send profiling info, it can be typically a struct value. Server calls Decoder.Decode()
接收分析信息,即客户端发送的结构。就这些了。
使用encoding/gob
包以二进制形式发送数据需要您使用相同的类型来描述两侧的分析数据。如果你想要更多的灵活性,你也可以使用 encoding/json
包来 send/receive 分析信息作为 JSON 文本。缺点是 JSON 需要发送更多数据,与二进制表示相比,生成和解析 JSON 文本需要更多时间。
如果丢失一些分析数据包(或收到重复数据包)不是问题,您可能希望try/experiment使用 UDP 而不是 TCP,这可能更有效。
背景
我正在尝试在 go 中创建一个内存 + cpu 分析器,并希望快速传输信息,也许每秒,从正在分析的 program/service 到一个服务器,它将完成所有工作通过将数据保存到数据库 and/or 来减轻繁重的工作,通过 http 将其提供给站点;这将减少正在分析的程序的负载以进行更准确的测量。传输的将是小块数据。我知道已经有一些图书馆了,但就像我说的,正在试验中。
传输内容类型
我还没有决定具体的传输类型,但看起来像 JSON 用于 HTTP 或 Websockets 以及用于 RPC 的 Struct(如果我已经正确完成了我的研究)
总结
我可能会尝试每一个,只是为了亲眼看看,但我对使用 RPC 和 Websockets 的经验很少,并且想要一些可能更快或更适合我正在尝试做的事情的意见或建议:
- HTTP
- RPC
- 网络套接字
- 我没有考虑的其他事情
正如您在评论中提到的,HTTP 不是必需的。
在这种情况下,为了寻找最快的传输解决方案,我会完全放弃 HTTP 传输层,而只使用普通 (TCP) 套接字连接,因为 HTTP 仅传输几个字节就会产生相当大的开销。
定义您自己的协议(可能非常简单),打开到服务器的 TCP 连接,并根据您的要求每隔几秒左右发送一次数据包。
您发送(和接收)数据的协议可以很简单:
- 进行可选的身份验证或 client/server 身份验证(以确保您已连接到您想要的 server/program)。
- 使用标准库中的
encoding/gob
packgae 通过连接以二进制形式发送数据。
所以基本上配置程序(客户端)应该打开 TCP 连接,并使用 gob.NewEncoder()
wrapping the connection to send data. The server should accept the incoming TCP connection and use gob.NewDecoder()
包装连接以接收数据。
客户端调用 Encoder.Encode()
so send profiling info, it can be typically a struct value. Server calls Decoder.Decode()
接收分析信息,即客户端发送的结构。就这些了。
使用encoding/gob
包以二进制形式发送数据需要您使用相同的类型来描述两侧的分析数据。如果你想要更多的灵活性,你也可以使用 encoding/json
包来 send/receive 分析信息作为 JSON 文本。缺点是 JSON 需要发送更多数据,与二进制表示相比,生成和解析 JSON 文本需要更多时间。
如果丢失一些分析数据包(或收到重复数据包)不是问题,您可能希望try/experiment使用 UDP 而不是 TCP,这可能更有效。