2009-02-08 43 views
9
  • Bạn đã thiết lập một hoặc nhiều tập lệnh công nhân cho hệ thống định hướng hàng đợi như thế nào?
  • Làm cách nào để sắp xếp khởi động - và khởi động lại nếu cần - các tập lệnh công nhân theo yêu cầu? (Tôi đang nghĩ về các công cụ như init.d /, 'god' dựa trên Ruby, Daemontools của DJB, v.v.)

Tôi đang phát triển hệ thống hàng đợi/nhân viên không đồng bộ, trong trường hợp này sử dụng PHP & BeanstalkdD (mặc dù ngôn ngữ thực tế và daemon không quan trọng). Các nhiệm vụ không phải là quá khó - mã hóa một mảng với các lệnh và các tham số vào JSON để vận chuyển qua daemon Beanstalkd, chọn chúng trong một kịch bản công nhân để hành động chúng theo yêu cầu.Hệ thống xếp hàng - cách tốt nhất để bắt đầu nhiều công nhân là gì?

Có một số thiết lập hàng đợi/công nhân tương tự khác, chẳng hạn như Starling, Gearman, Amazon's SQS và các hệ thống định hướng 'doanh nghiệp' khác như MQ và RabbitMQ của IBM. Nếu bạn chạy một cái gì đó như Gearman, hoặc SQS - làm cách nào để bạn bắt đầu và kiểm soát nhóm công nhân? Câu hỏi đặt ra là khởi động công nhân ban đầu, và sau đó có thể bổ sung thêm công nhân, tắt chúng theo ý muốn (mặc dù tôi có thể gửi tin nhắn thông qua hàng đợi để tắt chúng - miễn là một số 'người quan sát' sẽ không tự động khởi động lại chúng). Đây không phải là một vấn đề PHP, đó là về các quy trình Unix thẳng của việc thiết lập một hoặc nhiều quy trình để chạy khi khởi động, hoặc thêm nhiều công nhân hơn vào nhóm.

A bash script to loop a script đã sẵn sàng - điều này gọi tập lệnh PHP sau đó thu thập và chạy các nhiệm vụ từ hàng đợi, thỉnh thoảng thoát ra để có thể tự làm sạch nó (nó cũng có thể tạm dừng một vài giây do lỗi hoặc thông qua kế hoạch biến cố). Điều này làm việc tốt, và xây dựng các quy trình công nhân trên đầu trang mà sẽ không phải là rất khó khăn cả.

Bắt hệ thống điều khiển công nhân tốt là về tính linh hoạt, bắt đầu một hoặc hai tự động trên máy bắt đầu và có thể thêm một vài từ dòng lệnh khi hàng đợi bận, tắt các tính năng bổ sung khi không còn yêu cầu .

+0

Xin chào! Bạn đã triển khai hệ thống của mình như thế nào? Tôi có vấn đề triển khai tương tự và muốn nhận được một số phản hồi từ bạn. – wormhit

Trả lời

0

Phần mềm trung gian xếp hàng thông điệp thực như WebSphere MQ hoặc MSMQ cung cấp "trình kích hoạt" trong đó dịch vụ là một phần của MQM sẽ bắt đầu một nhân viên khi các thư mới được đặt vào hàng đợi.

AFAIK, không có hệ thống xếp hàng "dịch vụ web" nào có thể làm điều đó, theo bản chất của con thú. Tuy nhiên tôi chỉ nhìn chăm chú vào SQS. Ở đó bạn phải bình chọn hàng đợi, và trong trường hợp của Amazon quá háo hức bỏ phiếu sẽ khiến bạn tốn một số tiền thật.

4

Tôi đã giúp một người bạn đang làm việc trên một dự án liên quan đến hàng đợi dựa trên Gearman sẽ gửi nhiều công việc không đồng bộ khác nhau tới các trình nền PHP và C khác nhau trên một nhóm nhiều máy chủ.

Các công nhân đã được thiết kế để hành xử giống như daemon unix/linux cổ điển, nhờ vào kịch bản shell đơn giản trong /etc/init.d/, và lệnh như:

invoke-rc.d myWorker start|stop|restart|reload

Cơ chế này rất đơn giản và hiệu quả. Và vì nó dựa trên các tính năng chuẩn của Linux, ngay cả những người có kiến ​​thức hạn chế về ứng dụng của bạn cũng có thể khởi động một trình nền hoặc dừng một, nếu họ biết nó được gọi là hệ thống khôn ngoan (aka "myWorker" trong ví dụ trên).

Một ưu điểm khác của cơ chế này là nó giúp cho công nhân của bạn dễ dàng quản lý hồ bơi. Bạn có thể có 10 daemon trên máy của bạn (myWorker1, myWorker2, ...) và có một "người quản lý công nhân" bắt đầu hoặc dừng chúng tùy thuộc vào độ dài hàng đợi.Và vì các lệnh này có thể chạy qua ssh, bạn có thể dễ dàng quản lý một số máy chủ.

Giải pháp này nghe có vẻ rẻ tiền, nhưng nếu bạn xây dựng nó với các trình nền tảng được mã hóa tốt và tập lệnh quản lý đáng tin cậy, tôi không thấy lý do tại sao nó kém hiệu quả hơn giải pháp big-bucks. ") dự án quan trọng.

+0

Đó là một phương pháp vững chắc để bắt đầu công nhân. http://pear.php.net/package/System_Daemon cũng có thể hữu ích trong việc tạo tập lệnh init.d. –

+0

Tôi thực sự tình cờ gặp gói này một vài giờ trước, trong khi nhìn, ra khỏi tò mò, những gì đã có sẵn để tạo ra init script :) Có vẻ tuyệt vời để tiết kiệm thời gian. – Nicolas

+0

có hoạt động trên Amazon Linux không? cenOS/RHEL –

0

Gần đây tôi đã làm việc trên một công cụ như vậy. Nó không hoàn toàn hoàn thành (nghĩ rằng nó sẽ mất hơn một vài ngày trước khi tôi nhấn cái gì tôi có thể gọi 1.0) và rõ ràng chưa sẵn sàng cho sản xuất, nhưng phần quan trọng đã được mã hóa. Bất kỳ ai cũng có thể xem mã tại đây: https://gitorious.org/workers_pool.

+0

Tính năng này có hoạt động không? Tốt? – SamB

+0

@ SamB: nó hoạt động nhưng tôi đã không thực hiện "đi chạy trong nền như một daemon" được nêu ra, và tôi vẫn phải thực hiện một giao diện dòng lệnh khá bằng cách sử dụng getopt để tùy chỉnh các tham số (hiện tại chúng được định nghĩa trong một tiêu đề và tôi phải biên dịch lại để thay đổi chúng). Không còn nhiều việc nhưng tôi chỉ cần một khoảng thời gian để làm việc đó. Dù sao câu trả lời của tôi là nhiều hơn về nhìn vào mã để xem làm thế nào nó có thể được thực hiện hơn về việc sử dụng dự án nhỏ của tôi. – p4bl0

0

Supervisor là công cụ giám sát tốt. Nó bao gồm một giao diện người dùng web, nơi bạn có thể theo dõi và quản lý công nhân.

Đây là tệp cấu hình đơn giản cho một nhân viên.

[program:demo] 
command=php worker.php ; php command to run worker file 
numprocs=2 ; number of processes 
process_name=%(program_name)s_%(process_num)03d ; unique name for each process if numprocs > 1 
directory=/var/www/demo/ ; directory containing worker file 
stdout_logfile=/var/www/demo/worker.log ; log file location 
autostart=true ; auto start program when supervisor starts 
autorestart=true ; auto restart program if it exits 
Các vấn đề liên quan