国际网络环境对库的影响
Posted Math & Code & Wave
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了国际网络环境对库的影响相关的知识,希望对你有一定的参考价值。
国际网络环境可以理解为延迟很大、经常掉线、丢包的环境,和跨机房环境是一样的,不过,前者掉线严重,延迟更大,比如德国来回一般有300ms,美国有200ms,新加坡一般是90ms。
golang标准库RPC
虽然是表面看是block调用,但是内部的实现不是一应一答,发送一次请求之后并不会等待结果再发送下一次请求,所以效率也是很高的。而且,如果发生网络出错,一定会通知到调用端,调用端只要做多次请求即可。
问题在于缺少timeout机制,容易在异常断开情况下,产生阻塞很久的错觉。 这个问题可以加个timeout判断,或者进行内部改造:http://daizuozhuo.github.io/golang-rpc-practice/ 。总的来看加个timeout判断更简洁,不需要大改。
另外应该建立多个rpc连接,一个不行,迅速切换到另一个。
redis
redis本身不是阻塞的,你依次发送的请求,redis会依次返回给你,不需要等redis返回才发下一个请求。所以网络延迟很大,效率也不会太低,自己加上处理断开的问题即可。
不过,很多库的实现是阻塞的,尤其是go的库,写阻塞太容易,结果几乎所有redis库都是阻塞的。这时候在国际网络下要慎用,比如做消息队列。
rabbitmq
考虑到异常断开,写到系统缓冲的包可能会发不出去,所以必须开ack和confirm机制。
以上是关于国际网络环境对库的影响的主要内容,如果未能解决你的问题,请参考以下文章