Sử dụng Beanstalkd (Message queue system) với CakePHP

Khi bạn thực hiện một nhiệm vụ đòi hỏi nguồn lực và thời gian của hệ thống (như convert video, upload hình ảnh độ phân giải cao, gửi tin nhắn đến tất cả các người dùng trong hệ thống…) bạn sẽ cần đến một hệ thống độc lập để xử lý các vấn đề này. Người dùng sẽ không phải chờ đợi rất lâu cho đến khi tiến trình hoàn thành, giảm thiểu nguy cơ tự hủy tiến trình do thời gian kết nối liên tục giữa khách hàng và máy chủ đã được giới hạn.

Để hiểu cơ bản về Beanstalkd, chúng ta tìm hiểu qua Message Queue là gì?

Message Queue là một mô hình giao tiếp truyền tin bất động bộ. Có nghĩa trao đổi giữa người gửi và người nhận không cần xẩy ra đồng thời, tại cùng 1 thời điểm. Người gửi có thể đẩy tin cần gửi vào hàng đợi (queue), và sau đó một số tiến trình độc lập (worker) sẽ đẩy tin từ hàng đợi đến người nhận.

Hiện tại có rất nhiều hệ thống phát triển độc lập cung cấp hạ tầng theo mô hình này: điển hình như ZeroMQ, RabbitMQ, Celery, RQWorker…và Beanstalkd cũng là một hệ thống trong những nền tảng đó.

Triển khai Beanstalkd cho dự án Cakephp

1. Cài đặt Beanstalkd

Việc cài đặt hết sức đơn giản trên nền Debian bằng lệnh:

apt-get install beanstalkd

Sau khi cài đặt thành công, hãy khởi chạy beanstalkd bằng lệnh:

/etc/init.d/beanstalkd start

Bạn có thể tham khảo cách thức cài đặt trên các nền tảng khác (MacOS, CentOS & RHPL…)

tại link: http://kr.github.io/beanstalkd/download.html

 

2. Sử dụng Beanstalk với Cakephp

Are you ready ^^! Việc cài đặt thật dễ dàng phải không?

Giờ chúng ta cần cài đặt plugin hỗ trợ giao tiếp giữa Beanstalkd và Cakephp. Download plugin tại địa chỉ: https://github.com/davidpersson/queue

Sử dụng nó một cách đơn giản như sau, di chuyển vào thư mục app/Plugin và chạy lệnh:

git clone https://github.com/carlipa/cakephp-queue Queue

sau đó cấu hình bootstrap.php để load plugin beanstalkd

CakePlugin::loadAll(); // Loads all plugins at once

và cuối cùng là database.php

public $queue = array(‘datasource’ => ‘Queue.BeanstalkdSource’);

 

Sử dụng Beanstalkd từ  Controller

Đoạn mã sẽ kích hoạt các tiến trình.

Tạo job Beanstalkd “default” tube trong controller:

public $uses = array(‘Queue.Job’);
public $tube = ‘default’;

Mã trên cho phép bạn sử dụng Beanstalkd tại tube là “default” từ controller.

Cuối cùng put job vào Queue:

public function someAction() {
   $this->Job->put(array(
   ‘body’ => array(…)
));
…

 

The Daemon – A worker

Viết cake shell thực hiện các nhiệm vụ được giao:

Khai báo model Job của Plugin: Queue.

public $uses = array(‘Queue.Job’);
public $tubes = array(‘default’);
Và sau đó đọc (xóa) job:
$job = $this->Job->reserve(array(‘tube’ => $this->tubes));
$this->Job->delete();

Add a Comment

Scroll Up