2011-11-08 49 views
0

我們有一個要求,它會導致設計約束,它是顯示塞子。在這裏,它是,線程(發送者)只發送請求時線程(收件人)如何向文件寫入請求和響應?

  1. 發件人線程將請求放入消息隊列。輸入源是一個包含1000萬個請求的文本文件。

  2. Recevier線程輪詢來自另一個隊列的響應並將其寫入另一個輸出文件。

設計約束:

  1. Recevier線程必須寫請求和響應到輸出文件。 這怎麼可能?

  2. 沒有數據庫應該使用

  3. 緩存發送和相應的反應已經recevied因爲性能瓶頸,不能使用後更新前的請求。

  4. 在少數情況下,如果響應延遲很長時間,則會發生超時。

請指教。

+0

請求和響應是否有某種唯一標識符? – Bringer128

+0

爲什麼(1)和(2)的隊列不同? – EJP

+0

@EJP這可能是一個優化來提高吞吐量。通過異步處理響應,停滯的請求處理不會延遲其他請求/響應對。 –

回答

0

由於您只有一個Receiver線程,因此可以保證一次只能處理一個請求。

發送者線程寫入請求和響應可能不是最優雅的設計,但是您肯定可以讓Receiver線程寫入{request,response}元組。 Receiver線程也可以在開始處理之前寫入請求,並在完成之後寫入響應。它的結果與你的目標相同。

如果您提供有關您設計的更多詳細信息,我可以爲您提供更多設計幫助。

+0

多個請求處理程序可能正在並行讀取「消息隊列」,並以不可預知的順序將其響應放在「其他隊列」上。 –

+0

最終實現將取決於生產者/消費者線程的數量 - 商定的。 – inder

0

解決方案的幾點思路:

接收線程可以從文件中查找原始請求。這需要響應具有某種形式的唯一關聯ID。

處理線程可以將原始請求添加到響應中。這使得消息的大小更大,但是避免了相關ID的需要。它還需要對處理程序線程進行配置/代碼更改。

發件人線程可以在輔助本地隊列上覆制請求。接收者線程在這個隊列上查找接收到的響應的原始請求。響應可能不會以與發送請求相同的順序接收,因此接收者線程可能需要「走隊列」來查找效率不高的請求。

最後的解決方案包含一種緩存形式。您聲明由於性能原因這是不允許的。我不明白爲什麼。本地緩存速度很快,並且在任何給定時間緩存中都不應該有大量的排隊請求,因爲發送,處理和接收都是異步的。

+0

尊敬的Koster,感謝您的解答。無論如何,我們決定使用您的最後解決方案。讓我看看它在測試過程中的影響。我們將讀取幾個請求到java隊列中,每個線程輪詢來自隊列的請求,將它放入消息隊列並等待響應。但在這種情況下,性能瓶頸是相同的線程必須等待沒有超時選項啓用的響應。 – Hari