日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

一篇小文带你走进RabbitMQ的世界

發(fā)布時(shí)間:2024/8/23 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一篇小文带你走进RabbitMQ的世界 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

云棲號(hào)資訊:【點(diǎn)擊查看更多行業(yè)資訊】
在這里您可以找到不同行業(yè)的第一手的上云資訊,還在等什么,快來(lái)!


說(shuō)到消息中間件,大部分人的第一印象可能是Kafka。畢竟Kafka自問(wèn)世以來(lái),就頂著高并發(fā),大流量的光環(huán)。當(dāng)然了Kafka也不負(fù)眾望,在大數(shù)據(jù)處理方面一直獨(dú)領(lǐng)風(fēng)騷。

這里想說(shuō)說(shuō)另一款同樣優(yōu)秀的消息中間件RabbitMQ。

選RabbitMQ還是Kafka

如果單機(jī)數(shù)據(jù)量沒(méi)有到十萬(wàn)級(jí)以上,我覺(jué)得選哪個(gè)都OK,如果超過(guò)百萬(wàn)甚至到了千萬(wàn)級(jí)那么建議選擇Kafka。

對(duì)了還有重要的一點(diǎn),RabbitMQ支持事務(wù),而Kafka不支持。所以如果你的業(yè)務(wù)系統(tǒng)要求支持事務(wù),那么只能選RabbitMQ。這也是很多金融系統(tǒng)選擇RabbitMQ作為消息中間件的原因。

RabbitMQ基本概念

先來(lái)說(shuō)一下消息中間件的通用模型,所有的消息中間件的模型基本都是這樣。

?

而RabbitMQ是基于AMQP協(xié)議實(shí)現(xiàn)的。模型大概是這個(gè)樣子,如下圖所示

?

重點(diǎn)關(guān)注中間兩個(gè)框框,下面依次解讀一下。

信道

建立TCP鏈接是一件很費(fèi)時(shí)的事情,所以很多提供高并發(fā)服務(wù)的軟件都支持TCP鏈接復(fù)用,比如HTTP協(xié)議的KeepAlive就是為了復(fù)用TCP鏈接準(zhǔn)備的。所以RabbitMQ提出了信道的概念,一個(gè)TCP鏈接里面可以支持多個(gè)信道同時(shí)通信,以提高通信效率。如下圖所示。

?

broker

一個(gè)啟動(dòng)的RabbitMQ實(shí)例,代表一個(gè)broker。

虛擬主機(jī)

虛擬主機(jī)可以理解成命名空間的概念,方便隊(duì)列管理。

交換器

向RabbitMQ發(fā)送消息時(shí),先把消息先發(fā)到交換器,再由交換器根據(jù)相關(guān)路由規(guī)則發(fā)到特定隊(duì)列上。目前 RabbitMQ的交換器共四種類(lèi)型:direct、fanout、topic、headers。

headers交換器:?匹配消息的header而不是路由鍵,除此之外headers交換器和direct交換器完全一致,但性能差很多,所以目前幾乎不用。

direct交換器:?消息中的路由鍵(routing key)如果和Binding(綁定的概念后面會(huì)介紹)中的 binding key 一致, 交換器就將消息發(fā)到對(duì)應(yīng)的隊(duì)列中。direct模式是完全匹配的單播模式,也就是說(shuō)路由鍵與隊(duì)列名完全匹配,如果一個(gè)隊(duì)列綁定到交換機(jī)要求路由鍵為“dog”,則只轉(zhuǎn)發(fā) routing key 標(biāo)記為“dog”的消息,不會(huì)轉(zhuǎn)發(fā)“dog.puppy”的消息。如下圖所示。

?

fanout交換器:每個(gè)發(fā)送到fanout交換器中的消息,不會(huì)去匹配路由鍵,而是直接把消息投遞到所有綁定到fanout交換器上的隊(duì)列中。類(lèi)似一個(gè)廣播站,會(huì)向所有收聽(tīng)廣播的用戶發(fā)送消息。對(duì)應(yīng)到實(shí)際應(yīng)用中,它允許你針對(duì)一個(gè)消息作不同操作,比如用戶上傳了一張新的圖片,系統(tǒng)要同時(shí)對(duì)這個(gè)事件進(jìn)行不同的操作,比如刪除舊的圖片緩存、增加積分獎(jiǎng)勵(lì)等等。這樣就大大降低了系統(tǒng)之間的耦合度了。
如下圖所示。

?

topic交換器:topic交換器和direct交換器有相似之處,它通過(guò)模式匹配的方式分發(fā)消息,將路由鍵和某個(gè)模式進(jìn)行匹配,此時(shí)隊(duì)列需要綁定到一個(gè)模式上。它將路由鍵和綁定鍵的字符串切分成單詞,這些單詞之間用點(diǎn)隔開(kāi)。它同樣也會(huì)識(shí)別兩個(gè)通配符:符號(hào)#和符號(hào)。#匹配0個(gè)或多個(gè)單詞,匹配至少一個(gè)單詞。如下圖所示。

?

綁定

將消息隊(duì)列和交換器進(jìn)行關(guān)聯(lián)。一個(gè)綁定就是基于路由鍵將交換器和消息隊(duì)列連接起來(lái)的路由規(guī)則,所以可以將交換器理解成一個(gè)由綁定構(gòu)成的路由表,如下圖所示:

?

集群及高可用

因?yàn)镽abbitMQ是Erlang開(kāi)發(fā)的,所以天生支持分布式。所謂的天生支持的意思就是不用像Kafka那樣借助ZK來(lái)實(shí)現(xiàn)集群。

先來(lái)看一下典型的RabbitMQ集群架構(gòu)圖。

?

集群分為普通模式和鏡像模式。另外RabbitMQ集群分為內(nèi)存節(jié)點(diǎn)和磁盤(pán)節(jié)點(diǎn),集群當(dāng)中必須存在磁盤(pán)節(jié)點(diǎn)。內(nèi)存節(jié)點(diǎn)就是將數(shù)據(jù)存儲(chǔ)到內(nèi)存中,讀寫(xiě)效率會(huì)比較高;而磁盤(pán)節(jié)點(diǎn)是將數(shù)據(jù)存儲(chǔ)到磁盤(pán)上面,可以持久化保存數(shù)據(jù)。

普通模式:默認(rèn)的集群模式。所謂的普通模式就是,多臺(tái)機(jī)器上啟動(dòng)多個(gè)Rabbitmq實(shí)例,每臺(tái)機(jī)器啟動(dòng)一個(gè)實(shí)例。但是創(chuàng)建的queue,只會(huì)放在一個(gè)Rabbtimq實(shí)例上,每個(gè)實(shí)例都會(huì)同步queue的元數(shù)據(jù)。消費(fèi)的時(shí)候,如果連接到了另外一個(gè)實(shí)例,那么那個(gè)實(shí)例會(huì)從queue所在實(shí)例上拉取數(shù)據(jù)過(guò)來(lái)。如果存放queue的節(jié)點(diǎn)掛掉,那么就不能提供服務(wù)了。所以這種方式并不是真正的高可用。

鏡像模式:創(chuàng)建的queue,無(wú)論元數(shù)據(jù)還是消息都會(huì)存在于多個(gè)實(shí)例上,每次寫(xiě)消息到queue的時(shí)候,都會(huì)自動(dòng)把消息同步到多個(gè)實(shí)例的queue里。任何一個(gè)節(jié)點(diǎn)掛掉后,其他節(jié)點(diǎn)可以繼續(xù)提供服務(wù)。類(lèi)似于Redis集群的哨兵模式。關(guān)于Redis的高可用部署方式,可以看我這篇文章。

元數(shù)據(jù):

元數(shù)據(jù)主要包含四類(lèi),分別是

  • 隊(duì)列元數(shù)據(jù):隊(duì)列名稱(chēng)及屬性;
  • 交換器元數(shù)據(jù):交換器名稱(chēng)、類(lèi)型及屬性
  • 綁定元數(shù)據(jù):記錄了如何將消息路由到隊(duì)列的數(shù)據(jù);
  • vhost元數(shù)據(jù):為隊(duì)列、交換器和綁定提供命名空間和安全屬性的數(shù)據(jù);

運(yùn)維常用管理命令

啟動(dòng)
/sbin/rabbitmq-server

重啟
/sbin/rabbitmqctl reset

停止
/sbin/rabbitmqctl stop

停止應(yīng)用
/sbin//rabbitmqctl stop_app

查看RabbitMQ狀態(tài)
/sbin/rabbitmqctl status

查看綁定
/sbin/rabbitmqctl list_bindings

查看交換器
/sbin/rabbitmqctl list_exchanges

查看已聲明的隊(duì)列
/sbin/rabbitmqctl list_queues

stop和stop_app 的區(qū)別

這里需要特別注意一下這兩個(gè)命令的區(qū)別:由于 RabbitmMQ是用Erlang寫(xiě)的,Erlang有節(jié)點(diǎn)的概念,也就是在一個(gè)Erlang節(jié)點(diǎn)上,可以運(yùn)行很多個(gè)Erlang應(yīng)用,stop命令是使得整個(gè)Erlang節(jié)點(diǎn)停止工作,而stop_app則是使得當(dāng)前應(yīng)用停止工作,不會(huì)影響其它應(yīng)用的正常運(yùn)行。

總結(jié)

如果之前一直接觸的Java開(kāi)發(fā)的中間件,突然接觸RabbitMQ,會(huì)有些許不適應(yīng)。特別是對(duì)于RabbitMQ的集群部署及高可用的理解。不過(guò)了解之后會(huì)發(fā)現(xiàn)這只兔子還是很可愛(ài)的。畢竟存在就有存在的道理。

【云棲號(hào)在線課堂】每天都有產(chǎn)品技術(shù)專(zhuān)家分享!
課程地址:https://yqh.aliyun.com/live

立即加入社群,與專(zhuān)家面對(duì)面,及時(shí)了解課程最新動(dòng)態(tài)!
【云棲號(hào)在線課堂 社群】https://c.tb.cn/F3.Z8gvnK

原文發(fā)布時(shí)間:2020-07-17
本文作者:花括號(hào)MC
本文來(lái)自:“掘金”,了解相關(guān)信息可以關(guān)注“掘金”

原文鏈接

本文為云棲社區(qū)原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。

總結(jié)

以上是生活随笔為你收集整理的一篇小文带你走进RabbitMQ的世界的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。