2011-07-11 155 views
1

我有一個自動配置設備的Web應用程序。通信是通過使用HTTP的請求 - 響應方式實現的。我目前使用一個線程來管理配置過程,但通常建議應用程序線程不會在Web服務器中產生,所以我的問題是我應該使用基於事件的機制而不是線程?事件框架是用來維護應用程序狀態還是我以錯誤的方式考慮它們?線程或狀態機來管理應用程序狀態?

如果還有其他適用的設計模式,我很樂意聽到他們的消息。

非常感謝。

+1

狀態機是一種設計模式,而線程是實現的選擇。你介意多澄清一下你的問題嗎? – manku

+0

@Prashant設計模式不是實現選擇嗎?這正是我的問題,有沒有更好的方法來維護應用程序配置過程的狀態而不是使用額外的線程? – toc777

+0

我的意思是你可以在一個線程內部實現一個狀態機。我猜你所問的是如果你應該使用基於事件的模型與線程,但這只是一個猜測。對不起,沒有答案,但這個問題混淆了我。 – manku

回答

0

不知道如果我完全理解你的處境,在這裏,但我會在它有一個刺呢。

幾年前,我專門爲ADSL激活請求在我的國家大型電信運營商提供服務的應用程序。我們收到來自上游應用程序的「激活請求」,我們的工作是運行一系列配置步驟,這些步驟必須在不同的設備上完成,使用不同的協議,可能會失敗,可能不得不收回(以及當然,如果顧客退出,實施取消一個或多個步驟)。

我們選擇了一種基於「狀態機」的解決方案。每個請求都被表示爲一個標題記錄(在Oracle數據庫中),它總結了狀態(從「新」到「完成」,有各種中間步驟)和一系列子記錄,每個子記錄代表所需的N步驟之一完成配置。

我們已經爲每種類型的步驟安排了批次,基本上選擇相應操作類型的記錄,並試圖解決每個步驟(這允許我們根據協議對操作進行分組,例如snmp或telnet,還定義某種操作應該只在夜間或高峯時間以外運行

我們還安排了一個「元批」,它會定期檢查每個打開的「標題」記錄,檢查是否全部所連接的步驟,記錄均「已完成」的狀態,並相應地更新頭狀態。

它縮放不夠好,並且使我們能夠不同步驟以最小O模型麻煩。完全或部分「回滾」也很容易 - 因爲對於每一步我們都有一個具體的記錄顯示它是否已完成。

如果我必須在今天類似的問題的工作,我會傾向於一個狀態機爲基礎的方法。

+0

你所描述的正是我需要做的。但是,我只使用一種協議TR-069。我收到激活請求或「通知」,然後我需要執行配置。當你說你會贊成基於狀態機的方法;你在談論你實現的數據庫狀態機還是沒有專門將它的狀態存儲在數據庫中的狀態機? – toc777

+0

某種持久性(不論是「傳統」數據庫還是別的東西)肯定會很方便,你不覺得嗎?事實上,我最初的設計是用原型設計開始的,只是使用平面文件來保存狀態,當我們到達80k設備時,我們切換到了Oracle(我嘗試了所有我知道的技巧,但在移動到數據庫之前它已經變得冰冷地慢了。 ..)。無論如何,我會選擇一個狀態機,以便可以以最有效的方式處理各種操作,並且您可以輕鬆理解一步失敗時出了什麼問題。 –

+0

我將設備中的所有數據存儲在數據庫中,但我不存儲「狀態」特定數據。每次設備啓動與服務器的新會話時,都會運行配置過程。如果您要將狀態標頭存儲在數據庫中,這意味着可能會出現不一致情況,例如某人ssh訪問某個設備並且更改了某些內容,而服務器不知道該信息。你是如何確定狀態標題對設備是否仍然有效的? – toc777

0

我@Prashant同意,試圖比較線程的狀態機模式是蘋果和桔子。你目前如何配置線程的設備?跟蹤設備狀態的長期要求是什麼,設備的狀態會隨着時間而改變?

換句話說,是結構的單觸發的努力,其中它是convienent推下到一個單獨的線程?如果您關心CPU的轉換,特別是在相對較長的時間內,狀態機模式是幫助您建模不同狀態和可能轉換的工具。

您可以通過多種方式實現狀態機。例如,您可以使用事件觸發轉換,而某些靜態變量則會跟蹤當前狀態。你可以在一個單獨的線程中完成它,它有一個大的循環,其中包含一個大的switch語句。

我會問兩個問題:

1)你是如何模擬設備的狀態?

2)線程是否向您購買任何特定的配置設備?

+0

首先,創建一個配置線程,該線程包含配置過程,其中包含許多不同的命令以在設備上執行。每個命令都會通過傳遞給正在等待消息傳遞迴設備的servlet(設備啓動連接)發送給設備。當設備收到命令時,它總是以命令響應回覆。 servlet將此響應傳遞給配置線程,然後繼續進行配置。我使用線程的唯一原因是保持配置過程的位置和狀態。 – toc777

+0

在兩個線程之間傳遞消息的整體以及具有多個線程的所有複雜性使得我想簡化爲單個線程。 – toc777