簡體   English   中英

申請狀態在哪里?

[英]Where to put application state?

在代碼中我最好把對象創建(有狀態對象)和不在哪里? 在什么層?

例如,我曾經在Hibernate DAO類中放置了一個對象引用,並且我被告知這是不正確的,因為DAO類不應該具有狀態。 州應該在'服務層'內。

有人告訴我,我不應該在重復的方法調用(如UpdateCart())上創建新對象。 創建對象代價高昂,不應該隨處可見代碼。 它應該只在初始化類型方法中。 例如,如果電子商務應用程序需要購物車,請將其放入會話中。 如果需要一些通用主對象,請將其放入初始化代碼中。 在那里創建它,讓應用程序的其余部分稍后訪問它的實例。 每次調用時都不要創建此實例。

我對這整個設計原則感到困惑。 我聽到的最奇怪的事情是“應用程序不應該有狀態。 狀態應保存在數據庫所在的數據層中。 真? 我對這些設計概念很陌生,我不知道在哪里可以看到它以獲得更多的教育。 GoF的? 設計模式書籍? 目標是創建定性代碼(即在業務中使用)。

謝謝

什么是良好的做法可以根據項目的類型而有所不同。

對於大多數項目來說,創建對象對CPU來說並不昂貴。 不總是很好地表達的成本是設計的成本。 您的應用程序似乎有一種設計方法,其中所有狀態和對象都需要以受控和集中的方式進行管理。 通常這樣做是為了提高可維護性並簡化設計。 我不認為你應該只知道設計是什么,除非它已經非常清楚地告訴你。

我懷疑團隊的其他人習慣於以某種特定方式工作,並且認為他們不應該記錄或教你這種方法,只要告訴你什么時候“錯誤”。 這不是高效的恕我直言,但你必須處理你所擁有的情況,並在涉及狀態或數據結構的位置時問他們問題。

'應用程序不應該有狀態。 狀態應保存在數據庫所在的數據層中

有些設計是常態,恰當地稱為“無狀態架構”。 每個建築是否應該是無國籍的當然是值得懷疑的,而且這個術語也許也會引發爭論。

事實上,大多數“無國籍”的申請都有國家,但正如上面的規則所述(沒有雙關語),這種狀態被保存在一個全球的地方; 數據庫。 正如彼得所提到的,其原因可能是可維護性和簡化性,但也經常聽說這是為了scalability 如果沒有狀態出現在數據庫中的任何地方,那么可以很容易地添加額外的前端服務器,處理服務器以及你有什么。

雖然這確實有一些優點,但我認為我們必須區分臨時狀態和權威狀態。

臨時狀態可以是您在訂購過程中所處的位置以及您已輸入的詳細信息。 在Java EE中,您可以將其保留在例如@ConversationScoped bean或@Stateful beans中。 因此,這表示您保留在Web層內。 業務層。

這樣做的好處是易於使用,性能和卸載單個中央數據庫。 當然,您也可以將臨時狀態存儲在中央數據庫中,但是您可能希望將其與常規的非臨時數據保持一致,這意味着需要一些額外的編程復雜性。 從Web層檢索數據通常要快得多,並且它會從數據庫中刪除一些負載。

在許多系統中,只有一個主數據庫(一個接受寫入的數據庫),因此這個單一數據庫可能成為該設置中的一個巨大瓶頸。

根據您的實際架構和設置, 不在數據庫中保留臨時狀態 - 可能 - 實際上提高了您的擴展能力。

缺點是您確實需要您的客戶端堅持當前保留臨時狀態的單個服務器。 這通常稱為“粘性會話”。 如果此客戶端與之交互的一台服務器出現故障或需要重新啟動或其他任何服務器,則客戶端將丟失此臨時數據。 有一些方案,比如將狀態復制到集群中的所有節點或附近的節點(伙伴復制),但這會使事情再次變得復雜並且可能使網絡過載(如果所有節點不斷地相互復制)。

權威狀態意味着它代表作為唯一信息來源的共享數據。 這種狀態是我們幾乎總是喜歡在中心位置的狀態,但有時您會看到它存儲在例如Web節點中。

例如,假設我們有一個最近價格列表,而不是將其持久保存到中心位置,我們將其保存在輸入它的Web節點上。 現在有一個“唯一的”Web節點的概念,它具有此信息,其他服務器可能開始假設只有這個“唯一的”Web節點。 現在添加額外的節點是不可能的,因為它打破了這個假設。

暫無
暫無

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

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