分布式事務(wù)效览、兩階段提交協(xié)議、三階提交協(xié)議

【轉(zhuǎn)自】:http://blog.jobbole.com/95632/

隨著大型網(wǎng)站的各種高并發(fā)訪問荡短、海量數(shù)據(jù)處理等場景越來越多,如何實(shí)現(xiàn)網(wǎng)站的高可用哆键、易伸縮掘托、可擴(kuò)展、安全等目標(biāo)就顯得越來越重要籍嘹。

為了解決這樣一系列問題闪盔,大型網(wǎng)站的架構(gòu)也在不斷發(fā)展弯院。提高大型網(wǎng)站的高可用架構(gòu),不得不提的就是分布式泪掀。在《分布式系統(tǒng)的一致性探討》一文中主要介紹了分布式系統(tǒng)中存在的一致性問題听绳。本文將簡單介紹如何有效的解決分布式的一致性問題,其中包括什么是分布式事務(wù)异赫,二階段提交三階段提交椅挣。

分布式一致性回顧

在分布式系統(tǒng)中,為了保證數(shù)據(jù)的高可用塔拳,通常鼠证,我們會將數(shù)據(jù)保留多個副本(replica),這些副本會放置在不同的物理的機(jī)器上靠抑。為了對用戶提供正確的增\刪\改\差等語義量九,我們需要保證這些放置在不同物理機(jī)器上的副本是一致的。

為了解決這種分布式一致性問題颂碧,前人在性能和數(shù)據(jù)一致性的反反復(fù)復(fù)權(quán)衡過程中總結(jié)了許多典型的協(xié)議和算法荠列。其中比較著名的有二階提交協(xié)議(Two Phase Commitment Protocol)、三階提交協(xié)議(Two Phase Commitment Protocol)和Paxos算法载城。

分布式事務(wù)

分布式事務(wù)是指會涉及到操作多個數(shù)據(jù)庫的事務(wù)肌似。其實(shí)就是將對同一庫事務(wù)的概念擴(kuò)大到了對多個庫的事務(wù)。目的是為了保證分布式系統(tǒng)中的數(shù)據(jù)一致性个曙。分布式事務(wù)處理的關(guān)鍵是必須有一種方法可以知道事務(wù)在任何地方所做的所有動作锈嫩,提交或回滾事務(wù)的決定必須產(chǎn)生統(tǒng)一的結(jié)果(全部提交或全部回滾)

在分布式系統(tǒng)中,各個節(jié)點(diǎn)之間在物理上相互獨(dú)立垦搬,通過網(wǎng)絡(luò)進(jìn)行溝通和協(xié)調(diào)呼寸。由于存在事務(wù)機(jī)制,可以保證每個獨(dú)立節(jié)點(diǎn)上的數(shù)據(jù)操作可以滿足ACID猴贰。但是对雪,相互獨(dú)立的節(jié)點(diǎn)之間無法準(zhǔn)確的知道其他節(jié)點(diǎn)中的事務(wù)執(zhí)行情況。所以從理論上講米绕,兩臺機(jī)器理論上無法達(dá)到一致的狀態(tài)瑟捣。如果想讓分布式部署的多臺機(jī)器中的數(shù)據(jù)保持一致性,那么就要保證在所有節(jié)點(diǎn)的數(shù)據(jù)寫操作栅干,要不全部都執(zhí)行迈套,要么全部的都不執(zhí)行。但是碱鳞,一臺機(jī)器在執(zhí)行本地事務(wù)的時候無法知道其他機(jī)器中的本地事務(wù)的執(zhí)行結(jié)果桑李。所以他也就不知道本次事務(wù)到底應(yīng)該commit還是 roolback。所以,常規(guī)的解決辦法就是引入一個“協(xié)調(diào)者”的組件來統(tǒng)一調(diào)度所有分布式節(jié)點(diǎn)的執(zhí)行贵白。

XA規(guī)范

X/Open 組織(即現(xiàn)在的 Open Group )定義了分布式事務(wù)處理模型率拒。 X/Open DTP 模型( 1994 )包括應(yīng)用程序( AP )、事務(wù)管理器( TM )禁荒、資源管理器( RM )猬膨、通信資源管理器( CRM )四部分。一般呛伴,常見的事務(wù)管理器( TM )是交易中間件勃痴,常見的資源管理器( RM )是數(shù)據(jù)庫,常見的通信資源管理器( CRM )是消息中間件磷蜀。 通常把一個數(shù)據(jù)庫內(nèi)部的事務(wù)處理召耘,如對多個表的操作,作為本地事務(wù)看待褐隆。數(shù)據(jù)庫的事務(wù)處理對象是本地事務(wù)污它,而分布式事務(wù)處理的對象是全局事務(wù)。 所謂全局事務(wù)庶弃,是指分布式事務(wù)處理環(huán)境中衫贬,多個數(shù)據(jù)庫可能需要共同完成一個工作,這個工作即是一個全局事務(wù)歇攻,例如固惯,一個事務(wù)中可能更新幾個不同的數(shù)據(jù)庫。對數(shù)據(jù)庫的操作發(fā)生在系統(tǒng)的各處但必須全部被提交或回滾缴守。此時一個數(shù)據(jù)庫對自己內(nèi)部所做操作的提交不僅依賴本身操作是否成功葬毫,還要依賴與全局事務(wù)相關(guān)的其它數(shù)據(jù)庫的操作是否成功,如果任一數(shù)據(jù)庫的任一操作失敗屡穗,則參與此事務(wù)的所有數(shù)據(jù)庫所做的所有操作都必須回滾贴捡。 一般情況下,某一數(shù)據(jù)庫無法知道其它數(shù)據(jù)庫在做什么村砂,因此烂斋,在一個 DTP 環(huán)境中,交易中間件是必需的础废,由它通知和協(xié)調(diào)相關(guān)數(shù)據(jù)庫的提交或回滾汛骂。而一個數(shù)據(jù)庫只將其自己所做的操作(可恢復(fù))影射到全局事務(wù)中。

XA 就是 X/Open DTP 定義的交易中間件與數(shù)據(jù)庫之間的接口規(guī)范(即接口函數(shù))评腺,交易中間件用它來通知數(shù)據(jù)庫事務(wù)的開始帘瞭、結(jié)束以及提交、回滾等蒿讥。 XA 接口函數(shù)由數(shù)據(jù)庫廠商提供图张。

二階提交協(xié)議三階提交協(xié)議就是根據(jù)這一思想衍生出來的锋拖。可以說二階段提交其實(shí)就是實(shí)現(xiàn)XA分布式事務(wù)的關(guān)鍵(確切地說:兩階段提交主要保證了分布式事務(wù)的原子性:即所有結(jié)點(diǎn)要么全做要么全不做)

2PC

二階段提交(Two-phaseCommit)是指祸轮,在計(jì)算機(jī)網(wǎng)絡(luò)以及數(shù)據(jù)庫領(lǐng)域內(nèi),為了使基于分布式系統(tǒng)架構(gòu)下的所有節(jié)點(diǎn)在進(jìn)行事務(wù)提交時保持一致性而設(shè)計(jì)的一種算法(Algorithm)侥钳。通常适袜,二階段提交也被稱為是一種協(xié)議(Protocol))。在分布式系統(tǒng)中舷夺,每個節(jié)點(diǎn)雖然可以知曉自己的操作時成功或者失敗苦酱,卻無法知道其他節(jié)點(diǎn)的操作的成功或失敗。當(dāng)一個事務(wù)跨越多個節(jié)點(diǎn)時给猾,為了保持事務(wù)的ACID特性疫萤,需要引入一個作為協(xié)調(diào)者的組件來統(tǒng)一掌控所有節(jié)點(diǎn)(稱作參與者)的操作結(jié)果并最終指示這些節(jié)點(diǎn)是否要把操作結(jié)果進(jìn)行真正的提交(比如將更新后的數(shù)據(jù)寫入磁盤等等)。因此敢伸,二階段提交的算法思路可以概括為:參與者將操作成敗通知協(xié)調(diào)者扯饶,再由協(xié)調(diào)者根據(jù)所有參與者的反饋情報(bào)決定各參與者是否要提交操作還是中止操作。

所謂的兩個階段是指:第一階段:準(zhǔn)備階段(投票階段)和第二階段:提交階段(執(zhí)行階段)池颈。

準(zhǔn)備階段

事務(wù)協(xié)調(diào)者(事務(wù)管理器)給每個參與者(資源管理器)發(fā)送Prepare消息尾序,每個參與者要么直接返回失敗(如權(quán)限驗(yàn)證失敗),要么在本地執(zhí)行事務(wù)躯砰,寫本地的redo和undo日志每币,但不提交,到達(dá)一種“萬事俱備琢歇,只欠東風(fēng)”的狀態(tài)兰怠。

可以進(jìn)一步將準(zhǔn)備階段分為以下三個步驟:

1)協(xié)調(diào)者節(jié)點(diǎn)向所有參與者節(jié)點(diǎn)詢問是否可以執(zhí)行提交操作(vote),并開始等待各參與者節(jié)點(diǎn)的響應(yīng)李茫。

2)參與者節(jié)點(diǎn)執(zhí)行詢問發(fā)起為止的所有事務(wù)操作揭保,并將Undo信息和Redo信息寫入日志。(注意:若成功這里其實(shí)每個參與者已經(jīng)執(zhí)行了事務(wù)操作)

3)各參與者節(jié)點(diǎn)響應(yīng)協(xié)調(diào)者節(jié)點(diǎn)發(fā)起的詢問涌矢。如果參與者節(jié)點(diǎn)的事務(wù)操作實(shí)際執(zhí)行成功掖举,則它返回一個”同意”消息;如果參與者節(jié)點(diǎn)的事務(wù)操作實(shí)際執(zhí)行失敗娜庇,則它返回一個”中止”消息塔次。

提交階段

如果協(xié)調(diào)者收到了參與者的失敗消息或者超時,直接給每個參與者發(fā)送回滾(Rollback)消息名秀;否則励负,發(fā)送提交(Commit)消息;參與者根據(jù)協(xié)調(diào)者的指令執(zhí)行提交或者回滾操作匕得,釋放所有事務(wù)處理過程中使用的鎖資源继榆。(注意:必須在最后階段釋放鎖資源)

接下來分兩種情況分別討論提交階段的過程巾表。

當(dāng)協(xié)調(diào)者節(jié)點(diǎn)從所有參與者節(jié)點(diǎn)獲得的相應(yīng)消息都為”同意”時:

1)協(xié)調(diào)者節(jié)點(diǎn)向所有參與者節(jié)點(diǎn)發(fā)出”正式提交(commit)”的請求。

2)參與者節(jié)點(diǎn)正式完成操作略吨,并釋放在整個事務(wù)期間內(nèi)占用的資源集币。

3)參與者節(jié)點(diǎn)向協(xié)調(diào)者節(jié)點(diǎn)發(fā)送”完成”消息。

4)協(xié)調(diào)者節(jié)點(diǎn)受到所有參與者節(jié)點(diǎn)反饋的”完成”消息后翠忠,完成事務(wù)鞠苟。

如果任一參與者節(jié)點(diǎn)在第一階段返回的響應(yīng)消息為”中止”,或者 協(xié)調(diào)者節(jié)點(diǎn)在第一階段的詢問超時之前無法獲取所有參與者節(jié)點(diǎn)的響應(yīng)消息時:

1)協(xié)調(diào)者節(jié)點(diǎn)向所有參與者節(jié)點(diǎn)發(fā)出”回滾操作(rollback)”的請求秽之。

2)參與者節(jié)點(diǎn)利用之前寫入的Undo信息執(zhí)行回滾当娱,并釋放在整個事務(wù)期間內(nèi)占用的資源。

3)參與者節(jié)點(diǎn)向協(xié)調(diào)者節(jié)點(diǎn)發(fā)送”回滾完成”消息考榨。

4)協(xié)調(diào)者節(jié)點(diǎn)受到所有參與者節(jié)點(diǎn)反饋的”回滾完成”消息后跨细,取消事務(wù)。

不管最后結(jié)果如何河质,第二階段都會結(jié)束當(dāng)前事務(wù)冀惭。

二階段提交看起來確實(shí)能夠提供原子性的操作,但是不幸的事愤诱,二階段提交還是有幾個缺點(diǎn)的:

1云头、同步阻塞問題。執(zhí)行過程中淫半,所有參與節(jié)點(diǎn)都是事務(wù)阻塞型的溃槐。當(dāng)參與者占有公共資源時,其他第三方節(jié)點(diǎn)訪問公共資源不得不處于阻塞狀態(tài)科吭。

2昏滴、單點(diǎn)故障。由于協(xié)調(diào)者的重要性对人,一旦協(xié)調(diào)者發(fā)生故障谣殊。參與者會一直阻塞下去。尤其在第二階段牺弄,協(xié)調(diào)者發(fā)生故障姻几,那么所有的參與者還都處于鎖定事務(wù)資源的狀態(tài)中,而無法繼續(xù)完成事務(wù)操作势告。(如果是協(xié)調(diào)者掛掉蛇捌,可以重新選舉一個協(xié)調(diào)者,但是無法解決因?yàn)閰f(xié)調(diào)者宕機(jī)導(dǎo)致的參與者處于阻塞狀態(tài)的問題)

3咱台、數(shù)據(jù)不一致络拌。在二階段提交的階段二中,當(dāng)協(xié)調(diào)者向參與者發(fā)送commit請求之后回溺,發(fā)生了局部網(wǎng)絡(luò)異炒好常或者在發(fā)送commit請求過程中協(xié)調(diào)者發(fā)生了故障混萝,這回導(dǎo)致只有一部分參與者接受到了commit請求。而在這部分參與者接到commit請求之后就會執(zhí)行commit操作萍恕。但是其他部分未接到commit請求的機(jī)器則無法執(zhí)行事務(wù)提交逸嘀。于是整個分布式系統(tǒng)便出現(xiàn)了數(shù)據(jù)部一致性的現(xiàn)象。

4允粤、二階段無法解決的問題:協(xié)調(diào)者再發(fā)出commit消息之后宕機(jī)厘熟,而唯一接收到這條消息的參與者同時也宕機(jī)了。那么即使協(xié)調(diào)者通過選舉協(xié)議產(chǎn)生了新的協(xié)調(diào)者维哈,這條事務(wù)的狀態(tài)也是不確定的,沒人知道事務(wù)是否被已經(jīng)提交登澜。

由于二階段提交存在著諸如同步阻塞阔挠、單點(diǎn)問題、腦裂等缺陷脑蠕,所以购撼,研究者們在二階段提交的基礎(chǔ)上做了改進(jìn),提出了三階段提交谴仙。

3PC

三階段提交(Three-phase commit)迂求,也叫三階段提交協(xié)議(Three-phase commit protocol),是二階段提交(2PC)的改進(jìn)版本晃跺。

與兩階段提交不同的是揩局,三階段提交有兩個改動點(diǎn)。

1掀虎、引入超時機(jī)制凌盯。同時在協(xié)調(diào)者和參與者中都引入超時機(jī)制。

2烹玉、在第一階段和第二階段中插入一個準(zhǔn)備階段驰怎。保證了在最后提交階段之前各參與節(jié)點(diǎn)的狀態(tài)是一致的。

也就是說二打,除了引入超時機(jī)制之外县忌,3PC把2PC的準(zhǔn)備階段再次一分為二,這樣三階段提交就有CanCommit继效、PreCommit症杏、DoCommit三個階段。

CanCommit階段

3PC的CanCommit階段其實(shí)和2PC的準(zhǔn)備階段很像莲趣。協(xié)調(diào)者向參與者發(fā)送commit請求鸳慈,參與者如果可以提交就返回Yes響應(yīng),否則返回No響應(yīng)喧伞。

1.事務(wù)詢問協(xié)調(diào)者向參與者發(fā)送CanCommit請求走芋。詢問是否可以執(zhí)行事務(wù)提交操作绩郎。然后開始等待參與者的響應(yīng)。

2.響應(yīng)反饋參與者接到CanCommit請求之后翁逞,正常情況下肋杖,如果其自身認(rèn)為可以順利執(zhí)行事務(wù),則返回Yes響應(yīng)挖函,并進(jìn)入預(yù)備狀態(tài)状植。否則反饋No

PreCommit階段

協(xié)調(diào)者根據(jù)參與者的反應(yīng)情況來決定是否可以記性事務(wù)的PreCommit操作。根據(jù)響應(yīng)情況怨喘,有以下兩種可能津畸。

假如協(xié)調(diào)者從所有的參與者獲得的反饋都是Yes響應(yīng),那么就會執(zhí)行事務(wù)的預(yù)執(zhí)行必怜。

1.發(fā)送預(yù)提交請求協(xié)調(diào)者向參與者發(fā)送PreCommit請求肉拓,并進(jìn)入Prepared階段。

2.事務(wù)預(yù)提交參與者接收到PreCommit請求后梳庆,會執(zhí)行事務(wù)操作画髓,并將undo和redo信息記錄到事務(wù)日志中牛柒。

3.響應(yīng)反饋如果參與者成功的執(zhí)行了事務(wù)操作沟堡,則返回ACK響應(yīng)熟菲,同時開始等待最終指令。

假如有任何一個參與者向協(xié)調(diào)者發(fā)送了No響應(yīng)更米,或者等待超時之后欺栗,協(xié)調(diào)者都沒有接到參與者的響應(yīng),那么就執(zhí)行事務(wù)的中斷壳快。

1.發(fā)送中斷請求協(xié)調(diào)者向所有參與者發(fā)送abort請求纸巷。

2.中斷事務(wù)參與者收到來自協(xié)調(diào)者的abort請求之后(或超時之后,仍未收到協(xié)調(diào)者的請求)眶痰,執(zhí)行事務(wù)的中斷瘤旨。

doCommit階段

該階段進(jìn)行真正的事務(wù)提交,也可以分為以下兩種情況竖伯。

執(zhí)行提交

1.發(fā)送提交請求協(xié)調(diào)接收到參與者發(fā)送的ACK響應(yīng)存哲,那么他將從預(yù)提交狀態(tài)進(jìn)入到提交狀態(tài)。并向所有參與者發(fā)送doCommit請求七婴。

2.事務(wù)提交參與者接收到doCommit請求之后祟偷,執(zhí)行正式的事務(wù)提交。并在完成事務(wù)提交之后釋放所有事務(wù)資源打厘。

3.響應(yīng)反饋事務(wù)提交完之后修肠,向協(xié)調(diào)者發(fā)送Ack響應(yīng)。

4.完成事務(wù)協(xié)調(diào)者接收到所有參與者的ack響應(yīng)之后户盯,完成事務(wù)嵌施。

中斷事務(wù)協(xié)調(diào)者沒有接收到參與者發(fā)送的ACK響應(yīng)(可能是接受者發(fā)送的不是ACK響應(yīng)饲化,也可能響應(yīng)超時),那么就會執(zhí)行中斷事務(wù)吗伤。

1.發(fā)送中斷請求協(xié)調(diào)者向所有參與者發(fā)送abort請求

2.事務(wù)回滾參與者接收到abort請求之后吃靠,利用其在階段二記錄的undo信息來執(zhí)行事務(wù)的回滾操作,并在完成回滾之后釋放所有的事務(wù)資源足淆。

3.反饋結(jié)果參與者完成事務(wù)回滾之后巢块,向協(xié)調(diào)者發(fā)送ACK消息

4.中斷事務(wù)協(xié)調(diào)者接收到參與者反饋的ACK消息之后,執(zhí)行事務(wù)的中斷巧号。

在doCommit階段族奢,如果參與者無法及時接收到來自協(xié)調(diào)者的doCommit或者rebort請求時,會在等待超時之后丹鸿,會繼續(xù)進(jìn)行事務(wù)的提交歹鱼。(其實(shí)這個應(yīng)該是基于概率來決定的,當(dāng)進(jìn)入第三階段時卜高,說明參與者在第二階段已經(jīng)收到了PreCommit請求,那么協(xié)調(diào)者產(chǎn)生PreCommit請求的前提條件是他在第二階段開始之前南片,收到所有參與者的CanCommit響應(yīng)都是Yes掺涛。(一旦參與者收到了PreCommit,意味他知道大家其實(shí)都同意修改了)所以疼进,一句話概括就是薪缆,當(dāng)進(jìn)入第三階段時,由于網(wǎng)絡(luò)超時等原因伞广,雖然參與者沒有收到commit或者abort響應(yīng)拣帽,但是他有理由相信:成功提交的幾率很大。 )

2PC與3PC的區(qū)別

相對于2PC嚼锄,3PC主要解決的單點(diǎn)故障問題减拭,并減少阻塞,因?yàn)橐坏﹨⑴c者無法及時收到來自協(xié)調(diào)者的信息之后区丑,他會默認(rèn)執(zhí)行commit拧粪。而不會一直持有事務(wù)資源并處于阻塞狀態(tài)。但是這種機(jī)制也會導(dǎo)致數(shù)據(jù)一致性問題沧侥,因?yàn)榭肾捎诰W(wǎng)絡(luò)原因,協(xié)調(diào)者發(fā)送的abort響應(yīng)沒有及時被參與者接收到宴杀,那么參與者在等待超時之后執(zhí)行了commit操作癣朗。這樣就和其他接到abort命令并執(zhí)行回滾的參與者之間存在數(shù)據(jù)不一致的情況。

了解了2PC和3PC之后旺罢,我們可以發(fā)現(xiàn)旷余,無論是二階段提交還是三階段提交都無法徹底解決分布式的一致性問題绢记。Google Chubby的作者M(jìn)ike Burrows說過,there is only one consensus protocol, and that’s Paxos” – all other approaches are just broken versions of Paxos.意即世上只有一種一致性算法荣暮,那就是Paxos庭惜,所有其他一致性算法都是Paxos算法的不完整版。后面的文章會介紹這個公認(rèn)為難于理解但是行之有效的Paxos算法穗酥。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末护赊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子砾跃,更是在濱河造成了極大的恐慌骏啰,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,843評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抽高,死亡現(xiàn)場離奇詭異判耕,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)翘骂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評論 3 392
  • 文/潘曉璐 我一進(jìn)店門壁熄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人碳竟,你說我怎么就攤上這事草丧。” “怎么了莹桅?”我有些...
    開封第一講書人閱讀 163,187評論 0 353
  • 文/不壞的土叔 我叫張陵昌执,是天一觀的道長。 經(jīng)常有香客問我诈泼,道長懂拾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,264評論 1 292
  • 正文 為了忘掉前任铐达,我火速辦了婚禮岖赋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘瓮孙。我一直安慰自己贾节,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評論 6 390
  • 文/花漫 我一把揭開白布衷畦。 她就那樣靜靜地躺著栗涂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪祈争。 梳的紋絲不亂的頭發(fā)上斤程,一...
    開封第一講書人閱讀 51,231評論 1 299
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼忿墅。 笑死扁藕,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的疚脐。 我是一名探鬼主播亿柑,決...
    沈念sama閱讀 40,116評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼棍弄!你這毒婦竟也來了望薄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,945評論 0 275
  • 序言:老撾萬榮一對情侶失蹤呼畸,失蹤者是張志新(化名)和其女友劉穎痕支,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛮原,經(jīng)...
    沈念sama閱讀 45,367評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡卧须,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了儒陨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片花嘶。...
    茶點(diǎn)故事閱讀 39,754評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蹦漠,靈堂內(nèi)的尸體忽然破棺而出察绷,到底是詐尸還是另有隱情,我是刑警寧澤津辩,帶...
    沈念sama閱讀 35,458評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站容劳,受9級特大地震影響喘沿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜竭贩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評論 3 327
  • 文/蒙蒙 一蚜印、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧留量,春花似錦窄赋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至可岂,卻和暖如春错敢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背缕粹。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評論 1 269
  • 我被黑心中介騙來泰國打工稚茅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留纸淮,地道東北人。 一個月前我還...
    沈念sama閱讀 47,797評論 2 369
  • 正文 我出身青樓亚享,卻偏偏與公主長得像咽块,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子欺税,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評論 2 354

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