背景
我正在尝试在go中创建一个内存+cpu分析器,并希望将信息从正在分析的程序/服务快速传输到服务器,可能每秒钟一次,服务器将通过将数据保存到数据库和/或通过http将其提供到网站来完成所有繁重的工作;这将减少被配置为进行更精确的测量的程序上的负载。它将是正在传输的小块数据。我知道已经有一些图书馆了,但正如我所说,正在进行实验。
传输内容类型
我还没有决定具体的传输类型,但看起来像HTTP或Websockets的JSON,而只是RPC的Struct(如果我做得正确的话(
摘要
我可能会尝试每一种方法,只是为了自己看看,但对RPC和Websockets的使用经验很少,我想了解一些意见或建议,哪些可能更快或更适合我的尝试:
- HTTP
- RPC
- Websockets
- 还有什么我不想的
正如您在评论中提到的,HTTP不是必需的。
在这种情况下,为了寻找最快的传输解决方案,我会完全放弃HTTP传输层,只使用普通(TCP(套接字连接,因为HTTP仅传输几个字节就带来了相当大的开销。
定义您自己的协议(可能非常简单(,打开与服务器的TCP连接,并根据您的要求每隔几秒左右发送数据包。
您发送(和接收(数据的协议可以简单到:
- 执行可选的身份验证或客户端/服务器标识(以确保您连接到想要的服务器/程序(
- 使用标准库中的
encoding/gob
数据包通过连接发送二进制形式的数据
因此,基本上,配置文件程序(客户端(应该打开TCP连接,并使用gob.NewEncoder()
包装连接来发送数据。服务器应接受传入的TCP连接,并使用gob.NewDecoder()
包装连接以接收数据。
客户端调用Encoder.Encode()
,因此发送分析信息,它通常可以是一个结构值。服务器调用Decoder.Decode()
来接收分析信息,即客户端发送的结构。仅此而已。
使用encoding/gob
包以二进制形式发送数据需要使用相同的类型来描述两侧的分析数据。如果您想要更大的灵活性,还可以使用encoding/json
包以JSON文本的形式发送/接收分析信息。缺点是JSON将需要发送更多的数据,并且与二进制表示相比,生成和解析JSON文本需要更多的时间。
如果丢失一些分析数据包(或接收重复数据包(不是问题,您可能需要尝试/尝试使用UDP而不是TCP,这可能会更有效。