Kafka架構(gòu)及基本原理簡(jiǎn)析

Kafka簡(jiǎn)介

??Kafka是一個(gè)由Scala和Java編寫(xiě)的企業(yè)級(jí)的消息發(fā)布和訂閱系統(tǒng),最早是由Linkedin公司開(kāi)發(fā),最終開(kāi)源到Apache軟件基金會(huì)的項(xiàng)目。Kafka是一個(gè)分布式的,支持分區(qū)的耐版,多副本的和多訂閱者的高吞吐量的消息系統(tǒng),被廣泛應(yīng)用在應(yīng)用解耦压汪、異步處理粪牲、限流削峰和消息驅(qū)動(dòng)等場(chǎng)景。本文將針對(duì)Kafka的架構(gòu)和相關(guān)組件進(jìn)行簡(jiǎn)單的介紹止剖。在介紹Kafka的架構(gòu)之前腺阳,我們先了解一下Kafk的核心概念落君。

Kafka核心概念

??在詳細(xì)介紹Kafka的架構(gòu)和基本組件之前,需要先了解一下Kafka的一些核心概念亭引。
Producer:消息的生產(chǎn)者绎速,負(fù)責(zé)往Kafka集群中發(fā)送消息;
Consumer:消息的消費(fèi)者焙蚓,主動(dòng)從Kafka集群中拉取消息纹冤。
Consumer Group:每個(gè)Consumer屬于一個(gè)特定的Consumer Group,新建Consumer的時(shí)候需要指定對(duì)應(yīng)的Consumer Group ID购公。
Broker:Kafka集群中的服務(wù)實(shí)例萌京,也稱(chēng)之為節(jié)點(diǎn),每個(gè)Kafka集群包含一個(gè)或者多個(gè)Broker(一個(gè)Broker就是一個(gè)服務(wù)器或節(jié)點(diǎn))宏浩。
Message:通過(guò)Kafka集群進(jìn)行傳遞的對(duì)象實(shí)體知残,存儲(chǔ)需要傳送的信息。
Topic:消息的類(lèi)別比庄,主要用于對(duì)消息進(jìn)行邏輯上的區(qū)分橡庞,每條發(fā)送到Kafka集群的消息都需要有一個(gè)指定的Topic,消費(fèi)者根據(jù)Topic對(duì)指定的消息進(jìn)行消費(fèi)印蔗。
Partition:消息的分區(qū),Partition是一個(gè)物理上的概念丑勤,相當(dāng)于一個(gè)文件夾华嘹,Kafka會(huì)為每個(gè)topic的每個(gè)分區(qū)創(chuàng)建一個(gè)文件夾,一個(gè)Topic的消息會(huì)存儲(chǔ)在一個(gè)或者多個(gè)Partition中法竞。
Segment:一個(gè)partition當(dāng)中存在多個(gè)segment文件段(分段存儲(chǔ))耙厚,每個(gè)Segment分為兩部分,.log文件和 .index 文件岔霸,其中 .index 文件是索引文件薛躬,主要用于快速查詢(xún).log 文件當(dāng)中數(shù)據(jù)的偏移量位置;
.log文件:存放Message的數(shù)據(jù)文件呆细,在Kafka中把數(shù)據(jù)文件就叫做日志文件型宝。一個(gè)分區(qū)下面默認(rèn)有n多個(gè).log文件(分段存儲(chǔ))。一個(gè).log文件大默認(rèn)1G絮爷,消息會(huì)不斷追加在.log文件中趴酣,當(dāng).log文件的大小超過(guò)1G的時(shí)候,會(huì)自動(dòng)新建一個(gè)新的.log文件坑夯。
.index文件:存放.log文件的索引數(shù)據(jù)岖寞,每個(gè).index文件有一個(gè)對(duì)應(yīng)同名的.log文件。
??后面我們會(huì)對(duì)上面的一些核心概念進(jìn)行更深入的介紹柜蜈。在介紹完Kafka的核心概念之后仗谆,我們來(lái)看一下Kafka的對(duì)外提供的基本功能指巡,組件及架構(gòu)設(shè)計(jì)。

Kafka API

基本組件

??如上圖所示隶垮,Kafka主要包含四個(gè)主要的API組件:
1. Producer API
??應(yīng)用程序通過(guò)Producer API向Kafka集群發(fā)送一個(gè)或多個(gè)Topic的消息藻雪。
2. Consumer API
??應(yīng)用程序通過(guò)Consumer API,向Kafka集群訂閱一個(gè)或多個(gè)Topic的消息岁疼,并處理這些Topic下接收到的消息阔涉。
3. Streams API
??應(yīng)用程序通過(guò)使用Streams API充當(dāng)流處理器(Stream Processor),從一個(gè)或者多個(gè)Topic獲取輸入流捷绒,并生產(chǎn)一個(gè)輸出流到一個(gè)或者多個(gè)Topic瑰排,能夠有效地將輸入流進(jìn)行轉(zhuǎn)變后變成輸出流輸出到Kafka集群。
4. Connect API
??允許應(yīng)用程序通過(guò)Connect API構(gòu)建和運(yùn)行可重用的生產(chǎn)者或者消費(fèi)者暖侨,能夠把kafka主題連接到現(xiàn)有的應(yīng)用程序或數(shù)據(jù)系統(tǒng)椭住。Connect實(shí)際上就做了兩件事情:使用Source Connector從數(shù)據(jù)源(如:DB)中讀取數(shù)據(jù)寫(xiě)入到Topic中,然后再通過(guò)Sink Connector讀取Topic中的數(shù)據(jù)輸出到另一端(如:DB)字逗,以實(shí)現(xiàn)消息數(shù)據(jù)在外部存儲(chǔ)和Kafka集群之間的傳輸京郑。

Kafka架構(gòu)

Kafka架構(gòu)

??接下來(lái)我們將從Kafka的架構(gòu)出發(fā),重點(diǎn)介紹Kafka的主要組件及實(shí)現(xiàn)原理葫掉。Kafka支持消息持久化些举,消費(fèi)端是通過(guò)主動(dòng)拉取消息進(jìn)行消息消費(fèi)的,訂閱狀態(tài)和訂閱關(guān)系由客戶(hù)端負(fù)責(zé)維護(hù)俭厚,消息消費(fèi)完后不會(huì)立刻刪除户魏,會(huì)保留歷史消息,一般默認(rèn)保留7天挪挤,因此可以通過(guò)在支持多訂閱者時(shí)叼丑,消息無(wú)需復(fù)制多分,只需要存儲(chǔ)一份就可以扛门。下面將詳細(xì)介紹每個(gè)組件的實(shí)現(xiàn)原理鸠信。
1. Producer
??Producer是Kafka中的消息生產(chǎn)者,主要用于生產(chǎn)帶有特定Topic的消息论寨,生產(chǎn)者生產(chǎn)的消息通過(guò)Topic進(jìn)行歸類(lèi)星立,保存在Kafka 集群的Broker上,具體的是保存在指定的partition 的目錄下政基,以Segment的方式(.log文件和.index文件)進(jìn)行存儲(chǔ)贞铣。
2. Consumer
??Consumer是Kafka中的消費(fèi)者,主要用于消費(fèi)指定Topic的消息沮明,Consumer是通過(guò)主動(dòng)拉取的方式從Kafka集群中消費(fèi)消息辕坝,消費(fèi)者一定屬于某一個(gè)特定的消費(fèi)組。
3. Topic
??Kafka中的消息是根據(jù)Topic進(jìn)行分類(lèi)的荐健,Topic是支持多訂閱的酱畅,一個(gè)Topic可以有多個(gè)不同的訂閱消息的消費(fèi)者琳袄。Kafka集群Topic的數(shù)量沒(méi)有限制,同一個(gè)Topic的數(shù)據(jù)會(huì)被劃分在同一個(gè)目錄下纺酸,一個(gè)Topic可以包含1至多個(gè)分區(qū)窖逗,所有分區(qū)的消息加在一起就是一個(gè)Topic的所有消息。
4. Partition
??在Kafka中餐蔬,為了提升消息的消費(fèi)速度碎紊,可以為每個(gè)Topic分配多個(gè)Partition,這也是就之前我們說(shuō)到的樊诺,Kafka是支持多分區(qū)的艾扮。默認(rèn)情況下烛亦,一個(gè)Topic的消息只存放在一個(gè)分區(qū)中。Topic的所有分區(qū)的消息合并起來(lái),就是一個(gè)Topic下的所有消息松靡。每個(gè)分區(qū)都有一個(gè)從0開(kāi)始的編號(hào)具伍,每個(gè)分區(qū)內(nèi)的數(shù)據(jù)都是有序的萤皂,但是不同分區(qū)直接的數(shù)據(jù)是不能保證有序的敛苇,因?yàn)椴煌姆謪^(qū)需要不同的Consumer去消費(fèi),每個(gè)Partition只能分配一個(gè)Consumer恋沃,但是一個(gè)Consumer可以同時(shí)一個(gè)Topic的多個(gè)Partition必搞。
5. Consumer Group
??Kafka中的每一個(gè)Consumer都?xì)w屬于一個(gè)特定的Consumer Group,如果不指定囊咏,那么所有的Consumer都屬于同一個(gè)默認(rèn)的Consumer Group顾画。Consumer Group由一個(gè)或多個(gè)Consumer組成,同一個(gè)Consumer Group中的Consumer對(duì)同一條消息只消費(fèi)一次匆笤。每個(gè)Consumer Group都有一個(gè)唯一的ID,即Group ID谱邪,也稱(chēng)之為Group Name炮捧。Consumer Group內(nèi)的所有Consumer協(xié)調(diào)在一起訂閱一個(gè)Topic的所有Partition,且每個(gè)Partition只能由一個(gè)Consuemr Group中的一個(gè)Consumer進(jìn)行消費(fèi)惦银,但是可以由不同的Consumer Group中的一個(gè)Consumer進(jìn)行消費(fèi)咆课。如下圖所示:

Consumer Group消費(fèi)示意圖

在層級(jí)關(guān)系上來(lái)說(shuō)Consumer Group好比是跟Topic對(duì)應(yīng)的,而Consumer就對(duì)應(yīng)于Topic下的Partition扯俱。Consumer Group中的Consumer數(shù)量和Topic下的Partition數(shù)量共同決定了消息消費(fèi)的并發(fā)量书蚪,且Partition數(shù)量決定了最終并發(fā)量,因?yàn)橐粋€(gè)Partition只能由一個(gè)Consumer進(jìn)行消費(fèi)迅栅。當(dāng)一個(gè)Consumer Group中Consumer數(shù)量超過(guò)訂閱的Topic下的Partition數(shù)量時(shí)殊校,Kafka會(huì)為每個(gè)Partition分配一個(gè)Consumer,多出來(lái)的Consumer會(huì)處于空閑狀態(tài)读存。當(dāng)Consumer Group中Consumer數(shù)量少于當(dāng)前定于的Topic中的Partition數(shù)量是为流,單個(gè)Consumer將承擔(dān)多個(gè)Partition的消費(fèi)工作呕屎。如上圖所示,Consumer Group B中的每個(gè)Consumer需要消費(fèi)兩個(gè)Partition中的數(shù)據(jù)敬察,而Consumer Group C中會(huì)多出來(lái)一個(gè)空閑的Consumer4秀睛。總結(jié)下來(lái)就是:同一個(gè)Topic下的Partition數(shù)量越多莲祸,同一時(shí)間可以有越多的Consumer進(jìn)行消費(fèi)蹂安,消費(fèi)的速度就會(huì)越快,吞吐量就越高锐帜。同時(shí)田盈,Consumer Group中的Consumer數(shù)量需要控制為小于等于Partition數(shù)量,且最好是整數(shù)倍:如1抹估,2缠黍,4等。
6. Segment
??考慮到消息消費(fèi)的性能药蜻,Kafka中的消息在每個(gè)Partition中是以分段的形式進(jìn)行存儲(chǔ)的瓷式,即每1G消息新建一個(gè)Segment,每個(gè)Segment包含兩個(gè)文件:.log文件和.index文件语泽。之前我們已經(jīng)說(shuō)過(guò)贸典,.log文件就是Kafka實(shí)際存儲(chǔ)Producer生產(chǎn)的消息,而.index文件采用稀疏索引的方式存儲(chǔ).log文件中對(duì)應(yīng)消息的邏輯編號(hào)和物理偏移地址(offset)踱卵,以便于加快數(shù)據(jù)的查詢(xún)速度廊驼。.log文件和.index文件是一一對(duì)應(yīng),成對(duì)出現(xiàn)的惋砂。下圖展示了.log文件和.index文件在Partition中的存在方式妒挎。

Segment文件

??Kafka里面每一條消息都有自己的邏輯offset(相對(duì)偏移量)以及存在物理磁盤(pán)上面實(shí)際的物理地址便宜量Position,也就是說(shuō)在Kafka中一條消息有兩個(gè)位置:offset(相對(duì)偏移量)和position(磁盤(pán)物理偏移地址)西饵。在kafka的設(shè)計(jì)中酝掩,將消息的offset作為了Segment文件名的一部分。Segment文件命名規(guī)則為:Partition全局的第一個(gè)Segment從0開(kāi)始眷柔,后續(xù)每個(gè)segment文件名為上一個(gè)Partition的最大offset(Message的offset期虾,非實(shí)際物理地偏移地址,實(shí)際物理地址需映射到.log中驯嘱,后面會(huì)詳細(xì)介紹在.log文件中查詢(xún)消息的原理)镶苞。數(shù)值最大為64位long大小,由20位數(shù)字表示鞠评,前置用0填充茂蚓。

通過(guò)Index查找Message的過(guò)程

??上圖展示了.index文件和.log文件直接的映射關(guān)系,通過(guò)上圖,我們可以簡(jiǎn)單介紹一下Kafka在Segment中查找Message的過(guò)程:
??1.根據(jù)需要消費(fèi)的下一個(gè)消息的offset煌贴,這里假設(shè)是7御板,使用二分查找在Partition中查找到文件名小于(一定要小于,因?yàn)槲募幪?hào)等于當(dāng)前offset的文件里存的都是大于當(dāng)前offset的消息)當(dāng)前offset的最大編號(hào)的.index文件牛郑,這里自然是查找到了00000000000000000000.index怠肋。
??2.在.index文件中,使用二分查找淹朋,找到offset小于或者等于指定offset(這里假設(shè)是7)的最大的offset笙各,這里查到的是6,然后獲取到index文件中offset為6指向的Position(物理偏移地址)為258础芍。
??3.在.log文件中杈抢,從磁盤(pán)位置258開(kāi)始順序掃描,直到找到offset為7的Message仑性。
至此惶楼,我們就簡(jiǎn)單介紹完了Segment的基本組件.index文件和.log文件的存儲(chǔ)和查詢(xún)?cè)怼5俏覀儠?huì)發(fā)現(xiàn)一個(gè)問(wèn)題:.index文件中的offset并不是按順序連續(xù)存儲(chǔ)的诊杆,為什么Kafka要將索引文件設(shè)計(jì)成這種不連續(xù)的樣子歼捐?這種不連續(xù)的索引設(shè)計(jì)方式稱(chēng)之為稀疏索引,Kafka中采用了稀疏索引的方式讀取索引晨汹,kafka每當(dāng).log中寫(xiě)入了4k大小的數(shù)據(jù)豹储,就往.index里以追加的寫(xiě)入一條索引記錄。使用稀疏索引主要有以下原因:
??(1)索引稀疏存儲(chǔ)淘这,可以大幅降低.index文件占用存儲(chǔ)空間大小剥扣。
??(2)稀疏索引文件較小,可以全部讀取到內(nèi)存中铝穷,可以避免讀取索引的時(shí)候進(jìn)行頻繁的IO磁盤(pán)操作钠怯,以便通過(guò)索引快速地定位到.log文件中的Message。
7. Message
??Message是實(shí)際發(fā)送和訂閱的信息是實(shí)際載體曙聂,Producer發(fā)送到Kafka集群中的每條消息呻疹,都被Kafka包裝成了一個(gè)Message對(duì)象,之后再存儲(chǔ)在磁盤(pán)中筹陵,而不是直接存儲(chǔ)的。Message在磁盤(pán)中的物理結(jié)構(gòu)如下所示镊尺。

On-disk format of a message

offset         : 8 bytes 
message length : 4 bytes (value: 4 + 1 + 1 + 8(if magic value > 0) + 4 + K + 4 + V)
crc            : 4 bytes
magic value    : 1 byte
attributes     : 1 byte
timestamp      : 8 bytes (Only exists when magic value is greater than zero)
key length     : 4 bytes
key            : K bytes
value length   : 4 bytes
value          : V bytes

??其中keyvalue存儲(chǔ)的是實(shí)際的Message內(nèi)容朦佩,長(zhǎng)度不固定,而其他都是對(duì)Message內(nèi)容的統(tǒng)計(jì)和描述庐氮,長(zhǎng)度固定语稠。因此在查找實(shí)際Message過(guò)程中,磁盤(pán)指針會(huì)根據(jù)Message的offsetmessage length計(jì)算移動(dòng)位數(shù),以加速M(fèi)essage的查找過(guò)程仙畦。之所以可以這樣加速输涕,因?yàn)镵afka的.log文件都是順序?qū)懙模疟P(pán)上寫(xiě)數(shù)據(jù)時(shí)慨畸,就是追加數(shù)據(jù)莱坎,沒(méi)有隨機(jī)寫(xiě)的操作。
8.Partition Replicas
??最后我們簡(jiǎn)單聊一下Kafka中的Partition Replicas(分區(qū)副本)機(jī)制寸士,0.8版本以前的Kafka是沒(méi)有副本機(jī)制的檐什。創(chuàng)建Topic時(shí),可以為T(mén)opic指定分區(qū)弱卡,也可以指定副本個(gè)數(shù)乃正。kafka 中的分區(qū)副本如下圖所示:

Kafka分區(qū)副本機(jī)制

??Kafka通過(guò)副本因子(replication-factor)控制消息副本保存在幾個(gè)Broker(服務(wù)器)上,一般情況下副本數(shù)等于Broker的個(gè)數(shù)婶博,且同一個(gè)副本因子不能放在同一個(gè)Broker中瓮具。副本因子是以分區(qū)為單位且區(qū)分角色;主副本稱(chēng)之為L(zhǎng)eader(任何時(shí)刻只有一個(gè))凡人,從副本稱(chēng)之為 Follower(可以有多個(gè))名党,處于同步狀態(tài)的副本叫做in-sync-replicas(ISR)。Leader負(fù)責(zé)讀寫(xiě)數(shù)據(jù)划栓,F(xiàn)ollower不負(fù)責(zé)對(duì)外提供數(shù)據(jù)讀寫(xiě)兑巾,只從Leader同步數(shù)據(jù),消費(fèi)者和生產(chǎn)者都是從leader讀寫(xiě)數(shù)據(jù)忠荞,不與follower交互蒋歌,因此Kafka并不是讀寫(xiě)分離的。同時(shí)使用Leader進(jìn)行讀寫(xiě)的好處是委煤,降低了數(shù)據(jù)同步帶來(lái)的數(shù)據(jù)讀取延遲堂油,因?yàn)镕ollower只能從Leader同步完數(shù)據(jù)之后才能對(duì)外提供讀取服務(wù)。
??如果一個(gè)分區(qū)有三個(gè)副本因子碧绞,就算其中一個(gè)掛掉府框,那么只會(huì)剩下的兩個(gè)中,選擇一個(gè)leader讥邻,如下圖所示迫靖。但不會(huì)在其他的broker中,另啟動(dòng)一個(gè)副本(因?yàn)樵诹硪慌_(tái)啟動(dòng)的話(huà)兴使,必然存在數(shù)據(jù)拷貝和傳輸系宜,會(huì)長(zhǎng)時(shí)間占用網(wǎng)絡(luò)IO,Kafka是一個(gè)高吞吐量的消息系統(tǒng)发魄,這個(gè)情況不允許發(fā)生)盹牧。如果指定分區(qū)的所有副本都掛了俩垃,Consumer如果發(fā)送數(shù)據(jù)到指定分區(qū)的話(huà),將寫(xiě)入不成功汰寓。Consumer發(fā)送到指定Partition的消息口柳,會(huì)首先寫(xiě)入到Leader Partition中,寫(xiě)完后還需要把消息寫(xiě)入到ISR列表里面的其它分區(qū)副本中有滑,寫(xiě)完之后這個(gè)消息才能提交offset跃闹。


Kafka主副本選取

??到這里,差不多把Kafka的架構(gòu)和基本原理簡(jiǎn)單介紹完了俺孙。Kafka為了實(shí)現(xiàn)高吞吐量和容錯(cuò)辣卒,還引入了很多優(yōu)秀的設(shè)計(jì)思路,如零拷貝睛榄,高并發(fā)網(wǎng)絡(luò)設(shè)計(jì)荣茫,順序存儲(chǔ),以后有時(shí)間再說(shuō)场靴。

  1. http://kafka.apache.org/
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末啡莉,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子旨剥,更是在濱河造成了極大的恐慌咧欣,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件轨帜,死亡現(xiàn)場(chǎng)離奇詭異魄咕,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)蚌父,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)哮兰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人苟弛,你說(shuō)我怎么就攤上這事喝滞。” “怎么了膏秫?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵右遭,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我缤削,道長(zhǎng)窘哈,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任亭敢,我火速辦了婚禮滚婉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吨拗。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布劝篷。 她就那樣靜靜地躺著哨鸭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪娇妓。 梳的紋絲不亂的頭發(fā)上像鸡,一...
    開(kāi)封第一講書(shū)人閱讀 51,462評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音哈恰,去河邊找鬼只估。 笑死,一個(gè)胖子當(dāng)著我的面吹牛着绷,可吹牛的內(nèi)容都是我干的蛔钙。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼荠医,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼吁脱!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起彬向,我...
    開(kāi)封第一講書(shū)人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤兼贡,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后娃胆,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體遍希,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年里烦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了凿蒜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡招驴,死狀恐怖篙程,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情别厘,我是刑警寧澤虱饿,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站触趴,受9級(jí)特大地震影響氮发,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜冗懦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一爽冕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧披蕉,春花似錦颈畸、人聲如沸乌奇。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)礁苗。三九已至,卻和暖如春徙缴,著一層夾襖步出監(jiān)牢的瞬間试伙,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工于样, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留疏叨,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓穿剖,卻偏偏與公主長(zhǎng)得像蚤蔓,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子携御,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

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