70

Go 编程:借一个 udpserver 用用

 4 years ago
source link: https://www.tuicool.com/articles/mAJbqu6
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

既然写了一个 tcpserver , 乘机把之前借用的一个 udpserver 整理一下。当然这个项目是借用的,常说 庸才模仿,天才抄袭 ,这次就算抄袭吧(偷笑)。

具体项目地址请参见: github.com/x-mod/thriftudp

tcpudp 的区别,此类面试题就不解释了。 udp 其协议本身特点决定了它非常适合如日志、监控等数据收集类场景,即在不影响程序性能的基础上提升程序的可监测性(Measurability).

既然是借用的,不妨看看借用的项目: Jaeger , 以下是 Jaeger 实现架构图:

EVF3euy.png!web

从图中可以看出, Jaeger 是使用 UDP 协议作为实现 jaeger-clientjaeger-agent 之间的基础通信协议。其它网路组件直接则通过 TCP 通信。无论是 UDP 还是 TCP 均不属于应用层协议,在应用层同样需要选择或设计相应的应用级协议格式。如今很少设计自定义的协议格式,通常会采用 ProtoBufferThrift 等此类专门 IDL ,进行接口定义。深入研究 Jaeger 代码,就会发现,同一个项目中不但用了 ProtoBuffer ,同时也使用了 Thrift ,只是具体使用场景不同。

为什么 Thrift 更加适合在 UDP 协议上使用呢?

ProtoBufferThrift 本质上并太大无差别,都是专门针对字节序列化与反序列化的定义与生成工具而已。但是 Thrift 有一个更加适合 UDP 通信的关键字,即 oneway 关键字,其意思就是不用等待响应返回。在 TCP 上通信,通常是需要等待请求返回的。而 UDP 不需要,发出去了是可以不管是否成功的。看起来非常的不合理,但是如果 UDP 只是在本机 HOST 的回环接口上进行数据交互,基本不会出现网络原因导致的数据包丢失问题。

想法很好,不幸的是,官方 apache/thrift 在生成的框架代码以及样例中均不提供 UDP 实现。所以就照着 Jaeger 项目写了一个,方便以后使用。

主要针对 Jaeger 项目的变化是:

thrift
udpserver

该项目的使用非常简单,步骤如下:

thrift
thrift

更多细节可以参考项目的样例程序 thriftudp/example


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK