Hướng dẫn dùng gearman trong PHP

Mở đầu

Nếu bạn là tín đồ của truyện hoặc phim kiếm hiệp, chắc hẳn chúng ta rất quen thuộc với thuật PHÂN THÂN. Thường thì chỉ có các đại cao thủ, tuyệt kĩ đầy mình, nhất nhì võ lâm mới luyện nổi tuyệt kĩ này. Ngày bé mình cũng rât thích tuyệt kĩ này của Tôn Ngộ Không, một thần tượng của bao trẻ em thuở thiếu thời. Vậy tại sao chúng ta lại thích tuyệt kĩ này đến vậy? Có lẽ đơn giản là sức mạnh của một người được nhân lên hàng chục hàng trăm lần tùy thuộc số PHÂN THÂN.

Một ngày đẹp trời, mình cũng đang lạc mình giữa bộn bề dự án. Và mình gặp những vấn đề nan giải như:

  • Lúc user đăng ký tài khoản, phải gửi mail cho admin.
  • Push notification tới các devices.
  • Lúc user upload, chúng ta cần resize lại nhiều cỡ ảnh.

Chúng ta có thể thấy các vấn đề nêu trên đều tốn rất nhiều thời gian. Thông thường khi user thực hiện một request, nếu chúng ta thực hiện hết các nhiệm vụ trên rồi mới response về thì mất rất nhiều thời gian [>3s]. User chả thích tẹo nào và sẽ rời bỏ hệ thống của bạn. Giải pháp được đưa ra là chúng ta sẽ ném các nhiệm vụ không cần thiết đối với user vào QUEUE, một process khác sẽ xử lý nhiệm vụ đó như: ghi log, gửi mail, push notification, resize ảnh ... Process này cần được PHÂN THÂN để tăng tốc độc xử lý [multi workers].

Một số ứng dụng phổ biến xử lý công việc này như là Resque, Gearman ... Vậy cái nào tốt hơn cái nào? Chúng ta nên sử dụng cái nào?

Gearman là gì?

Gearman provides a generic application framework to farm out work to other machines or processes that are better suited to do the work. It allows you to do work in parallel, to load balance processing, and to call functions between languages. It can be used in a variety of applications, from high-availability web sites to the transport of database replication events. In other words, it is the nervous system for how distributed processing communicates.

  • Đơn giản có thể hiểu Gearman là một ứng dụng cho phép bạn xử lý công việc song song, phân chia công việc cân bằng cho các workers, nó là hệ thống kế nối các xử lý phân tán.

Ưu điểm của Gearman

  • Open Source - Free 100% nhé. Gearman là BSD.
  • Multi-language - Hỗ trợ nhiều ngôn ngữ và đang mở rộng ngôn ngữ hơn. Điều đặc biệt là chúng ta có thể viết client đẩy job bằng 1 ngôn ngữ và các workers thực thi có thể viết bằng một ngôn ngữ khác.
  • Flexible - Chúng ta không bị bó buộc trong một design pattern cụ thể nào. Rất nhanh chóng đặt các ứng dụng phân tán cùng nhau sử dụng bất cứ model nào.
  • Fast - Gearman có một protocol và interface đã tối ưu hóa, đa luồng và server được viết bằng C/C++ nên cực kì nhanh.
  • Embeddable - Gearman rất nhanh và nhẹ, cực kì tuyệt vời để tích hợp vào bất cứ ứng dụng nào. Code đơn giản, dễ hiểu.
  • No limits on message size - Gearman hỗ trợ các single messages lên tới 4Gig. Nếu cần lớn hơn có thể chunk messages.
  • Worried about scaling? - Gearman có khả năng mở rộng rât tốt.

Gearman hoạt động như thế nào?

Gearman là một ứng dụng mạnh mẽ gồm 3 phần: client, job server và worker.

  • Client chịu trách nhiệm tạo một job và gửi cho job server.
  • Job server sẽ tìm worker phù hợp để chuyển và chạy job đó.
  • Worker sẽ thực thi công việc được yêu cầu bởi client và gửi response cho client thông qua job server. Gearman cung cấp client và worker APIs để ứng dụng của chúng ta có thể nói chuyện được với job server qua TCP sockets.

Luồng flow cực kì dễ hiểu và đơn giản phải không nào? Client -> Job server -> Worker -> Job server->Client.

Gearman và Resque [Redis]

  • Resque một ứng dụng khả nổi tiếng, được xây dựng dựa trên Redis queue list type data. Bản chất là các jobs được enque và lưu vào list, các workers chủ động pull jobs từ queue và thực hiện. Ưu điểm là nhẹ và dễ config.
  • Resque được xây dựng cho Ruby, nhưng đã có một cổng cho PHP trên //github.com/chrisboulton/php-resque
  • Gearman thì là một distributed job server, còn Redis là một distributed store.
  • Gearman job có thể đồng bộ [synchronous] hoặc không đồng bộ [asynchronous]. Đồng bộ ở đây đơn giản là thực hiện và phản hồi tức thì. Không đồng bộ chính là ném vào queue và chạy background. Redis chỉ cung cấp xử lý không đồng bộ.
  • Gearman là High availability, khả năng thực hiện và phản hồi nhanh chóng. Nó cung cấp một chiến lược có sẵn [off-the-shelf stragy].
  • Gearman có khả năng mở rộng theo chiều dọc tốt [vertical scalability] bởi vì nó là xử lý đa luồng [multi-threaded processing]. Redis chỉ là xử lý đơn luồng [single threaded].

Gearman mạnh mẽ và nhanh hơn so với Resque.

Install gearman

Install gearmand - Gearman job server

RHEL/Fedora

  • Cài đặt gearmand [bản cũ hơn gọi là gearmand-server]
yum install gearmand     

Debain/Ubuntu Package

apt-get install gearman-job-server

Compile and install from tarball [recommend]

  • Đây là cách tốt nhất để cài đặt bản mới nhất [recommend]. Đâù tiên download bản mới nhất ở đây
  • Tải xong thì bắt đầu cài đặt:
tar xzf gearmand-X.Y.tar.gz
cd gearmand-X.Y
./configure
make
make install

Starting gearmand

Sau khi cài đặt xong job server, chúng ta chạy câu lệnh sau để khởi động gearmand

gearmand -d 

Cài đặt Client & Worker APIs

Gearman hỗ trợ nhiều APIs extension cho nhiều ngôn ngữ khác nhau: PHP, C, Nodejs, Python ... Ở đây chúng ta sẽ cài đặt Gearman PHP extension.

Cài đặt Gearman PHP extention

  • Tải bản mới nhất tại đây.

  • Sau đó chúng ta tiến hành cài đặt:

tar xzf gearman-X.Y.tgz
cd gearman-X.Y
phpize
./configure
make
make install
  • Config gearman cho apache2 và PHP 5.6. Thêm dòng sau vào file php.ini ở folder /etc/php.
extension=gearman.so        
  • Tạo file gearman.ini trong thư mục /etc/php/5.6/mods-available với nội dung như sau:
# /etc/php/5.6/mods-availabe/gearman.ini
extension=gearman.so"       
  • Tạo link cho php-cli:
ln -s /etc/php/5.6/mods-available/gearman.ini /etc/php/5.6/cli/conf.d/gearman.ini

Kiểm tra gearman PHP extension đã cài đặt thành công hay không?

php -i | grep gearman

/etc/php/5.6/cli/conf.d/20-gearman.ini,
gearman
gearman support => enabled
libgearman version => 1.1.13

Restart apache

sudo /etc/init.d/apache2  restart   

Ví dụ

Chúng ta sẽ xem xét ví dụ đầu tiên về gearman bằng bài toán reserve [đảo ngược một chuỗi kí tự nhập vào].

  • Tạo thư mục gearman:
mkdir ~/gearman
cd ~/gearman
  • Tạo file client.php

Chủ Đề