python模块介绍-gearman:程序排程 概述

python模块介绍-gearman:程序排程

概述

Gearman是一套用来把程序需求委派给机器,提供通用的程序框架来将任务分发在机器运算。它同时具有并行工做的能力、负载均衡处理的能力,以及在不一样程序语言之间沟通的能力。gear的英文意思是齿轮。特色以下:前端

  • Open Source且社区活跃。python

  • Multi-language: 多国语言接口。shell

  • Flexible: 灵活,不拘泥于具体设计模式,能够快速将应用程序分布运做。好比使用Map/Reduce.数据库

  • Fast: 协议简单快速,支持多线程,服务器端用C/C++书写,效率高。编程

  • Embeddable: 快速与轻量,适合嵌入式环境。后端

  • 无单点失败: 不只能够将系统模组化,也能容错方式进行。centos

  • 稳定: Craig’s List, Tumblr, Yelp, Etsy等已经多年使用.设计模式

原理

Gearman最初在LiveJournal用于图片resize功能,因为图片resize须要消耗大量计算资源,所以须要调度到后端多台服务器执行, 完成任务以后返回前端再呈现到界面。Gearman分布式任务实现原理上只用到2个字段,function name和data。function name即任务名称,由client传给job server, job server根据function name选择合适的worker节点来执行。api

  • 组成服务器

    • Client: 负责创建工做,发送需求 (application) 给 Job Server,Job Server 会找适合的Worker转发工做。

    • Job Server: 了解Client 端的需求,并查看哪一个机器能够处理这项要求,在系统里它一般会是个Daemon。

    • Worker: Worker 经过 Job Server 的分派,开始执行 Client 端的工做。

  • 消息队列

    • 执行 Message Queue服务的 Job Server 能够是多台服务器组成,也就是分散式架构,在 Job Server 上执行 Worker 程式。

    • 这些 Worker 程式会一直循环地等候,直到 Job Server 呼叫它执行工做。

    • Client 端发送出需求以后,会将须要的资料及动做记录在 Job Server 上,这时 Job Server 会查看是否有空闲并符合需求的 Worker。

    • 在 Worker 结束工做后,会发送通知给 Job Server ,这时 Job Server 就会视情况把结果回传给 Client。

    • Client 端不需等候需求的执行结果,能够直接继续执行其余动做。

负载方式

  • Job Server 负载方式

    • Client 可能同时发出多个需求给 Job Server,由 Message Queue处理。

    • Job Server 开始处理多个需求,若其中一个发生问题,能够 Failover 到其余的机器。

    • Worker 会将多个需求一块儿进行运算,再看是同步或异步模式,回传结果给 Client。

  • 同步 (Synchronous)

    • 同步(Synchronous) 是指 Client 将需求 (Application) 丢给 Gearmand。

    • 由 Gearmand 分派 Job 给各 Worker 去处理。

    • 并同步 Response 回传给 Gearmand 告诉 Client 如今进度。

  • 异步 (Asynchronous):

    • Client 将需求 (Application) 丢给 Gearmand。

    • 由 Gearmand 分派 Job 给各 Worker 去处理。

    • Worker 处理完毕后,才会将结果回传给 Gearmand 告诉 Client 如今进度

快速入门

安装(centos为例):

yum -y install gearmand

安装python

pip install gearman

api

启动:

gearmand -L 192.168.0.232 -p 4730 -u root -d

查看状态:

# telnet 10.0.0.51 4730status
task01      0       0       1

自带实例:

# gearman -h localhost -p 4730 -w -f task01 -- wc -l  
# gearman -h localhost -p 4730 -f task01 < /etc/passwd

worker.py

import osimport gearmanimport mathclass CustomGearmanWorker(gearman.GearmanWorker):
    def on_job_execute(self, current_job):
        print "Job started"
        return super(CustomGearmanWorker, self).on_job_execute(current_job)def task_callback(gearman_worker, job):
    print job.data    return job.data

new_worker = CustomGearmanWorker(['192.168.0.232:4730'])new_worker.register_task("echo", task_callback)new_worker.work()

client.py

from gearman import GearmanClient

new_client = GearmanClient(['192.168.0.232:4730'])current_request = new_client.submit_job('echo', 'foo')new_result = current_request.resultprint new_result

高级特性

在一个 Web 应用程序内可能有许多地方都会用到 Gearman。能够导入大量数据、发送许多电子邮件、编码视频文件、挖据数据并构建一个中央日志设施 — 全部这些均不会影响站点的体验和响应性。能够并行地处理数据。并且,因为 Gearman 协议是独立于语言和平台的,因此您能够在解决方案中混合编程语言。好比,能够用 PHP 编写一个 producer,用Python, C、Ruby 或其余任何支持 Gearman 库的语言编写 worker。

一个链接客户机和 worker 的 Gearman 网络实际上可使用任何您能想象获得的结构。不少配置可以运行多个代理并将 worker 分配到许多机器上。负载均衡是隐式的:每一个可操做的可用 worker(多是每一个 worker 主机具备多个 worker)从队列中拉出做业。一个做业可以同步或异步运行并具备优先级。

Gearman 的最新版本已经将系统特性扩展到了包含持久的做业队列和用一个新协议来经过 HTTP 提交工做请求。对于前者,Gearman 工做队列保存在内存并在一个关系型数据库内存有备份。这样一来,若是 Gearman 守护程序故障,它就能够在重启后从新建立这个工做队列。另外一个最新的改良经过一个 memcached 集群增长队列持久性。memcached 存储也依赖于内存,但被分散于几个机器以免单点故障。

Gearman 是一个刚刚起步却颇有实力的工做分发系统。据 Gearman 的做者 Eric Day 介绍,Yahoo! 在 60 或更多的服务器上使用 Gearman 天天处理 600 万个做业。新闻聚合器 Digg 也已构建了一个相同规模的 Gearman 网络,天天可处理 400,000 个做业。Gearman 的一个出色例子能够在 Narada 这个开源搜索引擎(参见 参考资料)中找到。

本文地址

参考资料

相关文章
相关标签/搜索