1
更新:Java的嵌套隊列
總之,我有一個消息發送從用戶到服務的隊列。 但是,當一個服務獲得1000條消息時,比隊列由 支配,它和其他服務在隊列爲空之前不會收到消息。我需要這種方法的解決方案。
我對我的BlockingQueue有問題。比方說,我有100個外部服務,我負責向他們發送消息來自用戶。
用戶 - >我 - >第三方。
我在我的應用程序中使用隊列。當其中一個第三方服務不可用時發生問題:
- 從用戶接收到任何第三方的消息。將它們保存在同一個隊列中可以說Q1。
- 消費隊列,識別第三方服務併發送給對應的第三方。
- 第三方之一不響應,超時。
- 保存無法將它們傳送到數據庫的消息。
- 定期從數據庫獲取未發送的消息並將它們放入我的Q1。
- 如果該第三方獲得大量流量,可以說5000個消息(填滿我的隊列)比其他服務的非消息從我那裏收到消息,直到此隊列爲空。但是當這個隊列爲空時,他們將不會收到消息,因爲我將再次從DB獲取消息並將它們放入隊列中,其他服務將再次被阻塞。
Solutiouns,我認爲到目前爲止:
- 使用嵌套隊列的業務ID,所以我會在一次5000級的消息找出封鎖的服務,並將它們保存到數據庫沒有5000次消費從隊列中的消息(可更因爲消息將不會是爲了,他們都是一起與其他服務於一體的隊列)
如何有效地使用嵌套concurret隊列(這是我使用的BlockingQueue),或者你認爲此方案更好的解決方案?基本上我不想讓第三方下降支配我的隊列。我需要一個聰明的方法來分隔這些隊列,可能會有成千上萬的隊列,因此爲每個隊列創建一個隊列可能是無效的。
你有沒有考慮過使用像RxJava這樣的響應式框架? –
你可以標記出現超時的那些,並且不要將它們放回隊列中以增加時間。比如,第一次你只在5秒後才把它們放回去,第二次它們會出來10,然後是20,40,一分鐘,兩分鐘等等。你明白了。爲了不讓系統空閒,如果隊列爲空,則可以忽略上述情況。 –
我必須先研究RxJava,謝謝你的建議。我已經有超時映射,它的工作原理就好像X個消息是超時消息,而不是服務Y的新消息寫入數據庫而不是隊列,並且將被阻塞Z次。經過Z次後,如果它仍然被阻塞,則新消息被阻塞,直到Z + 1次等。但是另一方面,這使得該服務在DB中等待處理大量消息。從數據庫中檢索這些消息以進行處理時,比我的隊列再次被阻塞。 – cmlonder