go语言rpc性能对比 go语言运行效率( 三 )


服务端
客户端
再来看第二种python-jsonrpc,写起来貌似有些复杂 。
服务端
客户端
调用过程如下
还记得上面我提到过的 zabbix API , 因为我有接触过,所以也拎出来讲讲 。zabbix API 也是基于 json-rpc 2.0协议实现的 。
因为内容较多,这里只带大家打个,zabbix 是如何调用的:直接指明要调用 zabbix server 的哪个方法 , 要传给这个方法的参数有哪些 。
03、基于 zerorpc
以上介绍的两种rpc远程调用方式 , 如果你足够细心,可以发现他们都是http+rpc 两种协议结合实现的 。
接下来,我们要介绍的这种(zerorpc),就不再使用走 http 了 。
zerorpc 这个第三方库,它是基于TCP协议、 ZeroMQ 和 MessagePack的 , 速度相对快 , 响应时间短,并发高 。zerorpc 和 pyjsonrpc 一样,需要额外安装,虽然SimpleXMLRPCServer不需要额外安装 , 但是SimpleXMLRPCServer性能相对差一些 。
调用过程如下
客户端除了可以使用zerorpc框架实现代码调用之外,它还支持使用“命令行”的方式调用 。
客户端可以使用命令行,那服务端是不是也可以呢?
是的,通过 Github 上的文档几个 demo 可以体验到这个第三方库做真的是优秀 。
比如我们可以用下面这个命令,创建一个rpc server,后面这个 time Python 标准库中的 time 模块,zerorpc 会将 time 注册绑定以供client调用 。
经过了上面的学习,我们已经学会了如何使用多种方式实现rpc远程调用 。
通过对比,zerorpc 可以说是脱颖而出,一支独秀 。
为此,我也做了一番思考:
OpenStack 组件繁多,在一个较大的集群内部每个组件内部通过rpc通信频繁,如果都采用rpc直连调用的方式 , 连接数会非常地多,开销大,若有些 server 是单线程的模式,超时会非常的严重 。
OpenStack 是复杂的分布式集群架构,会有多个 rpc server 同时工作,假设有 server01 , server02 , server03 三个server,当 rpc client 要发出rpc请求时,发给哪个好呢?这是问题一 。
你可能会说轮循或者随机 , 这样对大家都公平 。这样的话还会引出另一个问题,倘若请求刚好发到server01,而server01刚好不凑巧,可能由于机器或者其他因为导致服务没在工作,那这个rpc消息可就直接失败了呀 。要知道做为一个集群,高可用是基本要求,如果出现刚刚那样的情况其实是很尴尬的 。这是问题二 。
集群有可能根据实际需要扩充节点数量 , 如果使用直接调用,耦合度太高,不利于部署和生产 。这是问题三 。
引入消息中间件 , 可以很好的解决这些问题 。
解决问题一:消息只有一份,接收者由AMQP的负载算法决定,默认为在所有Receiver中均匀发送(round robin) 。
解决问题二:有了消息中间件做缓冲站 , client 可以任性随意的发,server 都挂掉了?没有关系,等 server 正常工作后,自己来消息中间件取就行了 。
解决问题三:无论有多少节点,它们只要认识消息中间件这一个中介就足够了 。
既然讲到了消息队列,如果你之前没有接触过这块内容 , 最好花几分钟的时间跟我好好过下关于消息队列的几个基础概念 。
首先 , RPC只是定义了一个通信接口,其底层的实现可以各不相同,可以是 socket,也可以是今天要讲的 AMQP 。
AMQP(Advanced Message Queuing Protocol)是一种基于队列的可靠消息服务协议,作为一种通信协议,AMQP同样存在多个实现,如Apache Qpid,RabbitMQ等 。

推荐阅读