2012-02-05 18 views
13

Có phải RabbitMQ gọi hàm gọi lại cho người tiêu dùng khi nó có một số thông báo cho nó hay người tiêu dùng có phải thăm dò ý kiến ​​khách hàng RabbitMQ không?RabbitMQ có gọi chức năng gọi lại cho người tiêu dùng khi nó có một số tin nhắn cho nó không?

Vì vậy, về phía người tiêu dùng, nếu có một kịch bản PHP, có thể RabbitMQ gọi nó và truyền thông điệp/tham số cho nó. ví dụ. nếu đánh giá được gửi trên mảnh 1 và bảng aggregateRating là trên mảnh 2, sau đó sẽ RabbitMQ người tiêu dùng trên mảnh 2 kích hoạt kịch bản nói aggRating.php và vượt qua các thông số đã được chèn vào trong phân đoạn 1?

+1

Các thư viện được triển khai khác nhau. Hầu hết trong số họ có hỗ trợ cho basic.consume.Nếu thư viện php của bạn không, bạn sẽ cần phải viết của riêng bạn. Ví dụ, bạn có thể chạy kịch bản php của bạn bằng một kịch bản python hoặc chương trình java tiêu thụ thông điệp từ người môi giới. – scvalex

+0

Các máy khách Python/Java sẽ không phải thăm dò ý kiến ​​nào cả, nhưng họ sẽ cần một kết nối ổn định cho người môi giới. Các nhà môi giới sẽ đẩy tin nhắn cho các khách hàng P/J. Sau đó, khách hàng có thể gọi tập lệnh của bạn cho từng thư. Xem hướng dẫn về RabbitMQ để biết chi tiết: http://www.rabbitmq.com/getstarted.html – scvalex

+1

Tôi không có bất kỳ kinh nghiệm nào với PHP và tôi không biết gì về các ứng dụng PHP AMQP. Bất cứ điều gì tôi đã nói về thư viện PHP chỉ là một dự đoán được giáo dục. Tôi chưa thực sự trả lời câu hỏi của bạn ở đây. BTW, trong tương lai, bạn có thể muốn đăng các câu hỏi như thế này lên danh sách gửi thư thảo luận của RabbitMQ. Tôi nghĩ tôi là nhà phát triển RabbitMQ duy nhất kiểm tra SO; nhưng chúng tôi đưa ra một điểm trả lời bất kỳ câu hỏi nào được đăng trên danh sách gửi thư. – scvalex

Trả lời

9

Điều bạn muốn là basic.consume, cho phép nhà môi giới đẩy tin nhắn cho khách hàng.

Điều đó nói rằng, các thư viện được triển khai khác nhau. Hầu hết trong số họ có hỗ trợ cho basic.consume, nhưng vì những hạn chế vốn có của các khung công tác được sử dụng, một số không (đáng chú ý nhất là ứng dụng khách RabbitMQ C chính thức có rất nhiều khách hàng khác).

Nếu thư viện PHP của bạn không hỗ trợ basic.consume, bạn phải sử dụng bỏ phiếu (xấu) hoặc bạn có thể sử dụng một trong những khách hàng hoàn chỉnh hơn để thúc đẩy tập lệnh. Ví dụ: bạn có thể viết chương trình Python hoặc Java tiêu thụ từ nhà môi giới (vì vậy, nhà môi giới đẩy giao hàng cho họ) và họ có thể gọi tập lệnh bất cứ khi nào nhận được thư mới. Các official tutorials là một giới thiệu tuyệt vời cho các API AMQP và là một nơi tốt để bắt đầu.

Điều này hiệu quả từ hầu hết các quan điểm, nhưng nó yêu cầu kết nối ổn định với người môi giới.

Nếu nghi ngờ về khả năng của các khách hàng khác nhau hoặc nếu bạn cần thêm hướng dẫn, danh sách gửi thư RabbitMQ Discuss là một nơi tuyệt vời để đặt câu hỏi. Các nhà phát triển làm cho một điểm trả lời bất kỳ truy vấn được đăng ở đó.

0

Pecl amqp cho phép sử dụng chức năng tiêu thụ với phương pháp AMQPQueue::consume. Bạn chỉ cần vượt qua chức năng gọi lại trong nó và nó sẽ được thực hiện khi tin nhắn đến.

10

Phương thức tiêu thụ AMQPQueue :: bây giờ là triển khai "đúng" của basic.consume kể từ phiên bản 1.0 của thư viện PHP AMQP (http://www.php.net/manual/en/amqpqueue.consume.php). Thật không may, vì PHP là một ngôn ngữ đơn luồng, bạn không thể làm những việc khác trong khi chờ đợi một thông điệp trong cùng một không gian quy trình. Nếu bạn gọi AMQPQueue :: tiêu thụ và vượt qua nó một cuộc gọi lại, toàn bộ ứng dụng của bạn sẽ chặn và chờ cho thông điệp tiếp theo được gửi bởi nhà môi giới, tại thời điểm đó nó sẽ gọi hàm gọi lại được cung cấp. Nếu bạn muốn một phương pháp không chặn, bạn sẽ phải sử dụng AMQPQueue :: get (http://www.php.net/manual/en/amqpqueue.get.php), sẽ thăm dò ý kiến ​​của máy chủ cho một tin nhắn và trả về B FNG B bNG nếu không có thông báo.

Tôi không đồng ý với đề xuất của scvatex về việc sử dụng ngôn ngữ riêng để sử dụng phương pháp "đẩy" cho vấn đề này. PHP không phải là IO điều khiển, và do đó sử dụng một ngôn ngữ riêng để gọi một kịch bản PHP khi một thông điệp có vẻ phức tạp không cần thiết: tại sao không chỉ sử dụng AMQPQueue :: tiêu thụ và để khối quá trình (chờ tin nhắn), và đặt tất cả logic trong gọi lại hoặc thực hiện cuộc gọi lại chạy một tập lệnh PHP riêng biệt.

Chúng tôi đã thực hiện công việc sau này như một hệ thống xử lý công việc quy mô lớn để chúng tôi có thể tách biệt các lỗi và giữ bộ xử lý công việc cho cha mẹ bất kể điều gì xảy ra ở trẻ em. Nếu bạn muốn có một mô tả chi tiết về cách chúng tôi thiết lập điều này và một số mẫu mã, tôi sẽ rất vui khi đăng chúng.

+0

Bạn có thể vui lòng đăng các ví dụ của bạn về hệ thống xử lý quy mô lớn (Github có thể không?) – JavaSa

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