日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

状态机复合状态 怎么写代码_状态不属于代码

發(fā)布時(shí)間:2023/12/3 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 状态机复合状态 怎么写代码_状态不属于代码 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

狀態(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。