Kafka詳解

Kafka 是一個(gè)java開發(fā)的mq中間件易猫,依賴于zookeper,有高可用具壮,高吞吐量等特點(diǎn)准颓。

優(yōu)勢(shì)

  • 可靠性:partition機(jī)制和replication機(jī)制,使消息的傳遞有著很高的可靠性
  • 穩(wěn)定性棺妓,支持集群
  • 高性能攘已,高吞吐量,即使在TB的數(shù)據(jù)存儲(chǔ)情況下怜跑,仍然表現(xiàn)出很好的穩(wěn)定性
  • 支持消息廣播和單播样勃,可以根據(jù)重設(shè)offset實(shí)現(xiàn)消息的重復(fù)消費(fèi)

角色

  • Broker:kafka集群由一個(gè)或多個(gè)kafka server組成,每個(gè)server即Broker性芬。

  • Topic:邏輯概念峡眶。kafka對(duì)消息保存時(shí)根據(jù)Topic進(jìn)行歸類,一個(gè)Topic可以認(rèn)為是一類消息植锉。

  • Partition:物理概念辫樱。每個(gè)topic將被分成一到多個(gè)partition(分區(qū)),每個(gè)partition在存儲(chǔ)層面就是一個(gè)append log文件俊庇。一個(gè)非常大的topic可以分成多個(gè)partition狮暑,分布到多個(gè)broker上鸡挠。kafka只保證按一個(gè)partition中的順序?qū)⑾l(fā)給consumer,不保證一個(gè)topic的整體(多個(gè)partition間)的順序搬男。

  • offset:任何發(fā)布到Partition的消息都會(huì)被直接追加到log文件的尾部拣展,每條消息在文件中的位置稱為offset(偏移量),offset為一個(gè)long型數(shù)字缔逛,它是唯一標(biāo)記一條消息瞎惫。kafka并沒有提供其他額外的索引機(jī)制來(lái)存儲(chǔ)offset,因此在kafka中幾乎不允許對(duì)消息進(jìn)行“隨機(jī)讀寫”译株。

  • Producer:生成者瓜喇。Producer將消息發(fā)布到指定的Topic,也可以指定Partition歉糜。

  • Consumer:消費(fèi)者乘寒。Consumer采用pull的形式從Producer拉取消息

  • Consumer Group:每個(gè) consumer 屬于一個(gè)特定的 consumer group(若不指定 group name 則屬于默認(rèn)的 group)。一個(gè) topic可以有多個(gè)CG匪补,topic的消息會(huì)分發(fā)到所有的CG伞辛,但每個(gè)CG只會(huì)把消息發(fā)給該CG中的一個(gè) consumer。如果所有的consumer都具有相同的group, 即單播夯缺,消息將會(huì)在consumers之間負(fù)載均衡蚤氏;如果所有的consumer都具有不同的group,那這就是"發(fā)布-訂閱"踊兜,每條消息將會(huì)廣播給所有的consumer竿滨。

分區(qū)機(jī)制和文件存儲(chǔ)機(jī)制

如圖,kafka中的消息是以topic進(jìn)行分類的捏境,生產(chǎn)者通過(guò)topic向kafka broker發(fā)送消息于游,消費(fèi)者通過(guò)topic讀取消息。然而topic在物理層面上又能夠以partition進(jìn)行分組垫言,同一個(gè)topic下有多個(gè)不同的partition贰剥,每個(gè)partiton在物理上對(duì)應(yīng)一個(gè)目錄(文件夾),以topic名稱+有序序號(hào)的形式命名(序號(hào)從0開始計(jì)筷频,最大為partition數(shù)-1)蚌成。partition是實(shí)際物理上的概念,而topic是邏輯上的概念凛捏。Patition 的設(shè)計(jì)使得Kafka的吞吐率可以水平擴(kuò)展担忧。

每個(gè)分區(qū)文件夾下存儲(chǔ)這個(gè)分區(qū)的所有消息(.log)和索引文件(.index)】“.index”索引文件存儲(chǔ)大量的元數(shù)據(jù)涵妥,“.log”數(shù)據(jù)文件存儲(chǔ)大量的消息,索引文件中的元數(shù)據(jù)指向?qū)?yīng)數(shù)據(jù)文件中message的物理偏移地址坡锡。其中以“.index”索引文件中的元數(shù)據(jù)[3, 348]為例蓬网,在“.log”數(shù)據(jù)文件表示第3個(gè)消息,即在全局partition中表示170410+3=170413個(gè)消息鹉勒,該消息的物理偏移地址為348帆锋。

image.png

那么如何從partition中通過(guò)offset查找message呢?以上圖為例,讀取offset=170418的消息禽额,首先查找segment文件锯厢,其中 00000000000000000000.index為最開始的文件,第二個(gè)文件為00000000000000170410.index(起始偏移為170410+1=170411)脯倒,而第 三個(gè)文件為00000000000000239430.index(起始偏移為239430+1=239431)实辑,所以這個(gè)offset=170418就落到了第二個(gè)文件之中。其他 后續(xù)文件可以依次類推藻丢,以其實(shí)偏移量命名并排列這些文件剪撬,然后根據(jù)二分查找法就可以快速定位到具體文件位置。其次根據(jù) 00000000000000170410.index文件中的[8,1325]定位到00000000000000170410.log文件中的1325的位置進(jìn)行讀取悠反。

Kafka中topic的每個(gè)partition有一個(gè)預(yù)寫式的日志文件残黑,雖然partition可以繼續(xù)細(xì)分為若干個(gè)segment文件,但是對(duì)于上層應(yīng)用來(lái)說(shuō)可以將 partition看成最小的存儲(chǔ)單元(一個(gè)有多個(gè)segment文件拼接的“巨型”文件)斋否,每個(gè)partition都由一些列有序的梨水、不可變的消息組成,這些消息被連續(xù)的追加到partition中茵臭。

那如何保證消息均勻的分布到不同的partition中疫诽?

生產(chǎn)者在生產(chǎn)數(shù)據(jù)的時(shí)候,可以為每條消息指定Key旦委,這樣消息被發(fā)送到broker時(shí)踊沸,會(huì)根據(jù)分區(qū)規(guī)則選擇被存儲(chǔ)到哪一個(gè)分區(qū)中,如果分區(qū)規(guī)則設(shè)置的合理社证,那么所有的消息將會(huì)被均勻的分布到不同的分區(qū)中逼龟,這樣就實(shí)現(xiàn)了負(fù)載均衡和水平擴(kuò)展。分區(qū)規(guī)則可以自定義追葡,比如將消息的key做了hashcode腺律,然后和分區(qū)數(shù)(numPartitions)做模運(yùn)算,使得每一個(gè)key都可以分布到一個(gè)分區(qū)中宜肉。

高可用(High availability)

kafka的高可用就是依賴于上面的文件存儲(chǔ)結(jié)構(gòu)的匀钧,kafka能保證HA的策略有 data replication和leader election。

leader 機(jī)制

為了提高消息的可靠性谬返,Kafka每個(gè)topic的partition有N個(gè)副本(replicas)之斯,其中N(大于等于1)是topic的復(fù)制因子(replica fator)的個(gè)數(shù)。這個(gè)時(shí)候每個(gè) partition下面就有可能有多個(gè) replica(replication機(jī)制遣铝,相當(dāng)于是partition的副本但是有可能存儲(chǔ)在其他的broker上),但是這多個(gè)replica并不一定分布在一個(gè)broker上佑刷,而這時(shí)候?yàn)榱烁玫脑趓eplica之間復(fù)制數(shù)據(jù)莉擒,此時(shí)會(huì)選出一個(gè)leader,這個(gè)時(shí)候 producer會(huì)push消息到這個(gè)leader(leader機(jī)制)瘫絮,consumer也會(huì)從這個(gè)leader pull 消息涨冀,其他的 replica只是作為follower從leader復(fù)制數(shù)據(jù),leader負(fù)責(zé)所有的讀寫麦萤;如果沒有一個(gè)leader的話鹿鳖,所有的follower都去進(jìn)行讀寫 那么NxN(N+1個(gè)replica之間復(fù)制消息)的互相同步數(shù)據(jù)就變得很復(fù)雜而且數(shù)據(jù)的一致性和有序性不能夠保證。

如何將所有Replica均勻分布到整個(gè)集群

為了實(shí)現(xiàn)更高的可用性壮莹,推薦在部署kafka的時(shí)候翅帜,能夠保證一個(gè)topic的partition數(shù)量大于broker的數(shù)量,而且還需要把follower均勻的分布在所有的broker上命满,而不是只分布在一個(gè) broker上涝滴。zookeeper 會(huì)對(duì)partition的leader follower等進(jìn)行管理。
Kafka分配Replica的算法如下:

將所有Broker(假設(shè)共n個(gè)Broker)和待分配的Partition排序
將第i個(gè)Partition分配到第(i mod n)個(gè)Broker上
將第i個(gè)Partition的第j個(gè)Replica分配到第((i + j) mod n)個(gè)Broke

leader election

當(dāng)Leader宕機(jī)了周荐,怎樣在Follower中選舉出新的Leader狭莱?
一種非常常用的Leader Election的方式是“Majority Vote”(“少數(shù)服從多數(shù)”),但Kafka并未采用這種方式概作。
Kafka在Zookeeper中動(dòng)態(tài)維護(hù)了一個(gè)ISR(in-sync replicas)腋妙,這個(gè)ISR里的所有Replica都跟上了leader,只有ISR里的成員才有被選為L(zhǎng)eader的可能讯榕。

那么如何選取出leader:
最簡(jiǎn)單最直觀的方案是(誰(shuí)寫進(jìn)去誰(shuí)就是leader)骤素,所有Follower都在Zookeeper上設(shè)置一個(gè)Watch,一旦Leader宕機(jī)愚屁,其對(duì)應(yīng)的ephemeral znode會(huì)自動(dòng)刪除济竹,此時(shí)所有Follower都嘗試創(chuàng)建該節(jié)點(diǎn),而創(chuàng)建成功者(Zookeeper保證只有一個(gè)能創(chuàng)建成功)即是新的Leader霎槐,其它Replica即為Follower送浊。

Data Replication

消息commit

kafka在處理傳播消息的時(shí)候,Producer會(huì)發(fā)布消息到某個(gè)partition上丘跌,先通知找到這個(gè)partition的leader replica袭景,無(wú)論這個(gè)partition的 Replica factor是多少,Producer 先把消息發(fā)送給replica的leader闭树,然后Leader在接受到消息后會(huì)寫入到Log耸棒,這時(shí)候這個(gè)leader的其余follower都會(huì)去leader pull數(shù)據(jù),這樣可保證follower的replica的數(shù)據(jù)順序和leader是一致的报辱,follower在接受到消息之后寫入到Log里面(同步)与殃,然后向leader發(fā)送ack確認(rèn),一旦Leader接收到了所有的ISR(與leader保持同步的Replica列表)中的follower的ack消息,這個(gè)消息就被認(rèn)為是 commit了幅疼,然后leader增加HW并且向producer發(fā)送ack消息米奸,表示消息已經(jīng)發(fā)送完成。但是為了提高性能衣屏,每個(gè)follower在接受到消息之后就會(huì)直接返回給leader ack消息躏升,而并非等數(shù)據(jù)寫入到log里(異步)辩棒,所以狼忱,可以認(rèn)為對(duì)于已經(jīng)commit的數(shù)據(jù),只可以保證消息已經(jīng)存在與所有的replica的內(nèi)存中一睁,但是不保證已經(jīng)被持久化到磁盤中钻弄,所以進(jìn)而也就不能保證完全發(fā)生異常的時(shí)候,該消息能夠被consumer消費(fèi)掉者吁,如果異常發(fā)生窘俺,leader 宕機(jī),而且內(nèi)存數(shù)據(jù)消失复凳,此時(shí)重新選舉leader就會(huì)出現(xiàn)這樣的情況瘤泪,但是由于考慮大這樣的情況實(shí)屬少見,所以這種方式在性能和數(shù)據(jù)持久化上做了一個(gè)相對(duì)的平衡育八,consumer讀取消息也是從 leader对途,并且只有已經(jīng)commit之后的消息(offset小于HW)才會(huì)暴露給consumer。

消息確認(rèn)

kafka的存活條件包括兩個(gè)條件:

  1. kafka必須維持著與zookeeper的session(這個(gè)通過(guò)zookeeper的heartbeat機(jī)制來(lái)實(shí)現(xiàn))
  2. follower必須能夠及時(shí)的將數(shù)據(jù)從leader復(fù)制過(guò)去 髓棋,不能夠“落后太多”实檀。leader會(huì)跟蹤與其保持著同步的replica列表簡(jiǎn)稱ISR,(in-sync replica)按声,如果一個(gè)follower宕機(jī)或是落后太多膳犹,leader就會(huì)把它從ISR中移除掉。這里指的落后太多是說(shuō) follower復(fù)制的消息落后的超過(guò)了預(yù)設(shè)值签则,(該值可在KAFKA_HOME/config/server.properties中通過(guò)replica.lag.max.messages配置须床,其默認(rèn)值是4000),或者follower超過(guò)一定時(shí)間(該值可在KAFKA_HOME/config/server.properties中通過(guò)replica.lag.time.max.ms來(lái)配置渐裂,其默認(rèn)值是10000)沒有向leader發(fā)起fetch請(qǐng)求豺旬。

一條消息只有被ISR里的所有Follower都從Leader復(fù)制過(guò)去才會(huì)被認(rèn)為已提交。這樣就避免了部分?jǐn)?shù)據(jù)被寫進(jìn)了Leader芯义,還沒來(lái)得及被任何Follower復(fù)制就宕機(jī)了哈垢,而造成數(shù)據(jù)丟失(Consumer無(wú)法消費(fèi)這些數(shù)據(jù))。而對(duì)于Producer而言扛拨,它可以選擇是否等待消息commit耘分,這可以通過(guò)request.required.acks來(lái)設(shè)置。

0---表示不進(jìn)行消息接收是否成功的確認(rèn);
1---表示當(dāng)Leader接收成功時(shí)確認(rèn)求泰;
-1---表示Leader和Follower都接收成功時(shí)確認(rèn)央渣;

持久性

kafka使用文件存儲(chǔ)消息,這就直接決定kafka在性能上嚴(yán)重依賴文件系統(tǒng)的本身特性。且無(wú)論任何 OS 下,對(duì)文件系統(tǒng)本身的優(yōu)化幾乎沒有可能渴频。文件緩存/直接內(nèi)存映射等是常用的手段芽丹。 因?yàn)?kafka 是對(duì)日志文件進(jìn)行 append 操作,因此磁盤檢索的開支是較小的;同時(shí)為了減少磁盤寫入的次數(shù),broker會(huì)將消息暫時(shí)buffer起來(lái),當(dāng)消息的個(gè)數(shù)(或尺寸)達(dá)到一定閥值時(shí),再flush到磁盤,這樣減少了磁盤IO調(diào)用的次數(shù)。

producer

指定partition

producer將會(huì)和Topic下所有partition leader保持socket連接;消息由producer直接通過(guò)socket發(fā)送到broker,中間不會(huì)經(jīng)過(guò)任何"路由層".事實(shí)上,消息被路由到哪個(gè)partition上,有producer決定.比如可以采用"random""key-hash""輪詢"等,如果一個(gè)topic中有多個(gè)partitions,那么在producer端實(shí)現(xiàn)"消息均衡分發(fā)"是必要的.

異步發(fā)送

producer.type的默認(rèn)值是sync卜朗,即同步的方式拔第。這個(gè)參數(shù)指定了在后臺(tái)線程中消息的發(fā)送方式是同步的還是異步的愧杯。如果設(shè)置成異步的模式派诬,可以運(yùn)行生產(chǎn)者以batch的形式push數(shù)據(jù),這樣會(huì)極大的提高broker的性能蔽莱,但是這樣會(huì)增加丟失數(shù)據(jù)的風(fēng)險(xiǎn)逛万。

對(duì)于異步模式泳猬,還有4個(gè)配套的參數(shù),如下:

  • queue.buffering.max.ms 5000 啟用異步模式時(shí)宇植,producer緩存消息的時(shí)間得封。比如我們?cè)O(shè)置成1000時(shí),它會(huì)緩存1s的數(shù)據(jù)再一次發(fā)送出去指郁,這樣可以極大的增加broker吞吐量忙上,但也會(huì)造成時(shí)效性的降低。
  • queue.buffering.max.messages 10000 啟用異步模式時(shí)坡氯,producer緩存隊(duì)列里最大緩存的消息數(shù)量晨横,如果超過(guò)這個(gè)值,producer就會(huì)阻塞或者丟掉消息箫柳。
  • queue.enqueue.timeout.ms -1 當(dāng)達(dá)到上面參數(shù)時(shí)producer會(huì)阻塞等待的時(shí)間手形。如果設(shè)置為0,buffer隊(duì)列滿時(shí)producer不會(huì)阻塞悯恍,消息直接被丟掉库糠;若設(shè)置為-1,producer會(huì)被阻塞涮毫,不會(huì)丟消息瞬欧。
  • batch.num.messages 200 啟用異步模式時(shí),一個(gè)batch緩存的消息數(shù)量罢防。達(dá)到這個(gè)數(shù)值時(shí)艘虎,producer才會(huì)發(fā)送消息。(每次批量發(fā)送的數(shù)量)

以batch的方式推送數(shù)據(jù)可以極大的提高處理效率咒吐,kafka producer可以將消息在內(nèi)存中累計(jì)到一定數(shù)量后作為一個(gè)batch發(fā)送請(qǐng)求野建。batch的數(shù)量大小可以通過(guò)producer的參數(shù)(batch.num.messages)控制属划。通過(guò)增加batch的大小,可以減少網(wǎng)絡(luò)請(qǐng)求和磁盤IO的次數(shù)候生,當(dāng)然具體參數(shù)設(shè)置需要在效率和時(shí)效性方面做一個(gè)權(quán)衡同眯。在比較新的版本中還有batch.size這個(gè)參數(shù)。

consumer

  • consumer 采用pull的方式 從broker拉取數(shù)據(jù)唯鸭。采用pull方式的優(yōu)點(diǎn)有consumer端可以根據(jù)自己的消費(fèi)能力適時(shí)的去fetch消息并處理,且可以控制消息消費(fèi)的進(jìn)度(offset);此外,消費(fèi)者可以良好的控制消息消費(fèi)的數(shù)量,batch fetch.

  • consumer端向broker發(fā)送fetch請(qǐng)求,并告知其獲取消息的offset;此后consumer將會(huì)獲得一定條數(shù)的消息;consumer端也可以重置offset來(lái)重新消費(fèi)消息.

  • kafka和JMS(Java Message Service)實(shí)現(xiàn)(activeMQ)不同的是:即使消息被消費(fèi),消息仍然不會(huì)被立即刪除.日志文件將會(huì)根據(jù)broker中的配置要求,保留一定的時(shí)間之后刪除;比如log文件保留2天,那么兩天后,文件會(huì)被清除,無(wú)論其中的消息是否被消費(fèi).kafka通過(guò)這種簡(jiǎn)單的手段,來(lái)釋放磁盤空間,以及減少消息消費(fèi)之后對(duì)文件內(nèi)容改動(dòng)的磁盤IO開支须蜗。
    對(duì)于consumer而言,它需要保存消費(fèi)消息的offset,對(duì)于offset的保存和使用,有consumer來(lái)控制;當(dāng)consumer正常消費(fèi)消息時(shí),offset將會(huì)"線性"的向前驅(qū)動(dòng),即消息將依次順序被消費(fèi).事實(shí)上consumer可以使用任意順序消費(fèi)消息,它只需要將offset重置為任意值,offset將會(huì)保存在zookeeper中目溉。
    kafka集群幾乎不需要維護(hù)任何consumer和producer狀態(tài)信息,這些信息有zookeeper保存;因此producer和consumer的客戶端實(shí)現(xiàn)非常輕量級(jí),它們可以隨意離開,而不會(huì)對(duì)集群造成額外的影響明肮。

  • at most once: 消費(fèi)者fetch消息,然后保存offset,然后處理消息;當(dāng)client保存offset之后,但是在消息處理過(guò)程中出現(xiàn)了異常,導(dǎo)致部分消息未能繼續(xù)處理.那么此后"未處理"的消息將不能被fetch到,這就是"at most once".

  • at least once: 消費(fèi)者fetch消息,然后處理消息,然后保存offset.如果消息處理成功之后,但是在保存offset階段zookeeper異常導(dǎo)致保存操作未能執(zhí)行成功,這就導(dǎo)致接下來(lái)再次fetch時(shí)可能獲得上次已經(jīng)處理過(guò)的消息,這就是"at least once",原因offset沒有及時(shí)的提交給zookeeper停做,zookeeper恢復(fù)正常還是之前offset狀態(tài).

消息的順序性

Kafka分布式的單位是partition晤愧,同一個(gè)partition用一個(gè)log文件(追加寫大莫、offset讀)蛉腌,所以可以保證FIFO的順序。但是在多個(gè)Partition時(shí)只厘,不能保證Topic級(jí)別的數(shù)據(jù)有序性烙丛,除非創(chuàng)建Topic只指定1個(gè)partition,但這樣做就磨滅kafka高吞吐量的優(yōu)秀特性羔味。

kafka為了提高Topic的并發(fā)吞吐能力河咽,可以提高Topic的partition數(shù),并通過(guò)設(shè)置partition的replica來(lái)保證數(shù)據(jù)高可靠赋元。

Kafka 中發(fā)送1條消息的時(shí)候忘蟹,可以指定(topic, partition, key) 3個(gè)參數(shù),業(yè)務(wù)放使用producer插入數(shù)據(jù)時(shí)搁凸,可以控制同一Key發(fā)到同一Partition媚值,從而保證消息有序性。一個(gè)partition的消息只能被一個(gè)consumer消費(fèi)护糖。

安裝

詳情參見官網(wǎng)http://kafka.apache.org/
安裝會(huì)依賴java褥芒、zookeeper。

brew install kafka

//安裝的配置文件位置
/usr/local/etc/kafka/server.properties
/usr/local/etc/kafka/zookeeper.properties

//啟動(dòng)zookeeper -daemon 守護(hù)模式
zookeeper-server-start  /usr/local/etc/kafka/zookeeper.properties &

//啟動(dòng)kafka
kafka-server-start /usr/local/etc/kafka/server.properties &

//創(chuàng)建topic  創(chuàng)建單分區(qū)單副本的 topic test:
kafka-topics --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test

//查看創(chuàng)建的topic
kafka-topics --list --zookeeper localhost:2181

//發(fā)送消息客戶端
bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test 

//消費(fèi)消息
kafka-console-consumer --bootstrap-server localhost:9092 --topic test --from-beginning

參考文章:https://blog.csdn.net/gongzhiyao3739124/article/details/79688813

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嫡良,一起剝皮案震驚了整個(gè)濱河市锰扶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌寝受,老刑警劉巖坷牛,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異很澄,居然都是意外死亡京闰,警方通過(guò)查閱死者的電腦和手機(jī)锨亏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)忙干,“玉大人器予,你說(shuō)我怎么就攤上這事【杵龋” “怎么了乾翔?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)施戴。 經(jīng)常有香客問(wèn)我反浓,道長(zhǎng),這世上最難降的妖魔是什么赞哗? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任雷则,我火速辦了婚禮,結(jié)果婚禮上肪笋,老公的妹妹穿的比我還像新娘月劈。我一直安慰自己,他們只是感情好藤乙,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布猜揪。 她就那樣靜靜地躺著,像睡著了一般坛梁。 火紅的嫁衣襯著肌膚如雪而姐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天划咐,我揣著相機(jī)與錄音拴念,去河邊找鬼。 笑死褐缠,一個(gè)胖子當(dāng)著我的面吹牛政鼠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播送丰,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼缔俄,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了器躏?” 一聲冷哼從身側(cè)響起俐载,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎登失,沒想到半個(gè)月后遏佣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡揽浙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年状婶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了意敛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡膛虫,死狀恐怖草姻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情稍刀,我是刑警寧澤撩独,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站账月,受9級(jí)特大地震影響综膀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜局齿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一剧劝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧抓歼,春花似錦讥此、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至拌禾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間展哭,已是汗流浹背湃窍。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留匪傍,地道東北人您市。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像役衡,于是被迫代替她去往敵國(guó)和親茵休。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

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