2011-10-11 31 views
12

Gần đây tôi đã nghiên cứu việc sử dụng Beanstalkd với PHP. Tôi đã học được khá nhiều nhưng có một số câu hỏi về thiết lập trên một máy chủ, vvCách thiết lập Beanstalkd với PHP

Dưới đây là cách tôi nhìn thấy nó làm việc:

  1. tôi cài đặt Beanstalkd và bất kỳ phụ thuộc (như libevent) trên máy chủ Ubuntu của tôi. Sau đó tôi bắt đầu beanemon beanstalkd (mà về cơ bản nên chạy mọi lúc).
  2. Một nơi nào đó trong trang web của tôi (chẳng hạn như khi người dùng thực hiện một số tác vụ, v.v.), tác vụ được thêm vào các ống khác nhau trong hàng đợi Beanstalkd.
  3. Tôi có một tập lệnh bash (chẳng hạn như tập lệnh sau) được chạy dưới dạng deamon về cơ bản thực thi tập lệnh PHP.

    #!/bin/sh 
    php worker.php 
    

4) Các kịch bản người lao động sẽ có một cái gì đó như thế này để thực hiện xếp hàng nhiệm vụ:

while(1) { 
    $job = $this->pheanstalk->watch('test')->ignore('default')->reserve(); 
    $job_encoded = json_decode($job->getData(), false); 
    $done_jobs[] = $job_encoded; 
    $this->log('job:'.print_r($job_encoded, 1)); 
    $this->pheanstalk->delete($job); 
} 

Bây giờ đây là những câu hỏi của tôi dựa trên các thiết lập ở trên (mà chính xác cho tôi nếu tôi sai về điều đó):

  1. Giả sử tôi có nhiệm vụ nhập nguồn cấp dữ liệu RSS vào cơ sở dữ liệu hoặc thứ gì đó. Nếu 10 người dùng làm điều này cùng một lúc, tất cả họ sẽ được xếp hàng đợi trong ống "thử nghiệm". Tuy nhiên, sau đó chúng chỉ được thực thi một lần. Sẽ tốt hơn nếu có 10 ống khác nhau cùng thực hiện cùng một lúc?

  2. Nếu tôi cần thêm ống, điều đó có nghĩa là tôi cần 10 tập lệnh của nhân viên không? Một cho mỗi ống tất cả chạy đồng thời với cơ bản cùng một mã ngoại trừ chuỗi chữ trong hàm watch().

  3. Nếu tôi chạy tập lệnh đó dưới dạng daemon, nó hoạt động như thế nào? Nó sẽ liên tục thực hiện kịch bản lệnh worker.php? Kịch bản đó lặp lại cho đến khi hàng đợi trống rỗng về mặt lý thuyết, vì vậy nó không nên chỉ được khởi động một lần? Làm thế nào để daemon quyết định tần suất thực thi worker.php như thế nào? Đó chỉ là một thiết lập?

Cảm ơn!

Trả lời

5
  1. Nếu công nhân không mất quá nhiều thời gian để tìm nạp nguồn cấp dữ liệu, điều đó sẽ ổn. Bạn có thể chạy nhiều công nhân nếu được yêu cầu xử lý nhiều lần một lần. Tôi đã có một hệ thống (hiện đang sử dụng SQS của Amazon, nhưng tôi đã thực hiện tương tự với BeanstalkD trước đây), với tối đa 200 (hoặc nhiều hơn) công nhân kéo từ hàng đợi.
  2. Một tập lệnh đơn lẻ (cùng một tập lệnh chạy nhiều lần) sẽ ổn - tập lệnh có thể xem nhiều ống cùng một lúc và tập lệnh đầu tiên có sẵn sẽ được đặt trước. Bạn cũng có thể sử dụng lệnh job-stat để xem một công việc $ cụ thể đến từ đâu (ống nào) hoặc đặt một số thông tin meta vào thư nếu bạn cần phải nói cho từng loại từ một thư khác.
  3. Một ví dụ điển hình về việc điều hành công nhân là described here. Tôi cũng đã thêm supervisord (cũng là một useful post để bắt đầu) để dễ dàng bắt đầu và tiếp tục chạy một số công nhân trên mỗi máy (tôi chạy tập lệnh shell, như trong first link).Tôi sẽ giới hạn số lần nó lặp lại, và cũng đặt một số vào số reserve() để nó chờ vài giây, hoặc nhiều hơn, cho công việc tiếp theo trở nên sẵn có mà không bị mất kiểm soát trong một vòng lặp kín mà không tạm dừng ở tất cả - ngay cả khi không có gì để làm.

Phụ Lục:

  1. Các shell script sẽ được chạy nhiều lần như bạn cần. (liên kết hiển thị cách chạy lại theo yêu cầu với exec [email protected]). Bất cứ khi nào tập lệnh php thoát, nó sẽ chạy lại PHP.
  2. Dường như có ứng dụng Djanjo để hiển thị một số chỉ số, nhưng nó đủ tầm thường để kết nối với daemon, lấy danh sách các ống và sau đó lấy số liệu thống kê cho mỗi ống - hoặc chỉ đếm.
+0

Cảm ơn bạn đã liên kết! Tôi chắc chắn sẽ xem xét những điều đó. Câu hỏi về # 2: Kịch bản đó sẽ được thực thi bao lâu một lần? Điều đó hoàn toàn dựa trên tần suất tôi có tập lệnh bash của tôi được thực hiện bởi daemon? – joshholat

+0

Ngoài ra, có cách nào thuận tiện (thông qua một đoạn mã hoặc "bảng điều khiển" loại điều) để xem tất cả những gì đang thực hiện, vv với cây đậu? – joshholat

+1

hầu hết/tất cả thư viện sẽ cung cấp cuộc gọi đến các lệnh thống kê, danh sách-ống và lệnh stat-ống. Có một số người khác nữa. Tôi đã không nhìn thấy https://github.com/andreisavu/django-jack chạy, nhưng điều đó có thể làm một số điều quá. –

Các vấn đề liên quan