Gearman

**Gearman** là một khuôn khổ ứng dụng nguồn mở do Brad Fitzpatrick viết bằng ngôn ngữ Perl.
Gearman hỗ trợ ứng dụng bao gồm ba phần: một client, một worker và server job. client có sẽ tạo ra một công việc để chạy và gửi nó tới server job. server job sẽ tìm worker phù hợp có thể chạy các công việc và chuyển tiếp các công việc trên. Các worker thực hiện công việc theo yêu cầu của client và gửi một respone cho khách hàng thông qua server job. Gearman cung cấp cho client và worker các API mà các ứng dụng của bạn liên lạc để nói chuyện với các server job Gearman (còn gọi là gearmand) do đó bạn không cần phải đối phó với mạng hoặc lập bản đồ của công việc. Nội bộ, các API gearman client và worker giao tiếp với máy chủ công việc bằng cách sử dụng giao thức TCP socket. Để giải thích làm thế nào Gearman thực hiện cụ thể hơn, ta xem xét một ứng dụng đơn giản mà sẽ đảo ngược thứ tự của các ký tự trong một chuỗi. Ví dụ được đưa ra trong PHP, mặc dù các API khác cũng sẽ nhìn khá giống nhau

:# Reverse Client Code

$client= new GearmanClient();

$client->addServer();

print $client->do("reverse", "Hello World!");


Code này khởi tạo một lớp Client, cấu hình nó để sử dụng một Server job với add_server (đối số không có, có nghĩa là sử dụng 127.0.0.1 với cổng mặc định), và sau đó nói với các API Client phải chạy việc hàm "reverse" với công việc Hello world! "". Tên hàm và các đối số là hoàn toàn tùy ý theo như Gearman là có liên quan, vì vậy bạn có thể gửi bất kỳ cấu trúc dữ liệu mà hiện thích hợp cho các ứng dụng của bạn (text hoặc binary). Tại thời điểm này Client Gearman API sẽ đóng gói công việc vào một gói giao thức Gearman và gửi đến các Server job để tìm một worker thích hợp có thể chạy các hàm "reverse". Bây giờ hãy nhìn vào code worker:
# Reverse Worker Code

$worker= new GearmanWorker();

$worker->addServer();

$worker->addFunction("reverse", "my_reverse_function");

while ($worker->work());

 
function my_reverse_function($job)

{

  return strrev($job->workload());

}

code này định nghĩa một hàm "my_reverse_function" mà có một chuỗi và trả về đảo ngược của chuỗi đó. Nó được sử dụng bởi một đối tượng worker để đăng ký một hàm mang tên "reverse" sau khi được thiết lập để kết nối với server công việc tương tự yêu cầu theo client. Khi những Server job nhận được công việc để có thể chạy, nó chỉ nhìn vào danh sách những worker đã đăng ký tên hàm "reverser" và chuyển công việc sang một trong số việc worker miễn phí. Nhân viên Gearman API sau đó có yêu cầu này, chạy chức năng "my_reverse_function", và gửi kết quả của hàm mà trở lại thông qua việc Server job cho khách hàng.

Như bạn thấy, việc API Client và worker (cùng với việc Server job) đối phó với việc quản lý job và giao tiếp mạng để bạn có thể rãnh trên việc phần ứng dụng. Có một vài cách khác nhau bạn có thể chạy job trong Gearman, bao gồm cả nền tảng cho xử lý không đồng bộ và các công việc ưu tiên. Xem tài liệu có sẵn cho việc API khác nhau để biết chi tiết.

Làm thế nào là Gearman hữu ích?

Ví dụ reverse ở trên có vẻ như rất nhiều công việc để chạy một chức năng, nhưng có một số cách khác nhau này có thể hữu ích. Câu trả lời đơn giản là bạn có thể sử dụng Gearman như interface giữa một client và worker được viết bằng ngôn ngữ khác nhau. Nếu bạn muốn ứng dụng web PHP của bạn để gọi một hàm viết bằng C, bạn có thể sử dụng API của client với các worker PHP C API, và dính một server job ở giữa. Tất nhiên, có nhiều cách hiệu quả để làm điều này (như viết một phần mở rộng PHP trong C), nhưng bạn có thể muốn có một client và worker PHP Python, hoặc có lẽ một client MySQL và Perl worker. Bạn có thể trộn và kết hợp bất kỳ interface ngôn ngữ được hỗ trợ một cách dễ dàng, bạn chỉ cần tất cả các ứng dụng để có thể hiểu được khối lượng công việc được gửi đi. Có phải ngôn ngữ yêu thích của bạn không hỗ trợ được? Cùng tham gia với dự án, đây có thể là khá dễ dàng cho bạn hoặc một trong những nhà phát triển Gearman hiện có để đặt một bao bọc ngôn ngữ trên đầu trang của thư viện C.

Cách tiếp theo mà Gearman có thể hữu ích là đặt mã worker trên một máy riêng biệt (hoặc cụm máy) được tốt hơn phù hợp để làm việc. PHP ứng dụng web của bạn muốn làm chuyển đổi hình ảnh, nhưng điều này là quá nhiều xử lý nó trên các máy server web. Bạn có thể thay cho hình ảnh con tàu đi tới một thiết lập riêng biệt của các máy worker để thực hiện chuyển đổi, bằng cách này tải trọng không ảnh hưởng đến hiệu suất của server web của bạn và PHP script khác. Bằng cách này, bạn cũng có được một hình thức tự nhiên của cân bằng tải từ máy chủ job chỉ gửi công việc mới cho lao động nhàn rỗi. Nếu tất cả các công nhân đang chạy trên một máy nhất định được bận rộn, bạn không cần phải lo lắng về việc làm mới được gửi ở đó. Điều này làm cho quy mô-ra với các máy chủ đa lõi khá đơn giản: bạn có 16 lõi vào một máy worker? Bắt đầu tăng 16 trường hợp worker của bạn (hoặc có thể nhiều hơn nếu họ không phải là CPU bị ràng buộc). Nó cũng liên tục để thêm máy mới để mở rộng pool worker của bạn, chỉ cần khởi động chúng lên, cài đặt mã worker, và chúng sẽ kết nối tới máy chủ job hiện tại.

Bây giờ bạn có thể yêu cầu các server job nếu cái gì chết? Bạn có thể chạy server nhiều job và có client và worker kết nối tới máy chủ job đầu tiên chúng được cấu hình sẵn với. Bằng cách này, nếu một job server chết, client và worker tự động thực hiện chuyển sang một server job. Bạn có lẽ không muốn chạy các máy chủ job quá nhiều, nhưng có hai hoặc ba là một ý tưởng tốt để dự phòng. Sơ đồ bên trái cho thấy cách một Gearman đơn giản nhóm có thể nhìn.

Từ đây, bạn có thể mở rộng ra client của bạn và worker khi cần thiết. Các server có thể dễ dàng xử lý các job có hàng trăm client và worker kết nối cùng một lúc. Bạn có thể vẽ cac máy vật lý của chính bạn (hoặc ảo) các dòng máy có khả năng cho phép, có khả năng phân phối tải trọng cho bất kỳ số lượng máy móc. Để biết thêm chi tiết về sử dụng cụ thể và cài đặt, xem mục về các trường hợp use case.

## Tham khảo

## Liên kết ngoài
*http://danga.com/words/2007_06_usenix/usenix.pdf
*http://www.gearman.org/doku.php 
*http://lists.danga.com/pipermail/gearman/2008-April/000076.html
*http://krow.livejournal.com/628025.html