HTTP冪等性

一趟紊、前言

  • 基于HTTP協(xié)議的Web API是時下最為流行的一種分布式服務提供方式。
  • 互聯(lián)網(wǎng)應用架構設計表現(xiàn)出了從傳統(tǒng)的PHP碰酝、JSP霎匈、ASP.NET等服務器端動態(tài)網(wǎng)頁向Restful API + JSON過渡的趨勢,前后端分離越來越普遍送爸。

二铛嘱、冪等性定義

本文所要探討的正是HTTP協(xié)議涉及到的一種重要性質(zhì):冪等性(Idempotence)。在HTTP/1.1規(guī)范中冪等性的定義是:

Methods can also have the property of "idempotence" in that (aside from error or expiration issues) the side-effects of N > 0 identical requests is the same as for a single request.

從定義上看袭厂,HTTP方法的冪等性是指一次和多次請求某一個資源應該具有同樣的副作用墨吓。冪等性屬于語義范疇,正如編譯器只能幫助檢查語法錯誤一樣纹磺,HTTP規(guī)范也沒有辦法通過消息格式等語法手段來定義它帖烘,這可能是它不太受到重視的原因之一。但實際上橄杨,冪等性是分布式系統(tǒng)設計中十分重要的概念秘症,而HTTP的分布式本質(zhì)也決定了它在HTTP中具有重要地位。

三讥珍、GET历极、DELETE、PUT衷佃、POST語義和冪等性趟卸。

  • HTTP GET方法用于獲取資源,不應有副作用,所以是冪等的锄列。比如:GET http://www.bank.com/account/123456图云,不會改變資源的狀態(tài),不論調(diào)用一次還是N次都沒有副作用邻邮。請注意竣况,這里強調(diào)的是一次和N次具有相同的副作用,而不是每次GET的結果相同筒严。GET http://www.news.com/latest-news這個HTTP請求可能會每次得到不同的結果丹泉,但它本身并沒有產(chǎn)生任何副作用,因而是滿足冪等性的鸭蛙。

  • HTTP DELETE方法用于刪除資源摹恨,有副作用,但它應該滿足冪等性娶视。比如:DELETE http://www.forum.com/article/4231晒哄,調(diào)用一次和N次對系統(tǒng)產(chǎn)生的副作用是相同的,即刪掉id為4231的帖子肪获;因此寝凌,調(diào)用者可以多次調(diào)用或刷新頁面而不必擔心引起錯誤。

  • 比較容易混淆的是HTTP POST和PUT孝赫。POST和PUT的區(qū)別容易被簡單地誤認為“POST表示創(chuàng)建資源较木,PUT表示更新資源”;而實際上寒锚,二者均可用于創(chuàng)建資源劫映,更為本質(zhì)的差別是在冪等性方面。在HTTP規(guī)范中對POST和PUT是這樣定義的:

The POST method is used to request that the origin server accept the entity enclosed in the request as a new subordinate of the resource identified by the Request-URI in the Request-Line ...... If a resource has been created on the origin server, the response SHOULD be 201 (Created) and contain an entity which describes the status of the request and refers to the new resource, and a Location header.
The PUT method requests that the enclosed entity be stored under the supplied Request-URI. If the Request-URI refers to an already existing resource, the enclosed entity SHOULD be considered as a modified version of the one residing on the origin server. If the Request-URI does not point to an existing resource, and that URI is capable of being defined as a new resource by the requesting user agent, the origin server can create the resource with that URI.

  • POST所對應的URI并非創(chuàng)建的資源本身刹前,而是資源的接收者泳赋。比如:POST http://www.forum.com/articles的語義是在http://www.forum.com/articles下創(chuàng)建一篇帖子,HTTP響應中應包含帖子的創(chuàng)建狀態(tài)以及帖子的URI喇喉。兩次相同的POST請求會在服務器端創(chuàng)建兩份資源祖今,它們具有不同的URI;所以拣技,POST方法不具備冪等性千诬。而PUT所對應的URI是要創(chuàng)建或更新的資源本身。比如:PUT http://www.forum/articles/4231的語義是創(chuàng)建或更新ID為4231的帖子膏斤。對同一URI進行多次PUT的副作用和一次PUT是相同的徐绑;因此,PUT方法具有冪等性莫辨。

四傲茄、總結

  • 一個冪等的操作典型如:

把編號為5的記錄的A字段設置為0這種操作不管執(zhí)行多少次都是冪等的毅访。
一個非冪等的操作典型如:把編號為5的記錄的A字段增加1這種操作顯然就不是冪等的。
要做到冪等性盘榨,從接口設計上來說不設計任何非冪等的操作即可喻粹。
譬如說需求是:
當用戶點擊贊同時,將答案的贊同數(shù)量+1草巡。
改為:當用戶點擊贊同時守呜,確保答案贊同表中存在一條記錄(插入之前檢查這條記錄是否已經(jīng)存在,這在非冪等性的POST請求中山憨,表現(xiàn)的尤為重要)查乒,用戶、答案郁竟。贊同數(shù)量由答案贊同表統(tǒng)計出來侣颂。

  • 分布式高并發(fā)并不意味著每個request都處理的很快,也不意味著機器之間就不共享數(shù)據(jù)了枪孩。其次,你可以把你所有帶有副作用的task都給一個guid藻肄,最后寫進數(shù)據(jù)庫之前查一下這個guid是否已經(jīng)被執(zhí)行過了蔑舞。

  • 冪等性是數(shù)學中的一個概念,表達的是N次變換與1次變換的結果相同嘹屯。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末攻询,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子州弟,更是在濱河造成了極大的恐慌钧栖,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件婆翔,死亡現(xiàn)場離奇詭異拯杠,居然都是意外死亡,警方通過查閱死者的電腦和手機啃奴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門潭陪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人最蕾,你說我怎么就攤上這事依溯。” “怎么了瘟则?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵黎炉,是天一觀的道長。 經(jīng)常有香客問我醋拧,道長慷嗜,這世上最難降的妖魔是什么淀弹? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮洪添,結果婚禮上垦页,老公的妹妹穿的比我還像新娘。我一直安慰自己干奢,他們只是感情好痊焊,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著忿峻,像睡著了一般薄啥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上逛尚,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天垄惧,我揣著相機與錄音,去河邊找鬼绰寞。 笑死到逊,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的滤钱。 我是一名探鬼主播觉壶,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼件缸!你這毒婦竟也來了铜靶?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤他炊,失蹤者是張志新(化名)和其女友劉穎争剿,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體痊末,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡蚕苇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了凿叠。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捆蜀。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖幔嫂,靈堂內(nèi)的尸體忽然破棺而出辆它,到底是詐尸還是另有隱情,我是刑警寧澤履恩,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布锰茉,位于F島的核電站,受9級特大地震影響切心,放射性物質(zhì)發(fā)生泄漏飒筑。R本人自食惡果不足惜片吊,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望协屡。 院中可真熱鬧俏脊,春花似錦、人聲如沸肤晓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽补憾。三九已至漫萄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間盈匾,已是汗流浹背腾务。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留削饵,地道東北人岩瘦。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像窿撬,于是被迫代替她去往敵國和親担钮。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 轉載自 Programming.log - a place to keep my thoughts on prog...
    廚子閱讀 411評論 0 4
  • 理解HTTP冪等性 基于HTTP協(xié)議的Web API是時下最為流行的一種分布式服務提供方式尤仍。無論是在大型互聯(lián)網(wǎng)應用...
    阿燈_supwinr閱讀 445評論 0 0
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)狭姨,斷路器宰啦,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • 前言 HTTP Method的歷史: HTTP 0.9 這個版本只有GET方法 HTTP 1.0 這個版本有G...
    老馬的春天閱讀 25,956評論 3 9
  • 村上春樹曾說: 你要記得那些黑暗中默默抱緊你的人师抄,逗你笑的人漓柑,陪你徹夜聊天的人,坐車來看你的人叨吮,陪你哭過的人辆布,在醫(yī)...
    太洋閱讀 284評論 2 5