2013-03-18 129 views
0

我通過amqplib在Python中使用rabbitmq。我嘗試將AMQP用於不僅僅是一個隊列的事情,如果可能的話 - 按ID搜索消息,在出隊之前修改它們,在出隊之前從隊列中刪除。這些東西用於存儲/更新平衡器的真實用戶隊列,並且可以通過更改真實用戶的狀態來異步更新該隊列(例如,用戶已經死了 - 他的AMQP消息必須被刪除,或者用戶更改了它的狀態 - 並且每一次這樣的改變都必須反映在用戶的AMQP隊列中,適當的用戶的AMQP消息中),並且在真正的出隊消息發生之前。 我的問題有以下幾點:帶隊列元素隨機讀取寫入訪問的消息隊列(rabbitmq或)

  1. 是否有通過amqplib辦法修改AMQP消息體中 一些queueN將它dequed之前,在 一些ID搜索它,它的頭?我的意思是 - 我想修改郵件正文 由接收方調度它。

  2. 有沒有辦法讓工作人員通過amqplib彈出 excactly 5(任意數量)來自queueN的最後一條消息?

  3. 我可以異步刪除隊列N中的消息,然後它將 dequed,它的鄰居會把它放在queueN?

  4. 哪個是queueN中消息ID1的方法 - 獲取它是真實的 當前隊列的位置,從隊列的起始點開始計數N? AMQP是否存儲/更新任何消息是真正的隊列位置?

    在此先感謝。

更新:根據rabbitmq文檔,這種隨機訪問AMQP隊列中的消息存在問題。請告知另一個Python正確的隊列決定,它支持對它的元素進行快速異步訪問 - 通過正文搜索消息,更新/刪除隊列消息,並獲取任何隊列消息的快速隊列索引。我們用user_info嘗試了deque + additional dict,但在這種情況下,我們需要在每次更新時鎖定這個deque + dict,以避免競爭條件。主要目的 - 服務負載平衡器的隊列並在計算隊列中的更改時排除阻塞。

回答

0

您所描述的內容聽起來像是一個非常典型的中間件管道。儘管在將消息傳遞給預期的使用者之前,它們具有相同的修改消息的效果,但通過訪問隊列無法工作。

其基本思想是所有的消息首先進入一個特殊的隊列,並將它們傳遞給中間件。然後,中間件根據剛剛收到的信息編寫一條新消息,並將該消息發佈到預期收件人的隊列中