消息中間件—RabbitMQ(集群原理與搭建篇)

摘要:實(shí)際生產(chǎn)應(yīng)用中都會(huì)采用消息隊(duì)列的集群方案辽社,如果選擇RabbitMQ那么有必要了解下它的集群方案原理
一般來(lái)說(shuō)俐载,如果只是為了學(xué)習(xí)RabbitMQ或者驗(yàn)證業(yè)務(wù)工程的正確性那么在本地環(huán)境或者測(cè)試環(huán)境上使用其單實(shí)例部署就可以了,但是出于MQ中間件本身的可靠性愁铺、并發(fā)性、吞吐量和消息堆積能力等問題的考慮,在生產(chǎn)環(huán)境上一般都會(huì)考慮使用RabbitMQ的集群方案筛武。
對(duì)于RabbitMQ這么成熟的消息隊(duì)列產(chǎn)品來(lái)說(shuō)缝其,搭建它并不難并且也有不少童鞋寫過(guò)如何搭建RabbitMQ消息隊(duì)列集群的博文,但可能仍然有童鞋并不了解其背后的原理徘六,這會(huì)導(dǎo)致其遇到性能問題時(shí)無(wú)法對(duì)集群進(jìn)行進(jìn)一步的調(diào)優(yōu)内边。本篇主要介紹RabbitMQ集群方案的原理,如何搭建具備負(fù)載均衡能力的中小規(guī)模RabbitMQ集群待锈,并最后給出生產(chǎn)環(huán)境構(gòu)建一個(gè)能夠具備高可用漠其、高可靠和高吞吐量的中小規(guī)模RabbitMQ集群設(shè)計(jì)方案。

一竿音、RabbitMQ集群方案的原理

RabbitMQ這款消息隊(duì)列中間件產(chǎn)品本身是基于Erlang編寫辉懒,Erlang語(yǔ)言天生具備分布式特性(通過(guò)同步Erlang集群各節(jié)點(diǎn)的magic cookie來(lái)實(shí)現(xiàn))。因此谍失,RabbitMQ天然支持Clustering。這使得RabbitMQ本身不需要像ActiveMQ莹汤、Kafka那樣通過(guò)ZooKeeper分別來(lái)實(shí)現(xiàn)HA方案和保存集群的元數(shù)據(jù)快鱼。集群是保證可靠性的一種方式,同時(shí)可以通過(guò)水平擴(kuò)展以達(dá)到增加消息吞吐量能力的目的纲岭。 下面先來(lái)看下RabbitMQ集群的整體方案:

RabbitMQ集群的方案1.jpg

上面圖中采用三個(gè)節(jié)點(diǎn)組成了一個(gè)RabbitMQ的集群抹竹,Exchange A(交換器,對(duì)于RabbitMQ基礎(chǔ)概念不太明白的童鞋可以看下基礎(chǔ)概念)的元數(shù)據(jù)信息在所有節(jié)點(diǎn)上是一致的止潮,而Queue(存放消息的隊(duì)列)的完整數(shù)據(jù)則只會(huì)存在于它所創(chuàng)建的那個(gè)節(jié)點(diǎn)上窃判。,其他節(jié)點(diǎn)只知道這個(gè)queue的metadata信息和一個(gè)指向queue的owner node的指針喇闸。

(1)RabbitMQ集群元數(shù)據(jù)的同步

RabbitMQ集群會(huì)始終同步四種類型的內(nèi)部元數(shù)據(jù)(類似索引):
a.隊(duì)列元數(shù)據(jù):隊(duì)列名稱和它的屬性袄琳;
b.交換器元數(shù)據(jù):交換器名稱、類型和屬性燃乍;
c.綁定元數(shù)據(jù):一張簡(jiǎn)單的表格展示了如何將消息路由到隊(duì)列唆樊;
d.vhost元數(shù)據(jù):為vhost內(nèi)的隊(duì)列、交換器和綁定提供命名空間和安全屬性刻蟹;
因此逗旁,當(dāng)用戶訪問其中任何一個(gè)RabbitMQ節(jié)點(diǎn)時(shí),通過(guò)rabbitmqctl查詢到的queue/user/exchange/vhost等信息都是相同的舆瘪。

(2)為何RabbitMQ集群僅采用元數(shù)據(jù)同步的方式

我想肯定有不少同學(xué)會(huì)問片效,想要實(shí)現(xiàn)HA方案,那將RabbitMQ集群中的所有Queue的完整數(shù)據(jù)在所有節(jié)點(diǎn)上都保存一份不就可以了么英古?(可以類似MySQL的主主模式嘛)這樣子淀衣,任何一個(gè)節(jié)點(diǎn)出現(xiàn)故障或者宕機(jī)不可用時(shí),那么使用者的客戶端只要能連接至其他節(jié)點(diǎn)能夠照常完成消息的發(fā)布和訂閱嘛哺呜。
我想RabbitMQ的作者這么設(shè)計(jì)主要還是基于集群本身的性能和存儲(chǔ)空間上來(lái)考慮舌缤。第一箕戳,存儲(chǔ)空間,如果每個(gè)集群節(jié)點(diǎn)都擁有所有Queue的完全數(shù)據(jù)拷貝国撵,那么每個(gè)節(jié)點(diǎn)的存儲(chǔ)空間會(huì)非常大陵吸,集群的消息積壓能力會(huì)非常弱(無(wú)法通過(guò)集群節(jié)點(diǎn)的擴(kuò)容提高消息積壓能力);第二介牙,性能壮虫,消息的發(fā)布者需要將消息復(fù)制到每一個(gè)集群節(jié)點(diǎn),對(duì)于持久化消息环础,網(wǎng)絡(luò)和磁盤同步復(fù)制的開銷都會(huì)明顯增加囚似。

(3)RabbitMQ集群發(fā)送/訂閱消息的基本原理

RabbitMQ集群的工作原理圖如下:


RabbitMQ集群工作原理.jpg

場(chǎng)景1、客戶端直接連接隊(duì)列所在節(jié)點(diǎn)

如果有一個(gè)消息生產(chǎn)者或者消息消費(fèi)者通過(guò)amqp-client的客戶端連接至節(jié)點(diǎn)1進(jìn)行消息的發(fā)布或者訂閱线得,那么此時(shí)的集群中的消息收發(fā)只與節(jié)點(diǎn)1相關(guān)饶唤,這個(gè)沒有任何問題;如果客戶端相連的是節(jié)點(diǎn)2或者節(jié)點(diǎn)3(隊(duì)列1數(shù)據(jù)不在該節(jié)點(diǎn)上)贯钩,那么情況又會(huì)是怎么樣呢募狂?

場(chǎng)景2、客戶端連接的是非隊(duì)列數(shù)據(jù)所在節(jié)點(diǎn)

如果消息生產(chǎn)者所連接的是節(jié)點(diǎn)2或者節(jié)點(diǎn)3角雷,此時(shí)隊(duì)列1的完整數(shù)據(jù)不在該兩個(gè)節(jié)點(diǎn)上祸穷,那么在發(fā)送消息過(guò)程中這兩個(gè)節(jié)點(diǎn)主要起了一個(gè)路由轉(zhuǎn)發(fā)作用,根據(jù)這兩個(gè)節(jié)點(diǎn)上的元數(shù)據(jù)(也就是上文提到的:指向queue的owner node的指針)轉(zhuǎn)發(fā)至節(jié)點(diǎn)1上勺三,最終發(fā)送的消息還是會(huì)存儲(chǔ)至節(jié)點(diǎn)1的隊(duì)列1上雷滚。
同樣,如果消息消費(fèi)者所連接的節(jié)點(diǎn)2或者節(jié)點(diǎn)3吗坚,那這兩個(gè)節(jié)點(diǎn)也會(huì)作為路由節(jié)點(diǎn)起到轉(zhuǎn)發(fā)作用祈远,將會(huì)從節(jié)點(diǎn)1的隊(duì)列1中拉取消息進(jìn)行消費(fèi)。

二刻蚯、RabbitMQ集群的搭建

(1)搭建RabbitMQ集群所需要安裝的組件

在搭建RabbitMQ集群之前有必要在每臺(tái)虛擬機(jī)上安裝如下的組件包绊含,分別如下:
a.Jdk 1.8
b.Erlang運(yùn)行時(shí)環(huán)境,這里用的是otp_src_19.3.tar.gz (200MB+)
c.RabbitMq的Server組件炊汹,這里用的rabbitmq-server-generic-unix-3.6.10.tar.gz
關(guān)于如何安裝上述三個(gè)組件的具體步驟躬充,已經(jīng)有不少博文對(duì)此進(jìn)行了非常詳細(xì)的描述,那么本文就不再贅述了讨便。有需要的同學(xué)可以具體參考這些步驟來(lái)完成安裝充甚。

(2)搭建10節(jié)點(diǎn)組成的RabbitMQ集群

該節(jié)中主要展示的是集群搭建,需要確保每臺(tái)機(jī)器上正確安裝了上述三種組件霸褒,并且每臺(tái)虛擬機(jī)上的RabbitMQ的實(shí)例能夠正常啟動(dòng)起來(lái)伴找。
a.編輯每臺(tái)RabbitMQ的cookie文件,以確保各個(gè)節(jié)點(diǎn)的cookie文件使用的是同一個(gè)值,可以scp其中一臺(tái)機(jī)器上的cookie至其他各個(gè)節(jié)點(diǎn)废菱,cookie的默認(rèn)路徑為/var/lib/rabbitmq/.erlang.cookie或者$HOME/.erlang.cookie技矮,節(jié)點(diǎn)之間通過(guò)cookie確定相互是否可通信抖誉。
b.配置各節(jié)點(diǎn)的hosts文件( vim /etc/hosts)

xxx.xxx.xxx.xxx rmq-broker-test-1
xxx.xxx.xxx.xxx rmq-broker-test-2
xxx.xxx.xxx.xxx rmq-broker-test-3
......
xxx.xxx.xxx.xxx rmq-broker-test-10

c.逐個(gè)節(jié)點(diǎn)啟動(dòng)RabbitMQ服務(wù)

rabbitmq-server -detached

d.查看各個(gè)節(jié)點(diǎn)和集群的工作運(yùn)行狀態(tài)

rabbitmqctl status, rabbitmqctl cluster_status

e.以rmq-broker-test-1為主節(jié)點(diǎn),在rmq-broker-test-2上:

rabbitmqctl stop_app 
rabbitmqctl reset 
rabbitmqctl join_cluster rabbit@rmq-broker-test-2 
rabbitmqctl start_app 

在其余的節(jié)點(diǎn)上的操作步驟與rmq-broker-test-2虛擬機(jī)上的一樣衰倦。
d.在RabbitMQ集群中的節(jié)點(diǎn)只有兩種類型:內(nèi)存節(jié)點(diǎn)/磁盤節(jié)點(diǎn)袒炉,單節(jié)點(diǎn)系統(tǒng)只運(yùn)行磁盤類型的節(jié)點(diǎn)。而在集群中樊零,可以選擇配置部分節(jié)點(diǎn)為內(nèi)存節(jié)點(diǎn)我磁。
內(nèi)存節(jié)點(diǎn)將所有的隊(duì)列,交換器驻襟,綁定關(guān)系夺艰,用戶,權(quán)限沉衣,和vhost的元數(shù)據(jù)信息保存在內(nèi)存中郁副。而磁盤節(jié)點(diǎn)將這些信息保存在磁盤中,但是內(nèi)存節(jié)點(diǎn)的性能更高豌习,為了保證集群的高可用性霞势,必須保證集群中有兩個(gè)以上的磁盤節(jié)點(diǎn),來(lái)保證當(dāng)有一個(gè)磁盤節(jié)點(diǎn)崩潰了斑鸦,集群還能對(duì)外提供訪問服務(wù)。在上面的操作中草雕,可以通過(guò)如下的方式巷屿,設(shè)置新加入的節(jié)點(diǎn)為內(nèi)存節(jié)點(diǎn)還是磁盤節(jié)點(diǎn):

#加入時(shí)候設(shè)置節(jié)點(diǎn)為內(nèi)存節(jié)點(diǎn)(默認(rèn)加入的為磁盤節(jié)點(diǎn))
[root@mq-testvm1 ~]# rabbitmqctl join_cluster rabbit@rmq-broker-test-1 --ram
#也通過(guò)下面方式修改的節(jié)點(diǎn)的類型
[root@mq-testvm1 ~]# rabbitmqctl changeclusternode_type disc | ram

e.最后可以通過(guò)“rabbitmqctl cluster_status”的方式來(lái)查看集群的狀態(tài),上面搭建的10個(gè)節(jié)點(diǎn)的RabbitMQ集群狀態(tài)(3個(gè)節(jié)點(diǎn)為磁盤即誒但墩虹,7個(gè)節(jié)點(diǎn)為內(nèi)存節(jié)點(diǎn))如下:

Cluster status of node 'rabbit@rmq-broker-test-1'
[{nodes,[{disc,['rabbit@rmq-broker-test-1','rabbit@rmq-broker-test-2',
                'rabbit@rmq-broker-test-3']},
         {ram,['rabbit@rmq-broker-test-9','rabbit@rmq-broker-test-8',
               'rabbit@rmq-broker-test-7','rabbit@rmq-broker-test-6',
               'rabbit@rmq-broker-test-5','rabbit@rmq-broker-test-4',
               'rabbit@rmq-broker-test-10']}]},
 {running_nodes,['rabbit@rmq-broker-test-10','rabbit@rmq-broker-test-5',
                 'rabbit@rmq-broker-test-9','rabbit@rmq-broker-test-2',
                 'rabbit@rmq-broker-test-8','rabbit@rmq-broker-test-7',
                 'rabbit@rmq-broker-test-6','rabbit@rmq-broker-test-3',
                 'rabbit@rmq-broker-test-4','rabbit@rmq-broker-test-1']},
 {cluster_name,<<"rabbit@mq-testvm1">>},
 {partitions,[]},
 {alarms,[{'rabbit@rmq-broker-test-10',[]},
          {'rabbit@rmq-broker-test-5',[]},
          {'rabbit@rmq-broker-test-9',[]},
          {'rabbit@rmq-broker-test-2',[]},
          {'rabbit@rmq-broker-test-8',[]},
          {'rabbit@rmq-broker-test-7',[]},
          {'rabbit@rmq-broker-test-6',[]},
          {'rabbit@rmq-broker-test-3',[]},
          {'rabbit@rmq-broker-test-4',[]},
          {'rabbit@rmq-broker-test-1',[]}]}]

(3)配置HAProxy

HAProxy提供高可用性嘱巾、負(fù)載均衡以及基于TCP和HTTP應(yīng)用的代理,支持虛擬主機(jī)诫钓,它是免費(fèi)旬昭、快速并且可靠的一種解決方案。根據(jù)官方數(shù)據(jù)菌湃,其最高極限支持10G的并發(fā)问拘。HAProxy支持從4層至7層的網(wǎng)絡(luò)交換,即覆蓋所有的TCP協(xié)議惧所。就是說(shuō)骤坐,Haproxy 甚至還支持 Mysql 的均衡負(fù)載。為了實(shí)現(xiàn)RabbitMQ集群的軟負(fù)載均衡下愈,這里可以選擇HAProxy纽绍。
關(guān)于HAProxy如何安裝的文章之前也有很多同學(xué)寫過(guò),這里就不再贅述了势似,有需要的同學(xué)可以參考下網(wǎng)上的做法拌夏。這里主要說(shuō)下安裝完HAProxy組件后的具體配置僧著。
HAProxy使用單一配置文件來(lái)定義所有屬性,包括從前端IP到后端服務(wù)器障簿。下面展示了用于7個(gè)RabbitMQ節(jié)點(diǎn)組成集群的負(fù)載均衡配置(另外3個(gè)磁盤節(jié)點(diǎn)用于保存集群的配置和元數(shù)據(jù)盹愚,不做負(fù)載)。同時(shí)卷谈,HAProxy運(yùn)行在另外一臺(tái)機(jī)器上杯拐。HAProxy的具體配置如下:

#全局配置
global
        #日志輸出配置,所有日志都記錄在本機(jī)世蔗,通過(guò)local0輸出
        log 127.0.0.1 local0 info
        #最大連接數(shù)
        maxconn 4096
        #改變當(dāng)前的工作目錄
        chroot /apps/svr/haproxy
        #以指定的UID運(yùn)行haproxy進(jìn)程
        uid 99
        #以指定的GID運(yùn)行haproxy進(jìn)程
        gid 99
        #以守護(hù)進(jìn)程方式運(yùn)行haproxy #debug #quiet
        daemon
        #debug
        #當(dāng)前進(jìn)程pid文件
        pidfile /apps/svr/haproxy/haproxy.pid

#默認(rèn)配置
defaults
        #應(yīng)用全局的日志配置
        log global
        #默認(rèn)的模式mode{tcp|http|health}
        #tcp是4層端逼,http是7層,health只返回OK
        mode tcp
        #日志類別tcplog
        option tcplog
        #不記錄健康檢查日志信息
        option dontlognull
        #3次失敗則認(rèn)為服務(wù)不可用
        retries 3
        #每個(gè)進(jìn)程可用的最大連接數(shù)
        maxconn 2000
        #連接超時(shí)
        timeout connect 5s
        #客戶端超時(shí)
        timeout client 120s
        #服務(wù)端超時(shí)
        timeout server 120s

        maxconn 2000
        #連接超時(shí)
        timeout connect 5s
        #客戶端超時(shí)
        timeout client 120s
        #服務(wù)端超時(shí)
        timeout server 120s

#綁定配置
listen rabbitmq_cluster
        bind 0.0.0.0:5672
        #配置TCP模式
        mode tcp
        #加權(quán)輪詢
        balance roundrobin
        #RabbitMQ集群節(jié)點(diǎn)配置,其中ip1~ip7為RabbitMQ集群節(jié)點(diǎn)ip地址
        server rmq_node1 ip1:5672 check inter 5000 rise 2 fall 3 weight 1
        server rmq_node2 ip2:5672 check inter 5000 rise 2 fall 3 weight 1
        server rmq_node3 ip3:5672 check inter 5000 rise 2 fall 3 weight 1
        server rmq_node4 ip4:5672 check inter 5000 rise 2 fall 3 weight 1
        server rmq_node5 ip5:5672 check inter 5000 rise 2 fall 3 weight 1
        server rmq_node6 ip6:5672 check inter 5000 rise 2 fall 3 weight 1
        server rmq_node7 ip7:5672 check inter 5000 rise 2 fall 3 weight 1

#haproxy監(jiān)控頁(yè)面地址
listen monitor
        bind 0.0.0.0:8100
        mode http
        option httplog
        stats enable
        stats uri /stats
        stats refresh 5s

在上面的配置中“l(fā)isten rabbitmq_cluster bind 0.0.0.0:5671”這里定義了客戶端連接IP地址和端口號(hào)污淋。這里配置的負(fù)載均衡算法是roundrobin—加權(quán)輪詢顶滩。與配置RabbitMQ集群負(fù)載均衡最為相關(guān)的是“ server rmq_node1 ip1:5672 check inter 5000 rise 2 fall 3 weight 1”這種,它標(biāo)識(shí)并且定義了后端RabbitMQ的服務(wù)寸爆。主要含義如下:
(a)“server <name>”部分:定義HAProxy內(nèi)RabbitMQ服務(wù)的標(biāo)識(shí)礁鲁;
(b)“ip1:5672”部分:標(biāo)識(shí)了后端RabbitMQ的服務(wù)地址;
(c)“check inter <value>”部分:表示每隔多少毫秒檢查RabbitMQ服務(wù)是否可用赁豆;
(d)“rise <value>”部分:表示RabbitMQ服務(wù)在發(fā)生故障之后仅醇,需要多少次健康檢查才能被再次確認(rèn)可用;
(e)“fall <value>”部分:表示需要經(jīng)歷多少次失敗的健康檢查之后魔种,HAProxy才會(huì)停止使用此RabbitMQ服務(wù)析二。

#啟用HAProxy服務(wù)
[root@mq-testvm12 conf]# haproxy -f haproxy.cfg

啟動(dòng)后,即可看到如下的HAproxy的界面圖:


RabbitMQ集群Haproxy部署的UI界面.jpg

(4)RabbitMQ的集群架構(gòu)設(shè)計(jì)圖

經(jīng)過(guò)上面的RabbitMQ10個(gè)節(jié)點(diǎn)集群搭建和HAProxy軟彈性負(fù)載均衡配置后即可組建一個(gè)中小規(guī)模的RabbitMQ集群了节预,然而為了能夠在實(shí)際的生產(chǎn)環(huán)境使用還需要根據(jù)實(shí)際的業(yè)務(wù)需求對(duì)集群中的各個(gè)實(shí)例進(jìn)行一些性能參數(shù)指標(biāo)的監(jiān)控叶摄,從性能、吞吐量和消息堆積能力等角度考慮安拟,可以選擇Kafka來(lái)作為RabbitMQ集群的監(jiān)控隊(duì)列使用蛤吓。因此,這里先給出了一個(gè)中小規(guī)模RabbitMQ集群架構(gòu)設(shè)計(jì)圖:


RabbitMQ小規(guī)模集群的架構(gòu)設(shè)計(jì)圖(附加了監(jiān)控部分).png

對(duì)于消息的生產(chǎn)和消費(fèi)者可以通過(guò)HAProxy的軟負(fù)載將請(qǐng)求分發(fā)至RabbitMQ集群中的Node1~Node7節(jié)點(diǎn)糠赦,其中Node8~Node10的三個(gè)節(jié)點(diǎn)作為磁盤節(jié)點(diǎn)保存集群元數(shù)據(jù)和配置信息会傲。鑒于篇幅原因這里就不在對(duì)監(jiān)控部分進(jìn)行詳細(xì)的描述的,會(huì)在后續(xù)篇幅中對(duì)如何使用RabbitMQ的HTTP API接口進(jìn)行監(jiān)控?cái)?shù)據(jù)統(tǒng)計(jì)進(jìn)行詳細(xì)闡述拙泽。

三唆铐、總結(jié)

本文主要詳細(xì)介紹了RabbitMQ集群的工作原理和如何搭建一個(gè)具備負(fù)載均衡能力的中小規(guī)模RabbitMQ集群的方法,并最后給出了RabbitMQ集群的架構(gòu)設(shè)計(jì)圖奔滑。限于筆者的才疏學(xué)淺艾岂,對(duì)本文內(nèi)容可能還有理解不到位的地方,如有闡述不合理之處還望留言一起探討朋其。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末王浴,一起剝皮案震驚了整個(gè)濱河市脆炎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌氓辣,老刑警劉巖秒裕,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異钞啸,居然都是意外死亡几蜻,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門体斩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)梭稚,“玉大人,你說(shuō)我怎么就攤上這事絮吵』】荆” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵蹬敲,是天一觀的道長(zhǎng)暇昂。 經(jīng)常有香客問我,道長(zhǎng)伴嗡,這世上最難降的妖魔是什么急波? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮瘪校,結(jié)果婚禮上幔崖,老公的妹妹穿的比我還像新娘。我一直安慰自己渣淤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布吉嫩。 她就那樣靜靜地躺著价认,像睡著了一般。 火紅的嫁衣襯著肌膚如雪自娩。 梳的紋絲不亂的頭發(fā)上用踩,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音忙迁,去河邊找鬼脐彩。 笑死,一個(gè)胖子當(dāng)著我的面吹牛姊扔,可吹牛的內(nèi)容都是我干的惠奸。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼恰梢,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼佛南!你這毒婦竟也來(lái)了梗掰?” 一聲冷哼從身側(cè)響起祭钉,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤账千,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后哄褒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绵载,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡埂陆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了娃豹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片焚虱。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖培愁,靈堂內(nèi)的尸體忽然破棺而出著摔,到底是詐尸還是另有隱情,我是刑警寧澤定续,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布谍咆,位于F島的核電站,受9級(jí)特大地震影響私股,放射性物質(zhì)發(fā)生泄漏摹察。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一倡鲸、第九天 我趴在偏房一處隱蔽的房頂上張望供嚎。 院中可真熱鬧,春花似錦峭状、人聲如沸克滴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)劝赔。三九已至,卻和暖如春胆敞,著一層夾襖步出監(jiān)牢的瞬間着帽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工移层, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留仍翰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓观话,卻偏偏與公主長(zhǎng)得像予借,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

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