2010-09-22 115 views
0

關於ActiveMQ:我有一個場景,我有一個生產者向用戶發送小文件(大約10KB)。雖然文件很小,但消費者需要大約10秒來分析它們並將結果返回給製作人。我已經研究了很多,但我仍然無法找到以下問題的答案:ActiveMQ:緩慢處理消費者

  1. 如何讓代理存儲隊列中的文件(完全)?
  2. 我應該使用ObjectMessage(因爲文件很小)還是blob消息?
  3. 由於消費者處理緩慢,我應該降低他們的prefetchLimit還是使用循環調度策略?哪一個更好?
  4. 最後,在ActiveMQ常見問題解答中,我讀到了這一點 - 「如果消費者收到消息並且在關閉之前沒有確認它,那麼消息將被重新發送給另一個消費者。」所以我的問題是,ActiveMQ是否保證只有一個消費者會處理這個消息(因此對於生產者只有一個答案),或者不是?消費者何時確認消息(在默認的自動確認設置中) - 何時接收消息並將其存儲在會話中,或者onMessage處理程序何時完成?而且,由於消費者的處理速度非常緩慢,我應該改變一些「超時限制」,以便經紀人在將工作交給其他消費者之前知道需要等待多久(這與我之前的問題有關)?

回答

0

不確定其他人,但這裏有一些想法。

第一:我不確定你確切的擔憂是什麼。 ActiveMQ確實將消息存儲在數據存儲中;所有數據都不需要駐留在任何一個地方(代理或客戶端)的內存中。所以你應該在這方面做得很好。早期的版本確實需要所有需要適合內存的id(不知道是否已解決),但即使內存使用量足夠低,除非擁有數千萬的隊列內消息。

至於ObjectMessage vs blob;原始字節數組(blob)應該是最簡潔的表示形式,但是由於所有這些都會被序列化以用於存儲,所以它只會影響客戶機上的內存使用情況。預取主要有助於訪問延遲;但考慮到它們處理起來很慢,您可能不需要任何預取;所以是的,要麼將其設置爲1或2,要麼完全禁用。關於保證:分佈式消息隊列可以保證的最少要麼是至少一次(可能有重複),要麼最多一次(沒有重複,可能會丟失消息)。通常至少採取一次,並讓客戶使用客戶提供的id進行重複。如何發送確認是由JMS規範所定義的,因此您可以閱讀關於JMS的更多信息;這不是ActiveMQ特有的。 是的,你應該設置足夠高的時間以使工作人員通常可以完成工作,包括所有網絡延遲。這可能會減慢丟棄郵件的重新傳輸(如果工作死亡),但對您而言可能不是問題。

+0

非常感謝您的快速回復!實際上,我讀到的有關JMS(例如 - http://en.wikipedia.org/wiki/Java_Message_Service)的一些內容沒有被提及,或者與我讀到的關於ActiveMQ的內容相矛盾。例如,在那篇文章中,它表示消息存儲在隊列中(因此生產者在消費者使用該消息時不必處於活動狀態),這在activeMQ網站上無法找到。另外,它說在隊列模型(我說的那個)中,只有一個消費者得到消息(正如你所說的那樣,並不是由ActiveMQ保證的)。 – Petar 2010-09-22 22:02:37

+0

對於ActiveMQ的文檔可能不是那麼好。但它肯定會存儲消息,因爲這是消息隊列的全部要點(異步操作)。有些模式沒有完整的持久性,只是將它們放在代理的內存隊列中,但這是您必須配置的。 – StaxMan 2010-09-23 00:22:57