簡體   English   中英

如何在Jboss集群中實現此隊列?

[英]How to implement this Queue in a Jboss cluster?

我的應用程序用作中間件,接收來自客戶端的請求,然后以某種邏輯對其進行轉換,並將轉換后的請求作為常規HTTP請求或Webservice soap請求發送給另一服務提供者。 該應用程序已部署在負載均衡器后面的兩個jboss服務器(群集中)中。

假設我的應用程序是A,服務提供商是S。

現在我被告知,每年S將下降幾(3-5)倍。 每個停機時間將持續約4個小時。 我可以得到有關停機時間的時間表。

在停機期間,A不應再轉換並向S發送請求,而應將接收到的請求放入隊列中。 S返回后,應處理隊列中的請求。

注意:

  1. 收到的請求A必須按照發出的確切順序進行處理。 處理請求意味着A將轉換后的請求發送到S,並獲得響應成功或錯誤。 通常這不會花費很多時間。

  2. 基於1,當A處理排隊的請求時,盡管S已經可用,但新的傳入請求應排隊。 直到隊列為空,A可以繼續直接向S發送請求。

  3. A每分鍾收到2-3個請求。

由於我們有兩個Jboss,因此我計划在數據庫中維護該隊列,在隊列中工作的線程並管理停機時間狀態。 但是,兩個jboss之間的同步總是讓我頭疼。

不久,我遇到的問題是:

  • 如何設置停機時間標志,以便兩個jboss進行請求請求,而不是發送請求。 (我認為解決方案是,在處理每個請求之前,請向數據庫查詢此標志。該標志是由線程設置的。這可能是較差的解決方案。)

  • S返回后,如何設計兩個jboss的出隊操作。 (似乎同時有一個jboss總是閑着……)

  • 如何通知兩個jboss,“現在隊列為空,不再排隊。”

邏輯有點復雜。 我希望我能清楚地解釋我的問題...

你們有什么想法嗎?


有關FIFO的更多說明。 如果沒有停機時間,A可以並行處理來自不同客戶端的那些請求。 因為客戶保證了這種“類似交易”的訂單。 例如。

client x :
-send http://..../createUser...
-received 'success' from A
-send http://../updateUser...
-received 'success' from A

如果createUser()失敗,則不會發送updateUser。

client y:
-send http://.. createCompany...

假設有另一個客戶端(y)與x.createUser同時發送請求createCompany。 這兩個請求可以由A並行處理。

在考慮停機時間和隊列之后:

-send http://..../createUser...
(downtime)
-received 'enqueue'
(S is back)
-send http://../updateUser...

現在,需要由A(而不是客戶端)確保“創建->更新”的順序。


提前致謝!

肯特

您是否從S收到確認已正確收到特定請求的任何確認? (如果沒有,則應考慮實施此方法,以使您的應用程序更強大,並最大程度地減少由於網絡問題,服務器崩潰等導致丟失請求的機會)

在發送請求后未及時收到ACK的情況下,可以通過使用增加超時的算法來增強這種確認機制。 即,如果在配置的超時間隔t內未收到ACK,則重新發送該請求。 下次會有更大的超時,例如2 * t,然后是4 * t等。只要未確認實際請求,就會將傳入的較新請求排隊。 成功發送實際請求后,將按FIFO順序處理排隊的請求。 如果隊列為空,則恢復正常處理。

該算法將自動處理S的計划內停機時間以及任何其他網絡故障等,其代價是更多的處理和網絡流量。 但是,每分鍾2-3個請求就不必擔心了(當然,除非單個請求很大)。

當然,甚至可以對其進行改進,以使默認超時可以按時間段進行配置。 即,在計划的4個小時的停機時間內,可以將默認超時設置為4個小時。 停機時間結束后,超時將重置為默認值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM