Skip to content

bigbo/gearman_frame

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

42 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Distributed task distribution framework is based on gearman

Install the dependence

gearmand: yum install -y boost-headers boost-devel gperf libevent-devel libuuid-devel

client: yum install -y YAML (python) easy_install/pip gearman

This is a framework based on distributed gearman

整个gearman分布式框架分为三部分:发送任务客户端/管理端/worker端

send_job_client:

所有任务发送请遵循plugin中的eg.py中所阐述的规则使用.更多配置信息详见config.yaml
clients.py --> the gearman clients,reseal the gearman API
send_job_client.py --> the clients examples of use
config.yaml --> the config file of send_job_client
[plugin] --> please insert here the plug

manage_client:

admin.py --> the queue managemant,get status
manage_client.py --> the admin clients examples of use
[*]Since part of the package management needs API,so need "workers.py" and "clients.py" 

worker_client:

相关配置可以根据config.yaml配置
worker_client.py --> the gearman workers, reseal the gearman API
runworkers.py --> the workers examples of use,the class worker inherit of methods to achieve
veryeasyprocess --> a package
config.yaml --> the config file
eg_worker.py --> a examples of use gearman API

一.更新:

1.可以获取worker的信息,IP,task,新增可以命名worker名字

2.发送job端,当链接超时后,再次执行发送,任务不丢失.

3.解决可以通过admin端获取任务的状态以及可以查看到具体IP地址的活动情况

4.知道了发送任务的Background参数含义,终于知道为什么多线程的效率比但线程效率低了.其实是这个参数的问题.

5.基于之前的base修改完成一份worker的简单框架,实现了基本的任务处理方法调用.

6.链接采用长链接,可以通过相应指令结束worker操作.

7.基于admin,编写runadmin的客户端,目前实现一些简单的控制功能.

8.基于clients,编写runclients的任务两种发送事例.

9.基于worker端,编写执行workerclients,可以通过终端参数启动相应的worker.

10.调整worker端指令执行失败策略,增加失败后重复尝试执行.

11.管理客户端增加清空server端任务队列功能.

12.管理端增加log功能

13.各个模块加入log功能(未完成)

二.已知问题:

[解决]链接超时问题.当到达一定时间后worker端自动停止跳出.

[解决]重复提交job后,即使job端退出后,在adminclient端获取队列的信息后,依旧有job(需要写清理函数)

[解决]tasks/base.py 文件是以worker为基础,编写的worker完成任务的方法,目前存在些问题.尚未改进.

[解决]详细见包说明.worker端在执行任务的时候(多线程),当某些指令执行超时(设置超时时间)或是任务执行失败,会出现单个worker线程退出(崩溃)

[解决]shutdown指令在发送关闭worker端执行失败,不能及时关闭worker端(主要问题在于job端发送任务应加入任务优先级状态)

1.管理端清理server端队列,需要手工干预,效果不好

三.关于veryeasyprocess包的使用(引用原作者):

此包对于进行shell命令的延时处理使用的是非多线程机制,使用所有包和函数均为python基本包,显示的封装成两个函数

1.shell_2_tty(_cmd=cmds, _cwd=None, _timeout=10*60)

_cmd 是要执行的外面命令行,要是一个 list, 如果是str,shell=True,会启动一个新的shell去干活的,这样,不利于进程的控制

_cwd 是执行这个命令行前,cd到这个路径下面,这个,对我的用应很重要,如果不需要可以用默认值

_timeout 这个是主角,设置超时时间(秒单位),从真重执行命令行开始计时,墙上时间超过 _timeout后,父进程会kill掉子进程,回收资源,并避免产生

zombie(僵尸进程)并将调用的命令行输出,直接输出到stdout,即是屏幕的终端上,(如果对输出比较讨厌,可以将 stdout = open("/dev/null", "w"), stderr =open("/dev/null"),等等)

2.shell_2_tempfile(_cmd=cmds, _cwd=None, _timeout=10)

类同1,主要是增加,对命令行的输出,捕获,并返回给父进程,留作分析

四.关于异步多线程面临问题:

1.多个work处理如果有log记录时,或是一些内容存储,会出现个别log乱序(多线程异步并发的通病,不便于控制)

2.多个Work内调用的工作函数错误无法处理或通知,只能通过log查看结果(也是多线程不好控制与监测问题)

3.如果worker异常,没有接任务的worker很难发现,可以通过观察Job的数据量或是通过admin端读取整个server的任务队列中任务数量.

4.work启动的数量过少或者每个work工作时间过长,会导致job server服务器的任务过多积累,占用内存过多,以至于整个服务崩溃(具体就要相关的调教配置serv er端了,不是代码能解决的)

五.关于同步多线程调用面临的问题:

1.当Client个数超过Worker个数的时候会出现排队现象,排队时会加长处理时间(也就是同步时候启用多线程,没有单线程速度快的原因);所以在启动多个Woker线程时候要尽量<job的数量

2.开辟大量Worker空闲会导致闲置占用资源,CPU/内存占用过大(目前代码上默认开辟10个worker的连接数)

3.传递的参数必须序列化,以至于执行效率过慢.

About

Distributed task distribution framework is based on gearman

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages