状态机复合状态 怎么写代码_状态不属于代码
狀態(tài)機(jī)復(fù)合狀態(tài) 怎么寫(xiě)代碼
Web應(yīng)用程序中的“狀態(tài)”是什么? 它是要存儲(chǔ)的數(shù)據(jù)(與目的地?zé)o關(guān)—內(nèi)存,數(shù)據(jù)庫(kù),文件系統(tǒng))。 應(yīng)用程序本身不得在代碼中存儲(chǔ)任何狀態(tài)。 這意味著您的類應(yīng)該只包含帶有無(wú)狀態(tài)對(duì)象的字段。 換句話說(shuō),在程序流程期間,您不應(yīng)在服務(wù),DAO或控制器中存儲(chǔ)任何內(nèi)容。 這是服務(wù)層的完整“必須”。 為什么?您的應(yīng)用程序需要可擴(kuò)展。 這意味著它需要在集群中運(yùn)行,而狀態(tài)是最難分配的。 如果您將狀態(tài)存儲(chǔ)的位置最小化,則可以將群集的復(fù)雜性最小化。 但是狀態(tài)應(yīng)該存在,在這里擁有狀態(tài)就可以了:
- 數(shù)據(jù)庫(kù)–無(wú)論是SQL,NoSQL還是搜索引擎,它都是存儲(chǔ)狀態(tài)的主要內(nèi)容。 它應(yīng)該是支持集群的東西,或者是處理來(lái)自多個(gè)其他“代碼”服務(wù)器的請(qǐng)求的大型專用計(jì)算機(jī)。 該代碼與數(shù)據(jù)庫(kù)進(jìn)行通信,但是代碼本身不會(huì)為一個(gè)以上的客戶請(qǐng)求存儲(chǔ)任何內(nèi)容。
- 緩存-緩存相對(duì)容易分發(fā)(基本上是鍵值)。 有許多現(xiàn)成的解決方案,例如EhCache和memcached。 因此,您可以配置緩存并將結(jié)果存儲(chǔ)在內(nèi)存中,而不是計(jì)算結(jié)果或根據(jù)每個(gè)請(qǐng)求從數(shù)據(jù)庫(kù)獲取結(jié)果。 但是,代碼仍然沒(méi)有存儲(chǔ)任何內(nèi)容,它只是填充并查詢緩存。
- HTTP會(huì)話–在Web組件(控制器,托管Bean,無(wú)論您叫什么)中。 它與緩存非常相似,但是具有不同的目的–允許識(shí)別同一用戶的后續(xù)操作(http本身是無(wú)狀態(tài)的)。 但是,由于您的代碼在多臺(tái)計(jì)算機(jī)上運(yùn)行,??因此負(fù)載均衡器可能并不總是將后續(xù)請(qǐng)求發(fā)送到同一服務(wù)器。 因此,會(huì)話也應(yīng)該在所有服務(wù)器之間復(fù)制。 幸運(yùn)的是,大多數(shù)容器都內(nèi)置了該選項(xiàng),因此您只需添加一條配置行。 或者,您可以指示負(fù)載均衡器使用“粘性會(huì)話”(根據(jù)會(huì)話cookie來(lái)確定發(fā)送請(qǐng)求的服務(wù)器),但是它也會(huì)將一些狀態(tài)管理也移至負(fù)載均衡器。 無(wú)論您選擇哪種選項(xiàng),都不要在會(huì)話中放入太多數(shù)據(jù)
- 文件系統(tǒng)–存儲(chǔ)文件時(shí),需要所有計(jì)算機(jī)都可以訪問(wèn)它們。 這里有多個(gè)選項(xiàng),包括SAN或使用Amazon S3之類的云存儲(chǔ)服務(wù),可通過(guò)API訪問(wèn)
所有這些都在代碼之外進(jìn)行管理。 您的代碼僅通過(guò)API(會(huì)話API,緩存API,JDBC,S3 /文件系統(tǒng)API)使用它們。 如果代碼包含該狀態(tài)中的任何一個(gè)(作為對(duì)象的實(shí)例變量),則該應(yīng)用程序?qū)㈦y以支持(您必須自己管理狀態(tài)),并且可伸縮性也會(huì)降低。 當(dāng)然,在少數(shù)情況下,如果不將狀態(tài)存儲(chǔ)在代碼中就行不通。 記錄這些,并確保它們不依賴于在集群中工作。
但是,如果將狀態(tài)存儲(chǔ)在執(zhí)行業(yè)務(wù)邏輯的對(duì)象中,那會(huì)出錯(cuò)嗎? 然后,您有兩個(gè)選擇:
- 同步對(duì)字段的訪問(wèn)–這會(huì)降低性能,因?yàn)樗邪l(fā)出請(qǐng)求的用戶都必須排隊(duì)等待服務(wù)來(lái)管理其字段;
- 為每個(gè)HTTP請(qǐng)求創(chuàng)建類的新實(shí)例,并以某種方式管理實(shí)例。 管理這些實(shí)例是困難的部分。 人們可能會(huì)傾向于選擇會(huì)話來(lái)執(zhí)行此操作,這意味著會(huì)話會(huì)變得非常大且難以復(fù)制(跨多臺(tái)計(jì)算機(jī)共享大量數(shù)據(jù)的速度較慢,會(huì)話復(fù)制必須快速)。 更不用說(shuō)不必要地增加了內(nèi)存占用。
這是不做什么的簡(jiǎn)單例子。 您應(yīng)該將這些類型的值作為方法參數(shù)傳遞,而不是將其存儲(chǔ)在實(shí)例中:
class OrderService {double orderPrice;void processOrder(OrderDto order) {for (Entry entry : order.getEntries() {orderPrice += entry.getPrice();}boolean discounts = hasDiscounts(order);}boolean hasDiscounts(OrderDto order) {return order.getEntries().length > 5 && orderPrice > 200;} }因此,使您的所有代碼都為無(wú)狀態(tài)–這將確保至少某種程度的可伸縮性。
參考:我們的JCG合作伙伴 未將State 列入 守則 ? Bozho的技術(shù)博客中的 Bozhidar Bozhanov 。
翻譯自: https://www.javacodegeeks.com/2012/02/state-does-not-belong-in-code.html
狀態(tài)機(jī)復(fù)合狀態(tài) 怎么寫(xiě)代碼
總結(jié)
以上是生活随笔為你收集整理的状态机复合状态 怎么写代码_状态不属于代码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 野营用英语怎么说 野营的英语是什么
- 下一篇: apache mahout_Apache