RabbitMQ實(shí)戰(zhàn):性能和安全-創(chuàng)新互聯(lián)

本系列是「RabbitMQ實(shí)戰(zhàn):高效部署分布式消息隊(duì)列」書籍的總結(jié)筆記。

專業(yè)從事網(wǎng)站制作、成都網(wǎng)站制作,高端網(wǎng)站制作設(shè)計(jì),重慶小程序開發(fā),網(wǎng)站推廣的成都做網(wǎng)站的公司。優(yōu)秀技術(shù)團(tuán)隊(duì)竭力真誠服務(wù),采用H5建站+CSS3前端渲染技術(shù),響應(yīng)式網(wǎng)站,讓網(wǎng)站在手機(jī)、平板、PC、微信下都能呈現(xiàn)。建站過程建立專項(xiàng)小組,與您實(shí)時在線互動,隨時提供解決方案,暢聊想法和感受。

前兩篇介紹了RabbitMQ在可用性、監(jiān)控方面的考慮,這是基礎(chǔ)保障,因?yàn)樵谀承﹫鼍跋率遣蝗菰S丟失消息的,但它和性能往往是對立的,需要根據(jù)業(yè)務(wù)場景做取舍。

當(dāng)處理一些敏感數(shù)據(jù)時,比如銀行卡信息,需要考慮安全性問題,上一篇總結(jié)了數(shù)據(jù)傳輸安全方面的知識點(diǎn),這里就比較好理解了。

通過介紹,你會了解到:

  • 對速度的考慮
  • 對內(nèi)存和進(jìn)程的考慮
  • 對安全的考慮
對速度的考慮

有很多因素影響RabbitMQ投遞消息的速度,包括消息持久化、路由算法、綁定數(shù)目、以及消息確認(rèn)策略等,下面分別來介紹。

消息持久化

當(dāng)發(fā)布消息時,需要決定丟失其中的任何消息是否可以接受,如果可以接受,可以將delivery-model設(shè)置為1,消息就不會持久化到硬盤了。

消息確認(rèn)

當(dāng)消費(fèi)消息時,可以在隊(duì)列訂閱時,通過設(shè)定no-ack標(biāo)記加快消息投遞,如果設(shè)置為true,服務(wù)器就會在消息發(fā)送給客戶端后自動將其出隊(duì)。

這樣,處理完消息之后就無須再發(fā)送確認(rèn)消息回服務(wù)器了,能極大地加快消費(fèi)者消費(fèi)消息,但由于某些原因連接中斷了,或客戶端應(yīng)用程序發(fā)生故障了,消息就永遠(yuǎn)消息了。

路由算法和綁定規(guī)則

前面介紹了3種類型的交換器:direct、fanout、topic,每種交換器代表了服務(wù)器實(shí)現(xiàn)的特定路由算法,會根據(jù)消息的路由鍵以及隊(duì)列與交換器之間的綁定來選擇隊(duì)列。

在服務(wù)器端,交換器和綁定作為記錄條目存儲在Mnesia數(shù)據(jù)庫中,當(dāng)匹配消息路由鍵時,會嘗試查找對應(yīng)路由鍵的綁定。

fanout交換器在路由消息的時候,會忽略路由鍵,不需要進(jìn)行查找。direct只有一個綁定,也會比較快,topic存儲的路由信息比較復(fù)雜,由于路由鍵可以包含以點(diǎn)分隔的多個詞,所以匹配消息路由鍵不僅僅是簡單字符串的匹配,也會占用更多內(nèi)存。

RabbitMQ實(shí)現(xiàn)了trie樹數(shù)據(jù)結(jié)構(gòu)用來存儲綁定路由鍵模式,以支持快速查詢,關(guān)于這種數(shù)據(jù)結(jié)構(gòu),我之前沒接觸過,據(jù)說比桶狀哈希表還快,后面專門寫一篇介紹這個數(shù)據(jù)結(jié)構(gòu)吧。

投遞消息

在交換器找到消息需要路由的目的地之后,會將目的地列表返回給rabbit_router,之后會將消息的副本投遞到每一個目的地,如果發(fā)布的消息中mandatory和immediate標(biāo)記設(shè)置為false,這個過程會以異步方式執(zhí)行,從客戶端角度看,服務(wù)器會變得很快,否則會同步投遞。

當(dāng)mandatory標(biāo)志位設(shè)置為true時,如果exchange根據(jù)自身類型和消息routeKey無法找到一個符合條件的queue,那么會調(diào)用basic.return方法將消息返還給生產(chǎn)者,當(dāng)mandatory設(shè)為false時,出現(xiàn)上述情形broker會直接將消息扔掉。

當(dāng)immediate標(biāo)志位設(shè)置為true時,如果exchange在將消息route到queue(s)時發(fā)現(xiàn)對應(yīng)的queue上沒有消費(fèi)者,那么這條消息不會放入隊(duì)列中。當(dāng)與消息routeKey關(guān)聯(lián)的所有queue(一個或多個)都沒有消費(fèi)者時,該消息會通過basic.return方法返還給生產(chǎn)者。

假如找到了投遞的隊(duì)列且有消費(fèi)者準(zhǔn)備好接收消息,如果隊(duì)列為空,消息會直接發(fā)送給消費(fèi)者,不會經(jīng)過隊(duì)列這一步,會極大提升速度,所以制定容量規(guī)劃并計(jì)算消息的進(jìn)出率時,應(yīng)盡可能讓隊(duì)列保持為空,如果消費(fèi)滯后導(dǎo)致隊(duì)列填滿的化,服務(wù)器會收到內(nèi)存告警,并將消息刷出磁盤。

還有個參數(shù)要注意:auto-ack,消費(fèi)者接收到消息后,會立刻確認(rèn)消息,而不用等到邏輯處理好。

RabbitMQ實(shí)戰(zhàn):性能和安全

以上說的提高速度的方法大部分都會犧牲可用性,要根據(jù)不同的業(yè)務(wù)場景進(jìn)行平衡。

對內(nèi)存和進(jìn)程的考慮

在設(shè)計(jì)應(yīng)用程序的時候,會有兩個基本限制:選擇的技術(shù)允許做什么,以及當(dāng)前硬件設(shè)定允許做什么。上面討論了第一點(diǎn):不同消息路由和分發(fā)算法如何影響設(shè)計(jì)決策。關(guān)于第二點(diǎn),需要考慮AMQP的元素需要多少內(nèi)存,以及Erlang VM對可以創(chuàng)建的進(jìn)程總數(shù)的硬件限制。

內(nèi)存考慮

關(guān)于內(nèi)存占用,書上有詳細(xì)說明,這里只列出分析結(jié)果,供大家在預(yù)估容量時參考:(√表示哪些表會為隊(duì)列聲明添加記錄)

1.隊(duì)列元數(shù)據(jù)

RabbitMQ實(shí)戰(zhàn):性能和安全

2.交換器元數(shù)據(jù)

RabbitMQ實(shí)戰(zhàn):性能和安全

3.綁定元數(shù)據(jù)

一個持久化隊(duì)列綁定到一個瞬時交換器會導(dǎo)致在rabbit_semi_durable_router表上創(chuàng)建條目。

RabbitMQ實(shí)戰(zhàn):性能和安全

Erlang進(jìn)程計(jì)數(shù)

可以在節(jié)點(diǎn)啟動時指定Erlang節(jié)點(diǎn)上能運(yùn)行的大Erlang進(jìn)程數(shù),默認(rèn)設(shè)置是每個Erlang節(jié)點(diǎn)1048576,即2^20個。

Erlang應(yīng)用程序在整個生命周期中會多次創(chuàng)建并銷毀進(jìn)程。比如,RabbitMQ接收到AMQP客戶端的TCP連接時,會創(chuàng)建一個進(jìn)程進(jìn)行管理該連接,同時,會有很多Erlang進(jìn)程來處理消息存儲的邏輯。

主要通過以下事件來增加進(jìn)程數(shù):到服務(wù)器的新連接、創(chuàng)建新的信道以及隊(duì)列聲明。一條新的連接會創(chuàng)建四個新的進(jìn)程,一個新的通道也會創(chuàng)建四個新的進(jìn)程,隊(duì)列的開銷最小,每個隊(duì)列一個進(jìn)程。

對安全的考慮

有些消息,想以一種安全的方式進(jìn)行傳輸,可以使用SSL協(xié)議在消息通信終端傳輸數(shù)據(jù),RabbitMQ默認(rèn)支持SSL,只需要配置相應(yīng)的證書,使用openssl庫進(jìn)行設(shè)置和操作。

關(guān)于證書、openssl以及ssl,上一篇文章詳細(xì)介紹了,現(xiàn)在來看看如何使用。

服務(wù)端

只需要修改下rabbitmq的配置即可,在rabbitmq.config中添加ssl_listeners和ssl_options配置項(xiàng):

[
    {rabbit,[
        {ssl_listeners, [5671]},
        {ssl_options, [
            {cacertfile,"/path/to/rmqca/cacert.pem"},
            {certfile,"/path/to/server/cert.pem"},
            {keyfile,"/path/to/server/key.pem"},
            {verify,verify},
            {fail_if_no_peer_cert,false}
        ]}
    ]}

]

配置中指定了ca的證書,服務(wù)端的證書,以及服務(wù)端的秘鑰。

客戶端
require_once(__DIR__ . '/../amqp.inc');

define('HOST', 'localhost');
define('PORT', 5671);
define('USER', 'guest');
define('PASS', 'guest');
define('VHOST', '/');
define('AMQP_DEBUG', true);
define('CERTS_PATH',
  '/path/to/ca/folder/');

$ssl_options = array(
      'cafile' => CERTS_PATH . '/rmqca/cacert.pem',
      'local_cert' => CERTS_PATH . '/phpcert.pem',
      'verify_peer' => true
  );
$conn = new AMQPSSLConnection(HOST, PORT, USER, PASS, VHOST, $ssl_options);

function shutdown($conn){
    $conn->close();
}
register_shutdown_function('shutdown', $conn);

while(1){}

客戶端代碼指定了ca根證書和客戶端證書和秘鑰,phpcert.pem是客戶端證書、秘鑰、ca根證書的合并文件。

$ cat client/key.pem > phpcert.pem
$ cat client/cert.pem >> phpcert.pem
$ cat rmqca/cacert.pem >> phpcert.pem

下一篇會介紹下RabbitMQ的插件,以便自定義插件擴(kuò)展RabbitMQ功能。

歡迎掃描下方二維碼,關(guān)注我的個人微信公眾號,查看更多文章 ~

RabbitMQ實(shí)戰(zhàn):性能和安全

創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務(wù)器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動現(xiàn)已開啟,新人活動云服務(wù)器買多久送多久。

本文名稱:RabbitMQ實(shí)戰(zhàn):性能和安全-創(chuàng)新互聯(lián)
文章地址:http://muchs.cn/article32/djjgsc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)企業(yè)網(wǎng)站制作、網(wǎng)站排名、品牌網(wǎng)站建設(shè)域名注冊品牌網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作