从 Minos 部署系统谈谈 XML-RPC

栏目: 服务器 · 发布时间: 6年前

内容简介:本文将根据小米开源的大数据部署系统Minos,谈一谈重要的"桥梁"XML-RPC。

从 Minos 部署系统谈谈 XML-RPC

本文将根据小米开源的大数据部署系统Minos,谈一谈重要的"桥梁"XML-RPC。

上篇文章回顾: rsync udr——远程大文件传输加速

本文将围绕三个方面展开:什么是XML-RPC、简单实现一个XML-RPC server/client以及链式使用XML-RPC时遇到的问题及解决方法。

1

从大数据部署系统 Minos说起

Minos是小米2013年开源的针对海量服务节点无法高效操作及统一配置管理的痛点,全新探索并研发的一套大型分布式部署及监控的系统。该系统基于supervisor XML-RPC实现分布式计算,支持跨地域、多节点部署服务。

从 Minos 部署系统谈谈 XML-RPC

上图为Minos架构图,客户端对task节点的操作通过supervisor的XML-RPC完成。接下来我们谈谈什么是XML-RPC,它是如何工作的。

2

什么是XML-RPC?

XML-RPC是一个远程过程调用(远端程序呼叫)(remote procedure call,RPC)的分布式计算协议,通过XML将调用函数封装,并使用HTTP协议作为传送机制。

[1]可以用Perl, Java, Python, C, C++, PHP和许多编程语言实现。实现适用于Unix,Windows和Macintosh。

XML-RPC是受两个早期协议的启发。一个是由Dave Winer设计的匿名RPC协议。(这就是为什么XML-RPC服务器通常安装在/RPC2下。)另一个更重要的是SOAP协议的初稿。Dave Winer提供了丰富的XML-RPC历史渊源,对XML-RPC和SOAP之间的关系感兴趣的可自行查阅资料。

3

XML-RPC如何工作的?

一个简单的示例。

服务端代码示例:(Python2.7 运行环境)

#-*- coding:utf-8 -*-
from SimpleXMLRPCServer import SimpleXMLRPCServer
from SimpleXMLRPCServer import SimpleXMLRPCRequestHandler
# 指定路径
class RequestHandler(SimpleXMLRPCRequestHandler):
    rpc_paths = ('/RPC2',)

# 构建server
server = SimpleXMLRPCServer(("localhost", 8000),
                            requestHandler=RequestHandler)
server.register_introspection_functions()
# 注册pow函数
# pow.__name__为 pow函数的名称
server.register_function(pow)
# 注册自定义函数
def adder_function(x,y):
    return x + y
server.register_function(adder_function, 'add')
# 注册实例;
# 实例的方法均发布为 XML-RPC的方法
class MyFuncs:
    def div(self, x, y):
        return x // y
server.register_instance(MyFuncs())
# 启动server
server.serve_forever()

接下来客户端将调用服务端的方法:

#-*- coding:utf-8 -*-import xmlrpclib
s = xmlrpclib.ServerProxy('http://localhost:8000')
print s.pow(2,3)  # Returns 2**3 = 8print s.add(2,3)  # Returns 5print s.div(5,2)  # Returns 5//2 = 2# 打印服务端所有方法
print s.system.listMethods()

由此在部署系统中,构建supervisor XML-RPC的服务端,封装对节点操作的方法,由客户端远程调用此方法,实现分布式部署。

不过,SimpleXMLRPCServer是一个单线程的服务器。这意味着,服务端同时收到多个客户端发送的多个请求,必须等待第一个请求完成以后才能继续。有个最直接的方法可以解决这个问题:

from SimpleXMLRPCServer import SimpleXMLRPCServer
from SocketServer import ThreadingMixIn

# 新增构建ThreadXMLRPCServer类
class ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):
    pass

# 重新构建server
server = ThreadXMLRPCServer(("localhost", 8000), requestHandler=RequestHandler,allow_none=True)
#Forking and threading versions of each type of server can be created using the ForkingMixIn and ThreadingMixIn mix-in classes. For instance, a threading UDP server class is created as follows:[2]
class ThreadingUDPServer(ThreadingMixIn, UDPServer): pass

阅读ThreadingMixIn的源码发现,ThreadingMixIn重写了server类中调用的process_request方法。因此实现了server端多线程处理。

4

链式使用XML-RPC时遇到的问题及解决方法

在我们实际应用中,当我们构建多个XML-RPC server的client,进行链式调用时,经常遇到httplib.CannotSendRequest的报警。

调用过程:

client -- calls -- SimpleXMLRPCServer’s functions -- calls --SimpleXMLRPCServer's functions -- do finish task

记过排查CannotSendRequest发生在当一个httplib.HTTPConnection被又一次新的“request”操作中断。 所以,每个httplib.HTTPConnection.request必须以.getresponse()调用配对。 如果该配对被另一个请求操作中断,第二请求将产生CannotSendRequest错误。 所以,类似如下请求,将会产生错误:

connection = httplib.HTTPConnection(...)
connection.request(...)
connection.request(...)

问题分析:

两次调用都是serverproxy来构建的。只有在同时多次请求的时候出现了这个问题,应该是存在资源竞争条件。serverproxy在中间层被共享。

解决思路:

是让每个线程创建自己的serverproxy。

解决方案:

在调用第一个SimpleXMLRPCServer的方法时构建下一次调用的链接。确保每个线程维护自己的serverproxy。

5

小结

RPC在许多分布式的系统中都有着重要的应用,高效简单,但在实际应用中多线程的处理上踩过一些坑,以上是在XML-RPC应用中的总结。

相关参考:

[1]Simon St. Laurent, Joe Johnston, Edd Dumbill. Programming Web Services with XML-RPC. First Edition. O'Reilly. 2001-06.

[2] http://docs.python.org/3.0/library/socketserver.html

从 Minos 部署系统谈谈 XML-RPC


以上所述就是小编给大家介绍的《从 Minos 部署系统谈谈 XML-RPC》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

破壁书

破壁书

邵燕君 主编、王玉玊 副主编 / 生活•读书•新知三联书店 生活书店出版有限公司 / 2018-6-1 / 88.00

*一本神奇的网络文化辞典,解读二次元、宅文化、网文、游戏、流行文化,让人大开眼界; *245个网络文化核心关键词,追本溯源,讲述背后文化演变与有趣故事,读来恍然大悟,知其然,更知其所以然; *北大中文系学术团队数年研究成果,曹文轩、韩少功、李敬泽、猫腻顾问推荐,三联生活书店花3年倾力打造; *百度 查不到、词条不过时、形式新颖丰富、文章可读性强、学术上经得起推敲,五大特点打造权威......一起来看看 《破壁书》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

SHA 加密
SHA 加密

SHA 加密工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具