分布式 - 分布式事務(wù)

學(xué)習(xí)完整課程請(qǐng)移步 互聯(lián)網(wǎng) Java 全棧工程師

分布式一致性

在分布式系統(tǒng)中句葵,為了保證數(shù)據(jù)的高可用风皿,通常盏浇,我們會(huì)將數(shù)據(jù)保留多個(gè)副本(replica),這些副本會(huì)放置在不同的物理的機(jī)器上蚀瘸。為了對(duì)用戶提供正確的 CRUD 等語(yǔ)義狡蝶,我們需要保證這些放置在不同物理機(jī)器上的副本是一致的。

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

分布式事務(wù)

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

在分布式系統(tǒng)中,各個(gè)節(jié)點(diǎn)之間在物理上相互獨(dú)立棵譬,通過網(wǎng)絡(luò)進(jìn)行溝通和協(xié)調(diào)显蝌。由于存在事務(wù)機(jī)制,可以保證每個(gè)獨(dú)立節(jié)點(diǎn)上的數(shù)據(jù)操作可以滿足 ACID订咸。但是曼尊,相互獨(dú)立的節(jié)點(diǎn)之間無法準(zhǔn)確的知道其他節(jié)點(diǎn)中的事務(wù)執(zhí)行情況。所以從理論上講脏嚷,兩臺(tái)機(jī)器理論上無法達(dá)到一致的狀態(tài)骆撇。如果想讓分布式部署的多臺(tái)機(jī)器中的數(shù)據(jù)保持一致性,那么就要保證在所有節(jié)點(diǎn)的數(shù)據(jù)寫操作父叙,要不全部都執(zhí)行神郊,要么全部的都不執(zhí)行肴裙。但是,一臺(tái)機(jī)器在執(zhí)行本地事務(wù)的時(shí)候無法知道其他機(jī)器中的本地事務(wù)的執(zhí)行結(jié)果涌乳。所以他也就不知道本次事務(wù)到底應(yīng)該 commit 還是 rollback蜻懦。所以,常規(guī)的解決辦法就是引入一個(gè)“協(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ù)庫(kù)渡贾,常見的通信資源管理器( CRM )是消息中間件逗宜。 通常把一個(gè)數(shù)據(jù)庫(kù)內(nèi)部的事務(wù)處理,如對(duì)多個(gè)表的操作空骚,作為本地事務(wù)看待纺讲。數(shù)據(jù)庫(kù)的事務(wù)處理對(duì)象是本地事務(wù),而分布式事務(wù)處理的對(duì)象是全局事務(wù)囤屹。 所謂全局事務(wù)熬甚,是指分布式事務(wù)處理環(huán)境中,多個(gè)數(shù)據(jù)庫(kù)可能需要共同完成一個(gè)工作肋坚,這個(gè)工作即是一個(gè)全局事務(wù)乡括,例如,一個(gè)事務(wù)中可能更新幾個(gè)不同的數(shù)據(jù)庫(kù)智厌。對(duì)數(shù)據(jù)庫(kù)的操作發(fā)生在系統(tǒng)的各處但必須全部被提交或回滾诲泌。此時(shí)一個(gè)數(shù)據(jù)庫(kù)對(duì)自己內(nèi)部所做操作的提交不僅依賴本身操作是否成功,還要依賴與全局事務(wù)相關(guān)的其它數(shù)據(jù)庫(kù)的操作是否成功铣鹏,如果任一數(shù)據(jù)庫(kù)的任一操作失敗敷扫,則參與此事務(wù)的所有數(shù)據(jù)庫(kù)所做的所有操作都必須回滾。 一般情況下诚卸,某一數(shù)據(jù)庫(kù)無法知道其它數(shù)據(jù)庫(kù)在做什么葵第,因此,在一個(gè) DTP 環(huán)境中合溺,交易中間件是必需的卒密,由它通知和協(xié)調(diào)相關(guān)數(shù)據(jù)庫(kù)的提交或回滾。而一個(gè)數(shù)據(jù)庫(kù)只將其自己所做的操作(可恢復(fù))影射到全局事務(wù)中辫愉。

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

二階提交協(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ù)庫(kù)領(lǐng)域內(nèi),為了使基于分布式系統(tǒng)架構(gòu)下的所有節(jié)點(diǎn)在進(jìn)行事務(wù)提交時(shí)保持一致性而設(shè)計(jì)的一種算法(Algorithm)棍丐。通常误辑,二階段提交也被稱為是一種協(xié)議(Protocol))。在分布式系統(tǒng)中歌逢,每個(gè)節(jié)點(diǎn)雖然可以知曉自己的操作時(shí)成功或者失敗巾钉,卻無法知道其他節(jié)點(diǎn)的操作的成功或失敗。當(dāng)一個(gè)事務(wù)跨越多個(gè)節(jié)點(diǎn)時(shí)秘案,為了保持事務(wù)的ACID特性砰苍,需要引入一個(gè)作為協(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)決定各參與者是否要提交操作還是中止操作

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

準(zhǔn)備階段

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

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

  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í)每個(gè)參與者已經(jīng)執(zhí)行了事務(wù)操作)
  3. 各參與者節(jié)點(diǎn)響應(yīng)協(xié)調(diào)者節(jié)點(diǎn)發(fā)起的詢問野揪。如果參與者節(jié)點(diǎn)的事務(wù)操作實(shí)際執(zhí)行成功访忿,則它返回一個(gè)”同意”消息;如果參與者節(jié)點(diǎn)的事務(wù)操作實(shí)際執(zhí)行失敗斯稳,則它返回一個(gè)”中止”消息海铆。

提交階段

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

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

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

image
  1. 協(xié)調(diào)者節(jié)點(diǎn)向所有參與者節(jié)點(diǎn)發(fā)出”正式提交( commit )”的請(qǐng)求。
  2. 參與者節(jié)點(diǎn)正式完成操作板乙,并釋放在整個(gè)事務(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)在第一階段的詢問超時(shí)之前無法獲取所有參與者節(jié)點(diǎn)的響應(yīng)消息時(shí):

image
  1. 協(xié)調(diào)者節(jié)點(diǎn)向所有參與者節(jié)點(diǎn)發(fā)出”回滾操作( rollback )”的請(qǐng)求放接。
  2. 參與者節(jié)點(diǎn)利用之前寫入的 Undo 信息執(zhí)行回滾刺啦,并釋放在整個(gè)事務(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é)果如何乳乌,第二階段都會(huì)結(jié)束當(dāng)前事務(wù)。

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

  1. 同步阻塞問題:執(zhí)行過程中,所有參與節(jié)點(diǎn)都是事務(wù)阻塞型的蒙兰。當(dāng)參與者占有公共資源時(shí),其他第三方節(jié)點(diǎn)訪問公共資源不得不處于阻塞狀態(tài)搜变。
  2. 單點(diǎn)故障:由于協(xié)調(diào)者的重要性采缚,一旦協(xié)調(diào)者發(fā)生故障扳抽。參與者會(huì)一直阻塞下去。尤其在第二階段殖侵,協(xié)調(diào)者發(fā)生故障,那么所有的參與者還都處于鎖定事務(wù)資源的狀態(tài)中拢军,而無法繼續(xù)完成事務(wù)操作楞陷。(如果是協(xié)調(diào)者掛掉,可以重新選舉一個(gè)協(xié)調(diào)者茉唉,但是無法解決因?yàn)閰f(xié)調(diào)者宕機(jī)導(dǎo)致的參與者處于阻塞狀態(tài)的問題)
  3. 數(shù)據(jù)不一致:在二階段提交的階段二中固蛾,當(dāng)協(xié)調(diào)者向參與者發(fā)送 commit 請(qǐng)求之后结执,發(fā)生了局部網(wǎng)絡(luò)異常或者在發(fā)送 commit 請(qǐng)求過程中協(xié)調(diào)者發(fā)生了故障艾凯,這回導(dǎo)致只有一部分參與者接受到了 commit 請(qǐng)求昌犹。而在這部分參與者接到 commit 請(qǐng)求之后就會(huì)執(zhí)行 commit 操作。但是其他部分未接到 commit 請(qǐng)求的機(jī)器則無法執(zhí)行事務(wù)提交览芳。于是整個(gè)分布式系統(tǒng)便出現(xiàn)了數(shù)據(jù)部一致性的現(xiàn)象斜姥。
  4. 二階段無法解決的問題:協(xié)調(diào)者再發(fā)出 commit 消息之后宕機(jī),而唯一接收到這條消息的參與者同時(shí)也宕機(jī)了沧竟。那么即使協(xié)調(diào)者通過選舉協(xié)議產(chǎn)生了新的協(xié)調(diào)者铸敏,這條事務(wù)的狀態(tài)也是不確定的,沒人知道事務(wù)是否被已經(jīng)提交悟泵。

由于二階段提交存在著諸如同步阻塞杈笔、單點(diǎn)問題、腦裂等缺陷糕非,所以蒙具,研究者們?cè)诙A段提交的基礎(chǔ)上做了改進(jìn),提出了三階段提交朽肥。

3PC

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

image

與兩階段提交不同的是篱昔,三階段提交有兩個(gè)改動(dòng)點(diǎn)。

  1. 引入超時(shí)機(jī)制始腾。同時(shí)在協(xié)調(diào)者和參與者中都引入超時(shí)機(jī)制州刽。
  2. 在第一階段和第二階段中插入一個(gè)準(zhǔn)備階段。保證了在最后提交階段之前各參與節(jié)點(diǎn)的狀態(tài)是一致的浪箭。

也就是說穗椅,除了引入超時(shí)機(jī)制之外,3PC 把 2PC 的準(zhǔn)備階段再次一分為二奶栖,這樣三階段提交就有 CanCommit匹表、PreCommitDoCommit 三個(gè)階段驼抹。

CanCommit 階段

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

  1. 事務(wù)詢問:協(xié)調(diào)者向參與者發(fā)送CanCommit請(qǐng)求蜻势。詢問是否可以執(zhí)行事務(wù)提交操作鹉胖。然后開始等待參與者的響應(yīng)甫菠。
  2. 響應(yīng)反饋:參與者接到CanCommit請(qǐng)求之后,正常情況下拂苹,如果其自身認(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)情況搀继,有以下兩種可能叽躯。

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

  • 發(fā)送預(yù)提交請(qǐng)求:協(xié)調(diào)者向參與者發(fā)送 PreCommit 請(qǐng)求黑滴,并進(jìn)入 Prepared 階段袁辈。
  • 事務(wù)預(yù)提交:參與者接收到 PreCommit 請(qǐng)求后珠漂,會(huì)執(zhí)行事務(wù)操作尾膊,并將 undo 和 redo 信息記錄到事務(wù)日志中冈敛。
  • 響應(yīng)反饋:如果參與者成功的執(zhí)行了事務(wù)操作抓谴,則返回 ACK 響應(yīng)寞缝,同時(shí)開始等待最終指令第租。

2. 假如有任何一個(gè)參與者向協(xié)調(diào)者發(fā)送了 No 響應(yīng),或者等待超時(shí)之后丐吓,協(xié)調(diào)者都沒有接到參與者的響應(yīng)趟据,那么就執(zhí)行事務(wù)的中斷汹碱。

  • 發(fā)送中斷請(qǐng)求:協(xié)調(diào)者向所有參與者發(fā)送 abort 請(qǐng)求。
  • 中斷事務(wù):參與者收到來自協(xié)調(diào)者的 abort 請(qǐng)求之后(或超時(shí)之后稚新,仍未收到協(xié)調(diào)者的請(qǐng)求)褂删,執(zhí)行事務(wù)的中斷冲茸。

doCommit 階段

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

1. 執(zhí)行提交

  • 發(fā)送提交請(qǐng)求:協(xié)調(diào)接收到參與者發(fā)送的 ACK 響應(yīng),那么他將從預(yù)提交狀態(tài)進(jìn)入到提交狀態(tài)盖袭。并向所有參與者發(fā)送 doCommit 請(qǐng)求。
  • 事務(wù)提交:參與者接收到 doCommit 請(qǐng)求之后趣席,執(zhí)行正式的事務(wù)提交醇蝴。并在完成事務(wù)提交之后釋放所有事務(wù)資源。
  • 響應(yīng)反饋:事務(wù)提交完之后悠栓,向協(xié)調(diào)者發(fā)送 ACK 響應(yīng)。
  • 完成事務(wù):協(xié)調(diào)者接收到所有參與者的 ACK 響應(yīng)之后笙瑟,完成事務(wù)往枷。

2. 中斷事務(wù)

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

  • 發(fā)送中斷請(qǐng)求:協(xié)調(diào)者向所有參與者發(fā)送 abort 請(qǐng)求
  • 事務(wù)回滾:參與者接收到 abort 請(qǐng)求之后导而,利用其在階段二記錄的 undo 信息來執(zhí)行事務(wù)的回滾操作今艺,并在完成回滾之后釋放所有的事務(wù)資源爵卒。
  • 反饋結(jié)果:參與者完成事務(wù)回滾之后,向協(xié)調(diào)者發(fā)送 ACK 消息
  • 中斷事務(wù):協(xié)調(diào)者接收到參與者反饋的ACK消息之后,執(zhí)行事務(wù)的中斷享幽。

doCommit 階段拾弃,如果參與者無法及時(shí)接收到來自協(xié)調(diào)者的 doCommit 或者 abort 請(qǐng)求時(shí),會(huì)在等待超時(shí)之后奔坟,會(huì)繼續(xù)進(jìn)行事務(wù)的提交。(其實(shí)這個(gè)應(yīng)該是基于概率來決定的婉支,當(dāng)進(jìn)入第三階段時(shí)澜建,說明參與者在第二階段已經(jīng)收到了 PreCommit 請(qǐng)求,那么協(xié)調(diào)者產(chǎn)生 PreCommit 請(qǐng)求的前提條件是他在第二階段開始之前何之,收到所有參與者的 CanCommit 響應(yīng)都是 Yes溶推。(一旦參與者收到了 PreCommit奸攻,意味他知道大家其實(shí)都同意修改了)所以,一句話概括就是舰褪,當(dāng)進(jìn)入第三階段時(shí)占拍,由于網(wǎng)絡(luò)超時(shí)等原因捎迫,雖然參與者沒有收到 commit 或者 abort 響應(yīng),但是他有理由相信:成功提交的幾率很大贝次。)

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

相對(duì)于 2PC蛔翅,3PC 主要解決的單點(diǎn)故障問題位谋,并減少阻塞,因?yàn)橐坏﹨⑴c者無法及時(shí)收到來自協(xié)調(diào)者的信息之后笋轨,他會(huì)默認(rèn)執(zhí)行 commit爵政。而不會(huì)一直持有事務(wù)資源并處于阻塞狀態(tài)。但是這種機(jī)制也會(huì)導(dǎo)致數(shù)據(jù)一致性問題洁灵,因?yàn)榇υ捎诰W(wǎng)絡(luò)原因蛛砰,協(xié)調(diào)者發(fā)送的 abort 響應(yīng)沒有及時(shí)被參與者接收到,那么參與者在等待超時(shí)之后執(zhí)行了 commit 操作荠诬。這樣就和其他接到 abort 命令并執(zhí)行回滾的參與者之間存在數(shù)據(jù)不一致的情況柑贞。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末钧嘶,一起剝皮案震驚了整個(gè)濱河市琳疏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌书幕,老刑警劉巖台汇,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件苟呐,死亡現(xiàn)場(chǎng)離奇詭異俐筋,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門闷哆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人劣坊,你說我怎么就攤上這事∏簦” “怎么了灌危?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵勇蝙,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我产雹,道長(zhǎng)翁锡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任瘟判,我火速辦了婚禮荒适,結(jié)果婚禮上刀诬,老公的妹妹穿的比我還像新娘邪财。我一直安慰自己,他們只是感情好糠馆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布又碌。 她就那樣靜靜地躺著,像睡著了一般铸鹰。 火紅的嫁衣襯著肌膚如雪皂岔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天剖毯,我揣著相機(jī)與錄音教馆,去河邊找鬼活玲。 笑死,一個(gè)胖子當(dāng)著我的面吹牛镀钓,可吹牛的內(nèi)容都是我干的镀迂。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼窟赏,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼涯穷!你這毒婦竟也來了拷况?” 一聲冷哼從身側(cè)響起掘殴,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎奏寨,沒想到半個(gè)月后病瞳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體悲酷,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡舔涎,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嚎于。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片于购。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖斑胜,靈堂內(nèi)的尸體忽然破棺而出嫌吠,到底是詐尸還是另有隱情,我是刑警寧澤凭戴,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布炕矮,位于F島的核電站肤视,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏腐螟。R本人自食惡果不足惜殊鞭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望锯仪。 院中可真熱鬧庶喜,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)稀颁。三九已至,卻和暖如春棱烂,著一層夾襖步出監(jiān)牢的瞬間阶女,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工衬鱼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留馁启,地道東北人芍秆。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓妖啥,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蒿偎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子怀读,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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