gearman work queue in php

102
Gearman work queue in php Gearman 打造 PHP 排程 2013.10.05 @appleboy

Upload: bo-yi-wu

Post on 08-Sep-2014

5.494 views

Category:

Technology


2 download

DESCRIPTION

Gearman work queue in php 用 Gearman 打造 PHP 排程

TRANSCRIPT

Page 1: Gearman work queue in php

Gearman work queue in php用 Gearman打造 PHP排程

2013.10.05

@appleboy

Page 2: Gearman work queue in php

2

Who am I

Bo-Yi Wu @appleboyhttp://blog.wu-boy.comhttps://github.com/appleboy

任職於瑞昱半導體 RealTek(IC Design House)

Page 3: Gearman work queue in php

3

今日來聊聊排程系統

Page 4: Gearman work queue in php

4

排程使用時機 ?

Page 5: Gearman work queue in php

5

不需要即時回覆都可以使用排程

Page 6: Gearman work queue in php

6

哪些應用需要排程 ?

Page 7: Gearman work queue in php

7

使用者註冊系統

Page 8: Gearman work queue in php

8

使用者註冊

填寫表單完成

寄發認證信

使用者收到回覆

未使用排程

處理資料

透過第三方寄信Amazone SES

Page 9: Gearman work queue in php

9

缺點 Response time過長使用者不需要等伺服器寄信

(來自知名插畫家彎彎 )

Page 10: Gearman work queue in php

10

使用者註冊

填寫表單完成

寄發認證信

使用者收到回覆

使用排程

處理資料

寫入排程

Page 11: Gearman work queue in php

11

Email Queue?Github Social Coding

Page 12: Gearman work queue in php

12

Application Server

Database Database Database

Work Queue

Page 13: Gearman work queue in php

13

執行排程Linux crontab

Ref: http://www.xenstreet.com/2013/03/choosing-the-right-linux/

Page 14: Gearman work queue in php

14

<?php $link = mysqli_connect("host", "user", "passw", "db"); $query = 'SELECT * FROM jobs where status = "on"'; $result = $link->query($query); while($row = mysqli_fecth_array($result)) { // ….... // do work // ….... $sql = 'update jobs set status = "off" where id = {$row["id"]}'; $link->query($sql); }

Page 15: Gearman work queue in php

15

每分鐘執行一次*/1 * * * * root cron.sh

Page 16: Gearman work queue in php

16

優點

● 容易瞭解

● 任何程式語言都可以實現

● 快速 Deploy到任何機器

Page 17: Gearman work queue in php

17

缺點

● 每分鐘只能執行一次

● Race condition● 浪費 Database資源

Page 18: Gearman work queue in php

18

換個寫法來試試看

Page 19: Gearman work queue in php

19

每 10秒執行一次

<?php$link = mysqli_connect("myhost","myuser","mypassw","mybd");$query = 'SELECT * FROM jobs where status = "on"';$done = false;while(!$done) { $result = $link->query($query); if ($result->num_rows > 0) { // do work $sql = 'update jobs set status = "off" where id = {$row["id"]}'; $link->query($sql); } else { sleep(10); }}

Page 20: Gearman work queue in php

20

缺點

● 真的 10秒執行一次 ?● Race condition● 更浪費 Database資源

Page 21: Gearman work queue in php

21

如果沒有 Race Condition

Page 22: Gearman work queue in php

22

#!/bin/sh(sleep 5 && /path/script.sh) &(sleep 15 && /path/script.sh) &(sleep 25 && /path/script.sh) &(sleep 35 && /path/script.sh) &(sleep 45 && /path/script.sh) &(sleep 55 && /path/script.sh) &

每 10秒執行一次

Page 23: Gearman work queue in php

23

如何分配處理這些問題 ?

Page 24: Gearman work queue in php

24

Using Gearman

Page 25: Gearman work queue in php

25

What is Gearman?

It allows you to do work in parallel, to load balance processing, and to call

functions between languages.

Page 26: Gearman work queue in php

26

Client inPerl,Python,PHPJava,C#(.Net)

Page 27: Gearman work queue in php

27

evenMySQL,PostgreSQL

Page 28: Gearman work queue in php

28

How Does Gearman Work?

Page 29: Gearman work queue in php

29

Gearman優點

Page 30: Gearman work queue in php

30

Work Queues● 淺顯易懂

Got job do job repeat→ →

Application

Gearmand

Worker

Got job

Do job

Page 31: Gearman work queue in php

31

Work Queues● 淺顯易懂

Get job do job repeat→ →

● 跨語言

任何平台只要能存入字串即可

Page 32: Gearman work queue in php

32

Multiple Language

Application

Gearmand

Application

Worker Worker

Page 33: Gearman work queue in php

33

Work Queues● 淺顯易懂

Get job do job repeat→ →

● 跨語言

任何平台只要能存入字串即可

● 跨平台

當 Client寫入工作時,Worker不需要啟動

Page 34: Gearman work queue in php

34

跨平台

Application

Gearmand

Application

Gearmand

Page 35: Gearman work queue in php

35

Work Queues● 淺顯易懂

Get job do job repeat→ →

● 跨語言

任何平台只要能存入字串即可

● 跨平台

當 Client寫入工作時,Worker不需要啟動● 即時性

可以為同步或非同步

Page 36: Gearman work queue in php

36

Gearman Architecture佈署架構

Page 37: Gearman work queue in php

37

Application

Gearmand

Job

Page 38: Gearman work queue in php

38

Application

Gearmand

Job

Worker

Job

Page 39: Gearman work queue in php

39

Application

Gearmand

Job

Worker

Job Response

Page 40: Gearman work queue in php

40

Application

Gearmand

Job

Worker

Job Response

Response

Page 41: Gearman work queue in php

41

Application

Gearmand

Worker

Worker

Worker

Page 42: Gearman work queue in php

42

Application

Gearmand

Worker

Worker

Gearmand

Page 43: Gearman work queue in php

43

Application

Gearmand

Worker

Worker

Gearmand

Application

Page 44: Gearman work queue in php

44

結論 :Gearman擴充性佳

Page 45: Gearman work queue in php

45

不論要幾台 gearmand跟數個 worker都可以

Page 46: Gearman work queue in php

46

Application只會跟Gearmand溝通

Page 47: Gearman work queue in php

47

多個 Application不管丟出多少個 Jobs

Page 48: Gearman work queue in php

48

最終由多個 Job Server分配工作

Page 49: Gearman work queue in php

49

Synchronous vs

Asynchronous

Page 50: Gearman work queue in php

50

Synchronous Application

Gearmand

Job

Worker

Job Response

Response

Page 51: Gearman work queue in php

51

AsynchronousApplication

Gearmand

Job

Worker

Job Done!

Page 52: Gearman work queue in php

52

Installation安裝方式

Page 53: Gearman work queue in php

53

Installation

● Job Server (C)● Client library (PHP,Python ...)● Worker library (PHP,Python ...)

Page 54: Gearman work queue in php

54

Job Server安裝方式

Page 55: Gearman work queue in php

55

Ubuntu/Debianaptitude -y install gearman gearman-job-server libgearman-dev libdrizzle0

Page 56: Gearman work queue in php

56

CentOS/Fedorayum -y install libgearman gearmand libgearman-devel libdrizzle

Page 57: Gearman work queue in php

57

Tarball installhttps://gist.github.com/appleboy/6774735

Page 58: Gearman work queue in php

58

Gearmand enabled usingMySQL(Mariadb)

PostgresqlSQL Lite

Memcached

Page 59: Gearman work queue in php

59

MySQL Example/etc/default/gearman-job-server

-q mysql --mysql-host=localhost

--mysql-user=xx --mysql-password=xx

--mysql-db=ovoq --mysql-table=gearman_queue

Page 60: Gearman work queue in php

60

Client Librarypecl install channel://pecl.php.net/gearman-1.1.2echo 'extension=gearman.so' > /path/gearman.ini

Page 61: Gearman work queue in php

61

Quick Testphp -i | grep 'gearman'

Page 62: Gearman work queue in php

62

Gearman in PHP Client

Page 63: Gearman work queue in php

63

PHP Client# Create a client object

$gm = new GearmanClient();

# Add default server, default is localhost:4730

$gm->addServer();

# Do Job

$result = $gm->doNormal("reverse", "Hello!");

echo "Success: $result\n";

Page 64: Gearman work queue in php

64

Do background Job$job = $gm->doBackground("reverse", "apple");

Page 65: Gearman work queue in php

65

Gearman in PHP Worker

Page 66: Gearman work queue in php

66

PHP Worker

# Define worker job function

function reverse_fn($job) { //.... }

# fetch message from client

function reverse_fn($job) {

$data = $job->workload();

}

Page 67: Gearman work queue in php

67

PHP Worker# Create our worker object.

$gm= new GearmanWorker();

# Add default server (localhost).

$gm->addServer();

# Register function "reverse"

$gm->addFunction("reverse", "reverse_fn");

# Waiting for job...

while($gm->work());

Page 68: Gearman work queue in php

68

Multiple Jobs$gm->addFunction("reverse", "reverse_fn");

$gm->addFunction("resize", "resize_fn");$gm->addFunction("queue", "queue_fn");

…...

Page 69: Gearman work queue in php

69

Anonymous function$gm->addFunction("reverse", function($job){

$data = $job->workload(); });

Page 70: Gearman work queue in php

70

Gearman in CodeIgniter

Page 71: Gearman work queue in php

71

CodeIgniter Gearman Libraryhttps://github.com/appleboy/CodeIgniter-Gearman-Library

Page 72: Gearman work queue in php

72

Installation via Sparkphp tools/spark install -v1.0.1 codeigniter-gearman

Page 73: Gearman work queue in php

73

Setup Gearmand Server and Portconfig/gearman.php

$config['gearman_server'] = array('localhost'); $config['gearman_port'] = array('4730');

Page 74: Gearman work queue in php

74

CodeIgniter Client

Page 75: Gearman work queue in php

75

Implement Image Resize Jobcreate app controller

Page 76: Gearman work queue in php

76

class App extends CI_Controller{

public function resize_sync()public function resize_async()

}

Page 77: Gearman work queue in php

77

public function resize_sync(){ $data = json_encode(array('file_name' => 'test.png')); $client = $this->lib_gearman->gearman_client(); do {

$this->lib_gearman->do_job_foreground('resize', $data); switch($client->returnCode()) { //.... }

} while ($client->returnCode() != GREARMAN_SUCCESS);}

Page 78: Gearman work queue in php

78

class App extends CI_Controller{

public function resize_sync()public function resize_async()

}

Page 79: Gearman work queue in php

79

public function resize_async(){ $data = json_encode(array('file_name' => 'test.png')); $client = $this->lib_gearman->gearman_client(); $this->lib_gearman->do_job_background('resize', $data));}

Page 80: Gearman work queue in php

80

CodeIgniter Workercreate cli controller

Page 81: Gearman work queue in php

81

class Cli extends CI_Controller{

public static function image_resize()public static function email_queue()public function worker()

}

Page 82: Gearman work queue in php

82

public static function image_resize($job){ $data = json_decode($job->workload(), true); $ci =& get_instance(); $ci->image_lib->initialize($config); $ci->image_lib->resize(); $ci->image_lib->clear();}

Page 83: Gearman work queue in php

83

Define Worker

Page 84: Gearman work queue in php

84

public function worker(){ $worker = $this->lib_gearman->gearman_worker(); $this->lib_gearman ->add_worker_function('resize', 'Cli::image_resize'); $this->lib_gearman ->add_worker_function('queue', 'Cli::email_queue'); while ($this->lib_gearman->work());}

Page 85: Gearman work queue in php

85

Start Worker$ php index.php cli worker

Page 86: Gearman work queue in php

86

Running workers via script#!/bin/shscript="index.php cli worker"folder="/script_path/"max_worker="5"php_bin="/usr/bin/php"count=0current_count=$(ps aux | grep "index.php cli worker" | grep -v "grep" | wc -l)

if test $current_count -lt $max_workerthen

cd $folder$php_bin $folder$script &

elseecho "The worker count has been limited."

fihttps://gist.github.com/appleboy/6806323

Page 87: Gearman work queue in php

87

About Job DataDon't pass 2GB object.

Gearman is not data center.

Page 88: Gearman work queue in php

88

Keep your message data smallAmazone SQS message siez: 256K

http://goo.gl/0MBq8W

Page 89: Gearman work queue in php

89

Scalability

Page 90: Gearman work queue in php

90

Client Client

Job Server

Client

ClientWorker Worker Worker Worker

Job Server

Client

Page 91: Gearman work queue in php

91

you can scale out your clients and workers

as needed

Page 92: Gearman work queue in php

92

Client SettingClient1, Client2: Gearman1Client3, Client4: Gearman2

…...

Page 93: Gearman work queue in php

93

Worker SettingWorker[1-4]:Server[1-2]

…...

Page 94: Gearman work queue in php

94

Add new Job Server...

Page 95: Gearman work queue in php

95

Reconfigure all setting(client and worker program)

Page 96: Gearman work queue in php

96

Reconfigure all setting(client and worker program)

evenDeploy Tool

Page 97: Gearman work queue in php

97

如何控制易怒的情緒?

Page 98: Gearman work queue in php

98

How to improve your architecture?

Page 99: Gearman work queue in php

99

Client Client

Job Server

Client

ClientWorker Worker Worker Worker

Job Server

Client

Proxy (Haproxy ...)

Page 100: Gearman work queue in php

100

Live DemoEmail Queue.

Page 101: Gearman work queue in php

101

Any Questions?

Page 102: Gearman work queue in php

102

Thanks全體工作人員和聽眾