狀態不屬于代碼

Web應用程序中的“狀態”是什么? 它就是要存儲的數據(無論目的地是什么—內存,數據庫,文件系統)。 應用程序本身不得在代碼中存儲任何狀態。 這意味著您的類應僅包含帶有無狀態對象的字段。 換句話說,在程序流程期間,您不應在服務,DAO或控制器中存儲任何內容。 對于您的服務層來說,這是一個完整的“必須”。 為什么?

您的應用程序需要可擴展。 這意味著它需要在集群中運行,而狀態是最難分配的。 如果您將狀態存儲的位置最小化,那么群集的復雜性也將最小化。 但是狀態應該存在,在這里擁有狀態就可以了:

  • 數據庫–無論是SQL,NoSQL還是搜索引擎,它都是存儲狀態的主要內容。 應該是支持集群的東西,或者是處理來自多個其他“代碼”服務器的請求的大型專用機器。 該代碼與數據庫進行通信,但是代碼本身不會為一個以上的客戶請求存儲任何內容。
  • 緩存-緩存相對容易分發(基本上是鍵值)。 有許多現成的解決方案,例如EhCache和memcached。 因此,您可以配置緩存并將結果存儲在內存中,而不是計算結果或根據每個請求從數據庫獲取結果。 但是,代碼仍然沒有存儲任何內容,它只是填充并查詢緩存。
  • HTTP會話–在Web組件(控制器,托管Bean,無論您如何稱呼)中。 它與緩存非常相似,盡管它具有不同的目的–允許識別同一用戶的后續操作(http本身是無狀態的)。 但是,由于您的代碼在多臺計算機上運行,??因此負載均衡器可能并不總是將后續請求發送到同一服務器。 因此,會話也應該在所有服務器之間復制。 幸運的是,大多數容器都內置了該選項,因此您只需添加一條配置行。 另外,您可以指示負載均衡器使用“粘性會話”(根據會話cookie來確定發送請求的服務器),但是它也會將一些狀態管理也移到負載均衡器。 無論您選擇哪種選項,都不要在會話中放入太多數據
  • 文件系統–存儲文件時,需要所有計算機都可以訪問它們。 這里有多個選項,包括SAN或使用Amazon S3之類的云存儲服務,可通過API訪問

所有這些都在代碼之外進行管理。 您的代碼僅通過API(會話API,緩存API,JDBC,S3 /文件系統API)使用它們。 如果代碼包含該狀態中的任何一個(作為對象的實例變量),則該應用程序將難以支持(您必須自己管理狀態),并且可伸縮性也會降低。 當然,在少數情況下,如果不將狀態存儲在代碼中就無法走開。 記錄這些,并確保它們不依賴于在集群中工作。

但是,如果將狀態存儲在執行業務邏輯的對象中,那會出錯嗎? 然后,您有兩個選擇:

  • 同步對字段的訪問–這會降低性能,因為所有發出請求的用戶都必須排隊等待服務來管理其字段;
  • 為每個HTTP請求創建類的新實例,并以某種方式管理實例。 管理這些實例是困難的部分。 人們可能傾向于選擇會話來執行此操作,這意味著會話會變得非常大且難以復制(跨多臺計算機共享大量數據的速度較慢,會話復制必須快速)。 更不用說不必要地增加了內存占用。

這是不做什么的瑣碎示例。 您應該將這些類型的值作為方法參數傳遞,而不是將其存儲在實例中:

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;}
}

因此,使您的所有代碼都為無狀態–這將確保至少某種程度的可伸縮性。

參考:我們的JCG合作伙伴 未將State 納入 代碼范圍 ? Bozho的技術博客中的 Bozhidar Bozhanov 。


翻譯自: https://www.javacodegeeks.com/2012/02/state-does-not-belong-in-code.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373320.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373320.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373320.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Xen安全架構sHype/ACM策略配置圖文教程

實驗要求 1. 熟悉Xen虛擬化平臺部署; 2. Xen sHype/ACM安全架構中的Simple TE和Chinese Wall策略及事實上現機制的分析與驗證。 第1章 Xen環境部署 1.1 版本號選擇 因為Ubuntu使用廣泛。軟件包易于下載。我們選擇Ubuntu系統進行Xen部署…

Python 辨異 —— __init__ 與 __new__

__init__ 更多的作用是初始化屬性,__new__ 進行的是創建對象,顯然 __new__ 要早于 __init__ 發生。 考慮一個繼承自 tuple 的類,顯然在 __init__ 無法對其成員進行修改; class Edge(tuple):def __new__(cls, e1, e2):return tuple…

java彈出虛擬鍵盤_JS實現電腦虛擬鍵盤的操作

本文實例為大家分享了JS實現電腦虛擬鍵盤的具體代碼,供大家參考,具體內容如下需求:1.當輸入框光標聚焦時,電腦虛擬鍵盤彈出2.在輸入框輸入內容時,鍵盤跟著變化具體實現代碼如下:Html部分:電腦鍵…

Apache Mahout:入門

最近,我有一個有趣的問題要解決:如何使用自動化對不同來源的文本進行分類? 前一段時間,我讀到一個有關該項目以及許多其他文本分析工作的項目– Apache Mahout 。 盡管它不是一個非常成熟的版本(當前版本為0.4 &#x…

Javascript中最常用的55個經典技巧(轉)

1. οncοntextmenu"window.event.returnValuefalse" 將徹底屏蔽鼠標右鍵 <table border οncοntextmenureturn(false)><td>no</table> 可用于Table 2. <body onselectstart"return false"> 取消選取、防止復制 3. οnpaste"…

向數組添加元素 java_java如何向數組里添加元素

向數組里添加一個元素怎么添加&#xff0c;這兒總結有三種方法&#xff1a;1、一般數組是不能添加元素的&#xff0c;因為他們在初始化時就已定好長度了&#xff0c;不能改變長度。但有個可以改變大小的數組為ArrayList&#xff0c;即可以定義一個ArrayList數組&#xff0c;然后…

JBoss Drools –入門

這篇文章是關于我如何掌握JBoss Drools的 。 其背后的原因是&#xff1a;SAP收購了我公司當前的規則引擎&#xff0c;而Drools是我們將尋找的另一種選擇&#xff0c;只要有人掌握了概念驗證的技能即可。 盡管似乎有大量的文檔&#xff0c;但是我總是會通過示例來發現它是有幫助…

android使用bintray發布aar到jcenter

前言 這兩天心血來潮突然想把自己的android library的aar放到jcenter里面&#xff0c;這樣一來自己便可以在任何時間任何地點通過internet得到自己的library的引用了&#xff0c;況且現在android studio已經默認使用jcenter的repositories作為依賴來源&#xff0c;以前的mavenc…

Java不是文明語言嗎?

幾周前&#xff0c;我有機會學習iOS編程。 我的老板認為我更像是“計算機科學家”&#xff0c;而不是開發人員&#xff0c;這意味著我可以將自己的知識應用于開發一兩個iPad應用程序–我要做的就是學習Objective-C&#xff0c; iOS SDK&#xff1a;到底有多難&#xff1f; 盡管…

PHP 進程詳解

PHP 進程詳解PHP 進程詳解 如下內容從《操作系統精髓與設計原理》中總結提煉得出&#xff0c;刪除了大部分對于理解進程有干擾的文字&#xff0c;對進程知識結構進行的梳理。幾乎所有內容為按照書本上摘抄下來的&#xff0c;我目前還總結提煉不出像作者這么深刻的見解。那么就先…

35. Search Insert Position

public class Solution {public int searchInsert(int[] nums, int target) {int lennums.length;int i0;for(;i<len;i){if(nums[i]>target)break;}return i;} } 轉載于:https://www.cnblogs.com/aguai1992/p/5351442.html

MySQL 后from多個表_MYSQL回顧(多表查詢相關)

前言簡單的數據我們可以直接從一個表中獲取&#xff0c;但在真實的項目中查詢符合條件的數據通常需要牽扯到多張表&#xff0c;這就不得不使用多表查詢。多表查詢分為多表連接查詢、符合條件鏈接查詢、子查詢。多表連接查詢包括內連接、外連接、全連接。符合條件連接查詢本質上…

玩! 框架+ Google Guice

在我目前正在工作的項目中&#xff0c;我們開始使用Google Guice。 對于那些不知道的人&#xff0c; Google Guice是一個依賴項注入框架。 依賴項注入背后的基本思想是提供一個它依賴的類&#xff0c;而不是使依賴類負責實例化它所依賴的對象。 Play具有用于整合Guice的模塊&am…

java都要caps標點_第 1 章 管理 Java CAPS 用戶

第 1 章 管理 Java CAPS 用戶在此處列出的主題提供了有關如何管理 Sun JavaTM Composite Application Platform Suite (Java CAPS) 中的用戶的信息。如果您有任何問題&#xff0c;請參見 http://goldstar.stc.com/ 中的 Java CAPS Web 站點。管理系統信息庫用戶此類別包含以下用…

基于OpenCV 的美顏相機推送直播流

程序流程&#xff1a; 1.圖像采集 先從opencv&#xff08;2.4.10版本&#xff09;采集回來攝像頭的圖像&#xff0c;是一幀一幀的 每一幀圖像是一個矩陣&#xff0c;opencv中的mat 數據結構。 2.人臉的美化 人臉美化&#xff0c;我們用的皮膚檢測&#xff0c;皮膚在顏色空間是特…

Linux驅動開發常用頭文件

頭文件目錄中總共有32個.h頭文件。其中主目錄下有13個&#xff0c;asm子目錄中有4個&#xff0c;linux子目錄中有10個&#xff0c;sys子目錄中有5個。這些頭文件各自的功能如下&#xff1a; 1、主目錄 <a.out.h>&#xff1a;a.out頭文件&#xff0c;定義了a.out執行文件格…

Spring線程池服務

線程池對于執行同步和異步過程非常重要。 本文介紹如何使用Spring開發和監視線程池服務。 創建線程池已通過兩種替代方法進行了說明。 二手技術 &#xff1a; JDK 1.6.0_21 Spring3.0.5 Maven的3.0.2 步驟1&#xff1a;建立已完成的專案 創建一個Maven項目&#xff0c;如下…

我的世界java村民繁殖_我的世界:Java19w08a更新,村民加強守衛,小狐貍背叛

雖然這句話很繞口&#xff0c;其實意思很簡單&#xff0c;那就是之前的隱身藥水沒有什么用&#xff0c;該被打還是被打。因為這個可是害慘了流浪商人&#xff0c;不過這次好了&#xff0c;流浪商人在喝了隱身藥水之后就能安全度過晚上了。NO.3 皮革馬鎧馬鎧是屬于馬的盔甲&…

歐萊雅眉筆banner個人設計

眉筆名稱&#xff1a;眉筆大師三頭塑形眉筆 &#xff0c;之所以沒用吧這個商品名稱放大&#xff0c;是我覺得它是一個名稱&#xff0c;而我把自己想的廣告詞“出彩只需一筆” 放大不僅能凸顯出這只筆的強大&#xff0c;還表示了一種有了我這支眉筆你會更出彩更漂亮&#xff0c…

使用帶有注釋和JQuery的Spring MVC 3的Ajax

與Ajax一起工作對我來說一直很有趣&#xff01; 是不是 &#xff1f; 我將使您輕松將Ajax與Spring MVC 3和JQuery結合使用。 這篇文章將向您說明如何在工業編碼的現實生活中使用Ajax。 和往常一樣&#xff0c;我們將在Spring MVC 3框架中以Ajax的實際示例為例&#xff0c;并將其…