2017-12-27 399 views
1

更新:Java的嵌套隊列

總之,我有一個消息發送從用戶到服務的隊列。 但是,當一個服務獲得1000條消息時,比隊列由 支配,它和其他服務在隊列爲空之前不會收到消息。我需要這種方法的解決方案。

我對我的BlockingQueue有問題。比方說,我有100個外部服務,我負責向他們發送消息來自用戶。

用戶 - >我 - >第三方。

我在我的應用程序中使用隊列。當其中一個第三方服務不可用時發生問題:

  • 從用戶接收到任何第三方的消息。將它們保存在同一個隊列中可以說Q1。
  • 消費隊列,識別第三方服務併發送給對應的第三方。
  • 第三方之一不響應,超時。
  • 保存無法將它們傳送到數據庫的消息。
  • 定期從數據庫獲取未發送的消息並將它們放入我的Q1。
  • 如果該第三方獲得大量流量,可以說5000個消息(填滿我的隊列)比其他服務的非消息從我那裏收到消息,直到此隊列爲空。但是當這個隊列爲空時,他們將不會收到消息,因爲我將再次從DB獲取消息並將它們放入隊列中,其他服務將再次被阻塞。

Solutiouns,我認爲到目前爲止:

  • 使用嵌套隊列的業務ID,所以我會在一次5000級的消息找出封鎖的服務,並將它們保存到數據庫沒有5000次消費從隊列中的消息(可更因爲消息將不會是爲了,他們都是一起與其他服務於一體的隊列)

如何有效地使用嵌套concurret隊列(這是我使用的BlockingQueue),或者你認爲此方案更好的解決方案?基本上我不想讓第三方下降支配我的隊列。我需要一個聰明的方法來分隔這些隊列,可能會有成千上萬的隊列,因此爲每個隊列創建一個隊列可能是無效的。

+0

你有沒有考慮過使用像RxJava這樣的響應式框架? –

+0

你可以標記出現超時的那些,並且不要將它們放回隊列中以增加時間。比如,第一次你只在5秒後才把它們放回去,第二次它們會出來10,然後是20,40,一分鐘,兩分鐘等等。你明白了。爲了不讓系統空閒,如果隊列爲空,則可以忽略上述情況。 –

+0

我必須先研究RxJava,謝謝你的建議。我已經有超時映射,它的工作原理就好像X個消息是超時消息,而不是服務Y的新消息寫入數據庫而不是隊列,並且將被阻塞Z次。經過Z次後,如果它仍然被阻塞,則新消息被阻塞,直到Z + 1次等。但是另一方面,這使得該服務在DB中等待處理大量消息。從數據庫中檢索這些消息以進行處理時,比我的隊列再次被阻塞。 – cmlonder

回答

0

看來您正在使用單個BlockingQueue來保留所有第三方服務的消息。

相反,

  • 使用單獨阻塞隊列和隊列消費者對各第三方服務
  • 當您從用戶那裏得到的,而不是在隊列中添加它的消息,確認該第三方服務有本身並相應地將消息添加到第三方服務專用阻止隊列中。