偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

小白科普:“無(wú)狀態(tài)”那點(diǎn)事兒

開發(fā) 開發(fā)工具
垂直擴(kuò)展就是通過增加CPU,內(nèi)存,硬盤等方式來(lái)提高單個(gè)服務(wù)器的處理能力。由于單臺(tái)機(jī)器總是有上限的,所以想應(yīng)對(duì)海量用戶的訪問,提高可用性,還得靠水平擴(kuò)展?,F(xiàn)在你體會(huì)到無(wú)狀態(tài)的好處了吧?

軟件大師正在閉目修煉, 最小的一名弟子慢慢走了進(jìn)來(lái)。

弟子:大師,弟子有一事不明,甚是煩惱。

大師:說來(lái)聽聽,讓為師給你排解一下。

弟子:我經(jīng)常聽?zhēng)熜謧儬?zhēng)論‘無(wú)狀態(tài)’, 說‘無(wú)狀態(tài)’在軟件編程中是好事情, 可是到底什么是狀態(tài)? 什么是無(wú)狀態(tài)?

大師睜開眼來(lái),寫下一行字:  y=f(x),然后又閉上了眼睛。

弟子:(奇怪地問道)這不就是一個(gè)函數(shù)嗎?我初中就學(xué)過, 給定一個(gè)x,函數(shù)經(jīng)過計(jì)算(比如求平方)就能得到一個(gè)y。

大師:沒錯(cuò),這就是一個(gè)純函數(shù),對(duì)于相同的輸入,總是得到相同的輸出,不依賴于外界的狀態(tài)。

弟子:這也沒什么??!

大師:你想想,要是有多個(gè)線程在一個(gè)CPU上并發(fā)調(diào)用這個(gè)函數(shù),會(huì)不會(huì)有問題?

弟子:不會(huì)。

大師:如果是有多個(gè)線程在多個(gè)CPU上并行執(zhí)行這個(gè)函數(shù),會(huì)不會(huì)有問題?

弟子:不會(huì)。

大師:為什么?

弟子:因?yàn)槊看握{(diào)用都不會(huì)在這個(gè)函數(shù)中保留數(shù)據(jù), 調(diào)用完了就完了,每一次調(diào)用都是嶄新的調(diào)用,并且***次和***百次之間沒有任何關(guān)系。

大師:因?yàn)槟莻€(gè)函數(shù)不保存狀態(tài),所以無(wú)論是并發(fā)還是并行,都沒有問題。

弟子:嗯,明白。

大師:你再想想你常用的HTTP,每次訪問一個(gè)靜態(tài)HTML頁(yè)面的時(shí)候,對(duì)于服務(wù)器來(lái)講,是不是就相當(dāng)于調(diào)用了一個(gè)函數(shù),函數(shù)輸入:一個(gè)URL路徑, 函數(shù)輸出:HTML頁(yè)面。

弟子:那這么說來(lái),這個(gè)服務(wù)器也不會(huì)記錄每次請(qǐng)求的是誰(shuí),只要執(zhí)行這個(gè)'函數(shù)調(diào)用'就可以了。

大師:你說說,這樣的HTTP協(xié)議有什么好處?

弟子:由于沒有狀態(tài),如果一個(gè)服務(wù)器訪問量過大,我可以輕松地添加新的服務(wù)器來(lái)處理請(qǐng)求。

大師:“孺子可教也,這就是所謂水平擴(kuò)展(scale-out)。

弟子:水平擴(kuò)展? 難道還有垂直擴(kuò)展(scale-up)?

大師:對(duì),垂直擴(kuò)展就是通過增加CPU,內(nèi)存,硬盤等方式來(lái)提高單個(gè)服務(wù)器的處理能力。由于單臺(tái)機(jī)器總是有上限的,所以想應(yīng)對(duì)海量用戶的訪問,提高可用性,還得靠水平擴(kuò)展?,F(xiàn)在你體會(huì)到無(wú)狀態(tài)的好處了吧?

弟子:明白了,大師,在服務(wù)器端無(wú)狀態(tài)確實(shí)是個(gè)美好的世界, 可是現(xiàn)實(shí)很殘酷,沒有狀態(tài)不行啊,一個(gè)人登錄了,我們得記住他是誰(shuí)吧,他往購(gòu)物車?yán)锛尤肷唐罚覀円驳糜浵聛?lái)吧。

大師:那你們?cè)趺从洶。?/p>

弟子:肯定用Session來(lái)保存狀態(tài)??!

大師:服務(wù)器一旦引入狀態(tài),就沒法輕松地水平擴(kuò)展了吧!

弟子:是的,該怎么辦?

大師:這里邊辦法很多,例如讓'狀態(tài)'在各個(gè)服務(wù)器之間進(jìn)行復(fù)制,但最常用的是把狀態(tài)轉(zhuǎn)移存儲(chǔ)到另外一個(gè)地方,盡量服務(wù)器恢復(fù)到無(wú)狀態(tài)的'y=f(x)'。

(注:實(shí)際情況下,圖中服務(wù)器之前還有負(fù)責(zé)負(fù)載均衡的服務(wù)器)

弟子:奧,這樣一來(lái),又可以水平擴(kuò)展了! 對(duì)了大師,我剛才聽到師兄們提到‘無(wú)狀態(tài)對(duì)象’,他們說就是一個(gè)對(duì)象沒有實(shí)例變量,或者實(shí)例變量是final的。這么說對(duì)吧?

大師:嗯,這種情況下,說‘無(wú)狀態(tài)對(duì)象’ 有點(diǎn)不準(zhǔn)確了,更準(zhǔn)確的詞是‘不可變對(duì)象’(Immutable Object),比如:

  1. public final class Complex{ 
  2.     private final int a; 
  3.     private final int b; 
  4.     public Complex(int a, int b){ 
  5.         this.a = a; 
  6.         this.b = b; 
  7.     } 
  8.     public Complex add(Complex other){ 
  9.         return new Complex(a + other.a, b+other.b); 
  10.     } 

弟子:奧,這個(gè)類的對(duì)象一旦創(chuàng)建,就不能再改變了, 我看到了那個(gè)add方法,它不是對(duì)現(xiàn)有對(duì)象的修改,而是返回了一個(gè)全新的對(duì)象。

大師:這樣的話當(dāng)多個(gè)線程調(diào)用add對(duì)象的時(shí)候,都是線程安全的。 我這里有一副圖畫,是LISP大師送給我的,形象地展示了可變 vs 不可變, 你拿去吧:

弟子:那代價(jià)也有點(diǎn)大啊,每次都創(chuàng)建新對(duì)象!我們用Spring,其中的Controller, Service被大量地并發(fā)調(diào)用,肯定不能用這種方法了。

大師:是的,你們用的Controller, Service 默認(rèn)都是單例,運(yùn)行期只有一個(gè)實(shí)例,他們的方法應(yīng)該是y=f(x)這樣的無(wú)狀態(tài)方法,輕易不要在里邊放置共享的實(shí)例變量,要不然多線程并發(fā)操作就可能出問題了。

弟子:可是我們的Controller 一般都要放個(gè)Service的實(shí)例變量啊 ,比如這個(gè)LoginController中的userService, 多個(gè)線程同時(shí)訪問這個(gè)共享的userService,豈不就出問題了?

  1. @Controller 
  2. public class LoginController { 
  3.     @Autowired 
  4.     private UserService userService; 
  5.     ......對(duì)userService的使用略...... 

大師:你誤入歧途了,把無(wú)狀態(tài)和無(wú)共享的實(shí)例變量畫了等號(hào),你想想,如果LoginController調(diào)用的userService 的方法也是類似 y=f(x), 會(huì)有線程安全問題嗎?

弟子:嗯...... 好像是沒有問題。 無(wú)論是Controller還是Service都是純函數(shù)調(diào)用而已。 但是如果確實(shí)需要共享的變量該怎么辦?

大師:很簡(jiǎn)單,使用ThreadLocal,把這個(gè)變量存到各個(gè)線程當(dāng)中,讓他們互不干擾,就線程安全了。

【本文為51CTO專欄作者“劉欣”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)通過作者微信公眾號(hào)coderising獲取授權(quán)】

戳這里,看該作者更多好文

責(zé)任編輯:武曉燕 來(lái)源: 51CTO專欄
相關(guān)推薦

2022-05-26 15:30:21

Spring AOP框架

2015-12-08 14:49:13

SDN軟件定義網(wǎng)絡(luò)

2017-09-12 08:03:29

數(shù)據(jù)庫(kù)MySQL主庫(kù)

2011-12-26 11:13:24

密碼

2020-01-03 07:57:39

UDPTCP網(wǎng)絡(luò)協(xié)議

2013-12-26 13:35:39

2013-09-17 10:37:03

AOPAOP教程理解AOP

2022-05-26 09:03:39

AOP編程

2012-03-12 21:23:47

Windows pho

2021-04-13 09:12:45

網(wǎng)絡(luò)設(shè)備無(wú)線路由器交換機(jī)

2023-12-04 11:02:53

C++空類

2017-04-19 08:35:34

2013-12-04 09:46:56

Hyper-VNUMA

2018-05-17 09:46:40

apachenginx阻塞

2012-04-17 11:21:50

Java

2017-09-11 15:17:01

分布式集群負(fù)載均衡

2024-11-22 10:45:20

2025-03-12 03:00:00

2017-09-19 15:22:44

2018-12-19 10:52:35

嵌入式CPU微處理器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)