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’);
$job = $this->Job->reserve(array(‘tube’ => $this->tubes)); $this->Job->delete();