9 轻松远程服务器部署运行函数

别的机器不需要先安装git,也不需要先手动上传代码到该机器上,就能自动部署运行,前提python基本环境是要搞好的。
celery不支持这种自动运行在别的机器上的方式。

9.1 远程服务器部署函数的意义

框架叫分布式函数调度框架,可以在多台机器运行,因为消息队列任务是共享的。
我用的时候生产环境是使用 阿里云 codepipeline k8s部署的多个容器。还算方便。
在测试环境一般就是单机多进程运行的,用supervisor部署很方便。
所以之前没有涉及到多态机器的轻松自动部署。
如果要实现轻松的部署多台物理机,不借助除了python以外的其他手段的话,只能每台机器登录上然后下载代码,启动运行命令,机器多了还是有点烦的。
现在最新加入了 Python代码级的函数任务部署,不需要借助其他手段,python代码自动上传代码到远程服务器,并自动启动函数消费任务。
目前的自动化在远程机器启动函数消费,连celery都没有做到。

不依赖阿里云codepipeline 和任何运维发布管理工具,只需要在python代码层面就能实现多机器远程部署。
 这实现了函数级别的精确部署,而非是部署一个 .py的代码,远程部署一个函数实现难度比远程部署一个脚本更高一点,部署更灵活。
之前有人问怎么方便的部署在多台机器,一般用阿里云codepipeline  k8s自动部署。被部署的远程机器必须是linux,不能是windwos。
但是有的人是直接操作多台物理机,有些不方便,现在直接加一个利用python代码本身实现的跨机器自动部署并运行函数任务。

自动根据任务函数所在文件,转化成python模块路径,实现函数级别的精确部署,比脚本级别的部署更精确到函数。
例如 test_frame/test_fabric_deploy/test_deploy1.py的fun2函数 自动转化成 from test_frame.test_fabric_deploy.test_deploy1 import f2
从而自动生成部署语句
export PYTHONPATH=/home/ydf/codes/distributed_framework:$PYTHONPATH ;cd /home/ydf/codes/distributed_framework;
python3 -c "from test_frame.test_fabric_deploy.test_deploy1 import f2;f2.multi_process_consume(2)"  -fsdfmark fsdf_fabric_mark_queue_test30

这个是可以直接在远程机器上运行函数任务。无需用户亲自部署代码和启动代码。自动上传代码,自动设置环境变量,自动导入函数,自动运行。
这个原理是使用python -c 实现的精确到函数级别的部署,不是python脚本级别的部署。
可以很灵活的指定在哪台机器运行什么函数,开几个进程。这个比celery更为强大,celery需要登录到每台机器,手动下载代码并部署在多台机器,celery不支持代码自动运行在别的机器上

9.2 远程服务器部署函数的入参介绍。


:param host: 需要部署的远程linux机器的 ip
:param port:需要部署的远程linux机器的 port
:param user: 需要部署的远程linux机器的用户名
:param password:需要部署的远程linux机器的密码
:param path_pattern_exluded_tuple:排除的文件夹或文件路径
:param file_suffix_tuple_exluded:排除的后缀
:param only_upload_within_the_last_modify_time:只上传多少秒以内的文件,如果完整运行上传过一次后,之后可以把值改小,避免每次全量上传。
:param file_volume_limit:大于这个体积的不上传,因为python代码文件很少超过1M
:param extra_shell_str :自动部署前额外执行的命令,例如可以设置环境变量什么的
:param invoke_runner_kwargs : 
         invoke包的runner.py 模块的 run()方法的所有一切入参,例子只写了几个入参,实际可以传入十几个入参,大家可以自己琢磨fabric包的run方法,按需传入。
         hide 是否隐藏远程机器的输出,值可以为 False不隐藏远程主机的输出  “out”为只隐藏远程机器的正常输出,“err”为只隐藏远程机器的错误输出,True,隐藏远程主机的一切输出
         pty 的意思是,远程机器的部署的代码进程是否随着当前脚本的结束而结束。如果为True,本机代码结束远程进程就会结束。如果为False,即使本机代码被关闭结束,远程机器还在运行代码。
         warn 的意思是如果远程机器控制台返回了异常码本机代码是否立即退出。warn为True这只是警告一下,warn为False,远程机器返回异常code码则本机代码直接终止退出。
    
:param process_num:启动几个进程
:return:

9.3 远程服务器部署消费函数的代码示例。

定义了两个函数任务,和f1和f2.

../_images/img_11.pngimg_11.png

运行的控制台图片,说明部署级别精确到了函数而非脚本级别,可以灵活的指定哪台机器跑哪些函数。

../_images/img_10.pngimg_10.png