2012-02-05 95 views
13

RabbitMQ是否爲消費者調用回調函數,或消費者是否必須輪詢RabbitMQ客戶端?當消費者有消息時,RabbitMQ是否會調用回調函數?

所以在消費者一方,如果有一個PHP腳本,可以RabbitMQ的調用它,並且該消息/參數傳遞給它。例如如果評分在分片1上提交,並且aggregateRating表在分片2上,那麼分片2上的RabbitMQ使用者觸發腳本說aggRating.php並傳遞插入分片1中的參數?

+1

這些庫的實現方式不同。他們中的大多數人都支持basic.consume。如果你的php庫沒有,你需要寫你自己的。例如,你可以通過一個python腳本或java程序來驅動你的php腳本,這個腳本或java程序會消耗來自代理的消息。 – scvalex 2012-02-08 10:39:36

+0

Python/Java客戶端根本不必輪詢,但他們需要與代理的穩定連接。經紀人會將消息推送給P/J客戶。然後客戶可以爲每條消息調用您的腳本。有關詳細信息,請參閱RabbitMQ教程:http://www.rabbitmq.com/getstarted.html – scvalex 2012-02-12 18:51:40

+1

我對PHP沒有任何經驗,我對PHP AMQP客戶端一無所知。我所說的關於PHP庫的任何事情都只是一個受過教育的猜測。我在這裏沒有真正回答你的問題。順便說一下,在將來,您可能需要將這樣的問題發佈到RabbitMQ討論郵件列表中。我認爲我是唯一一個檢查SO的RabbitMQ開發者;但我們會回覆郵件列表上發佈的任何問題。 – scvalex 2012-02-13 16:05:18

回答

9

你想要的是basic.consume,這使得券商郵件推送到客戶端。

也就是說,庫的實現方式不同。他們中的大多數都支持basic.consume,但由於所使用框架的固有限制,有些不是(最值得注意的是許多其他客戶端基於的官方RabbitMQ C客戶端)。

如果您的PHP庫不支持basic.consume,您必須使用輪詢(錯誤),或者您可以使用其中一個更完整的客戶端來驅動腳本。例如,您可以編寫一個從代理消耗的Python或Java程序(因此,代理交付給它們),並且他們可以在收到新消息時調用腳本。 official tutorials是對AMQP API的一個很好的介紹,並且是一個很好的開始。

從大多數觀點來看,這是有效的,但它確實需要與代理的穩定連接。

如果對各種客戶端的能力毋庸置疑,或者如果你需要更多的引導,RabbitMQ Discuss郵件列表是一個偉大的地方提出問題。開發人員重點回答在那裏發佈的任何查詢。

0

PECL AMQP允許使用消耗的功能與AMQPQueue::consume方法。你只需要傳遞迴調函數,當消息到達時它會被執行。

10

AMQPQueue :: consume方法現在是PHP AMQP庫版本1.0的basic.consume的「適當」實現(http://www.php.net/manual/en/amqpqueue.consume.php )。不幸的是,由於PHP是單線程語言,因此在等待同一進程空間中的消息時無法做其他事情。如果您調用AMQPQueue :: consume並傳遞一個回調函數,則整個應用程序將阻塞並等待代理髮送下一條消息,此時它將調用所提供的回調函數。如果你想要一個非阻塞的方法,你將不得不使用AMQPQueue :: get(http://www.php.net/manual/en/amqpqueue.get.php),它將輪詢服務器的消息,並返回如果沒有消息,則爲布爾值FALSE。

我不同意scvatex的建議使用一個單獨的語言使用「推」的辦法解決這個問題,雖然。 PHP不是IO驅動的,因此當消息到達時使用單獨的語言調用PHP腳本似乎是不必要的複雜性:爲什麼不使用AMQPQueue :: consume並讓進程阻塞(等待消息),並且將所有回調中的邏輯或使回調運行一個單獨的PHP腳本。

我們已經做了後者,在我作爲一個大規模的作業處理系統的工作,使我們能夠隔離錯誤,並保留父作業處理器無論在孩子發生了什麼運行。如果您希望詳細說明我們如何設置這些代碼示例,我將非常樂意發佈它們。

+0

你可以發表你的關於大規模處理系統的例子嗎(Github也許?) – JavaSa 2014-08-10 14:25:07

相關問題