国际网络环境对库的影响

国际网络环境可以理解为延迟很大、经常掉线、丢包的环境,和跨机房环境是一样的,不过,前者掉线严重,延迟更大,比如德国来回一般有300ms,美国有200ms,新加坡一般是90ms。国际网络环境掉包非常严重,有时候可能达到60%以上。

 

golang标准库RPC

虽然是表面看是block调用,但是内部的实现不是一应一答,发送一次请求之后并不会等待结果再发送下一次请求,所以效率也是很高的。而且,如果发生网络出错,一定会通知到调用端,调用端只要做多次请求即可。

问题在于缺少timeout机制,容易在异常断开情况下,产生阻塞很久的错觉。 这个问题可以加个timeout判断,或者进行内部改造:http://daizuozhuo.github.io/golang-rpc-practice/ 。总的来看加个timeout判断更简洁,不需要大改。

另外应该建立多个rpc连接,一个不行,迅速切换到另一个。

redis

redis本身不是阻塞的,你依次发送的请求,redis会依次返回给你,不需要等redis返回才发下一个请求。所以网络延迟很大,效率也不会太低,自己加上处理断开的问题即可。

不过,很多库的实现是阻塞的,尤其是go的库,写阻塞太容易,结果几乎所有redis库都是阻塞的。这时候在国际网络下要慎用,比如做消息队列。

rabbitmq

考虑到异常断开,写到系统缓冲的包可能会发不出去,所以必须开ack和confirm机制。

原文地址:https://www.cnblogs.com/dearplain/p/7586216.html