大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

面試題首頁 > Java中間件面試題

RabbitMQ面試題

001RabbitMQ的AMQP是什么?

RabbitMQ就是 AMQP 協(xié)議的 Erlang 的實(shí)現(xiàn)(當(dāng)然 RabbitMQ 還支持 STOMP2、 MQTT3 等協(xié)議 ) AMQP 的模型架構(gòu) 和 RabbitMQ 的模型架構(gòu)是一樣的,生產(chǎn)者將消息發(fā)送給交換器,交換器和隊(duì)列綁定 。RabbitMQ 中的交換器、交換器類型、隊(duì)列、綁定、路由鍵等都是遵循的 AMQP 協(xié)議中相應(yīng)的概念。

002什么是RabbitMQ?

采用AMQP高級(jí)消息隊(duì)列協(xié)議的一種消息隊(duì)列技術(shù),最大的特點(diǎn)就是消費(fèi)并不需要確保提供方存在,實(shí)現(xiàn)了服務(wù)之間的高度解耦。

003為什么要使用RabbitMQ?

1.在分布式系統(tǒng)下具備異步,削峰,負(fù)載均衡等一系列高級(jí)功能;
2.擁有持久化的機(jī)制,進(jìn)程消息,隊(duì)列中的信息也可以保存下來。
3.實(shí)現(xiàn)消費(fèi)者和生產(chǎn)者之間的解耦。
4.對于高并發(fā)場景下,利用消息隊(duì)列可以使得同步訪問變?yōu)榇性L問達(dá)到一定量的限,利于數(shù)據(jù)庫的操作。
5.可以使用消息隊(duì)列達(dá)到異步下單的效果,排隊(duì)中,后臺(tái)進(jìn)行邏輯下單。

004RabbitMQ的使用場景。

1.服務(wù)間異步通信
2.順序消費(fèi)
3.定時(shí)任務(wù)
4.請求削峰

005RabbitMQ基本概念。

Broker:簡單來說就是消息隊(duì)列服務(wù)器實(shí)體
Exchange:消息交換機(jī),它指定消息按什么規(guī)則,路由到哪個(gè)隊(duì)列
Queue:消息隊(duì)列載體,每個(gè)消息都會(huì)被投入到一個(gè)或多個(gè)隊(duì)列
Binding:綁定,它的作用就是把exchange和queue按照路由規(guī)則綁定起來
Routing Key: 路由關(guān)鍵字,exchange根據(jù)這個(gè)關(guān)鍵字進(jìn)行消息投遞
VHost:vhost可以理解為虛擬broker ,即mini-RabbitMQ server。其內(nèi)部均含有獨(dú)立的queue、exchange和binding等,但最最重要的是,其擁有獨(dú)立的權(quán)限系統(tǒng),可以做到vhost范圍的用戶控制。當(dāng)然,從RabbitMQ的全局角度,vhost可以作為不同權(quán)限隔離的手段(一個(gè)典型的例子就是不同的應(yīng)用可以跑在不同的 vhost 中)。
Producer: 消息生產(chǎn)者,就是投遞消息的程序
Consumer:消息消費(fèi)者,就是接受消息的程序
Channel:消息通道,在客戶端的每個(gè)連接里,可建立多個(gè)channel,每個(gè)channel代表一個(gè)會(huì)話任務(wù)由Exchange、Queue、RoutingKey三個(gè)才能決定一個(gè)從Exchange到Queue的唯一的線路。

006RabbitMQ如何確保消息正確發(fā)送?

消息的發(fā)送方有個(gè)確認(rèn)模式,具體的流程如下:
1.將信道設(shè)置成confirm模式(發(fā)送方確認(rèn)模式),則所有在信道上發(fā)布的消息都會(huì)被指派一個(gè)唯一的ID。
2.一旦消息被投遞到目的隊(duì)列后,或者消息被寫入磁盤后(可持久化的消息),信道會(huì)發(fā)送一個(gè)確認(rèn)給生產(chǎn)者(包含消息唯一 ID)。
3.如果 RabbitMQ發(fā)生內(nèi)部錯(cuò)誤從而導(dǎo)致消息丟失,會(huì)發(fā)送一條nack(notacknowledged,未確認(rèn))消息。發(fā)送方確認(rèn)模式是異步的,生產(chǎn)者應(yīng)用程序在等待確認(rèn)的同時(shí),可以繼續(xù)發(fā)送消息。當(dāng)確認(rèn)消息到達(dá)生產(chǎn)者應(yīng)用程序,生產(chǎn)者應(yīng)用程序的回調(diào)方法就會(huì)被觸發(fā)來處理確認(rèn)消息。

007RabbitMQ如何確保消息接收方消費(fèi)了消息?

消息的接收方消息確認(rèn)機(jī)制,具體的流程如下:
消費(fèi)者接收每一條消息后都必須進(jìn)行確認(rèn)(消息接收和消息確認(rèn)是兩個(gè)不同操作)。只有消費(fèi)者確認(rèn)了消息,RabbitMQ才能安全地把消息從隊(duì)列中刪除。這里并沒有用到超時(shí)機(jī)制,RabbitMQ僅通過Consumer的連接中斷來確認(rèn)是否需要重新發(fā)送消息。也就是說,只要連接不中斷,RabbitMQ給了Consumer足夠長的時(shí)間來處理消息。保證數(shù)據(jù)的最終一致性;

008RabbitMQ中消息的重復(fù)發(fā)送是如何產(chǎn)生的?

如果消費(fèi)者接收到消息,在確認(rèn)之前斷開了連接或取消訂閱,RabbitMQ會(huì)認(rèn)為消息沒有被分發(fā),然后重新分發(fā)給下一個(gè)訂閱的消費(fèi)者。

009RabbitMQ如何避免消息重復(fù)投遞或重復(fù)消費(fèi)?

在消息生產(chǎn)時(shí),RabbitMQ內(nèi)部針對每條生產(chǎn)者發(fā)送的消息生成一個(gè)inner-msg-id,作為去重的依據(jù)(消息投遞失敗并重傳),避免重復(fù)的消息進(jìn)入隊(duì)列;
在消息消費(fèi)時(shí),要求消息體中必須要有一個(gè) bizId(對于同一業(yè)務(wù)全局唯一,如支付ID、訂單ID、帖子ID 等)作為去重的依據(jù),避免同一條消息被重復(fù)消費(fèi)。

010RabbitMQ如何確保消息不丟失?

消息不丟失需要堆消息進(jìn)行持久化。
確保持久性消息能從服務(wù)器重啟中恢復(fù)的方式是,將它們寫入磁盤上的一個(gè)持久化日志文件,當(dāng)發(fā)布一條持久性消息到持久交換器上時(shí),Rabbit會(huì)在消息提交到日志文件后才發(fā)送響應(yīng)。一旦消費(fèi)者從持久隊(duì)列中消費(fèi)了一條持久化消息,RabbitMQ會(huì)在持久化日志中把這條消息標(biāo)記為等待垃圾收集。如果持久化消息在被消費(fèi)之前RabbitMQ重啟,那么Rabbit會(huì)自動(dòng)重建交換器和隊(duì)列(以及綁定),并重新發(fā)布持久化日志文件中的消息到合適的隊(duì)列。

011RabbitMQ中的消息基于什么傳輸?

由于TCP連接的創(chuàng)建和銷毀開銷較大,且并發(fā)數(shù)受系統(tǒng)資源限制,會(huì)造成性能瓶頸。RabbitMQ使用信道的方式來傳輸數(shù)據(jù)。信道是建立在真實(shí)的TCP連接內(nèi)的虛擬連接,且每條TCP連接上的信道數(shù)量沒有限制。

012RabbitMQ中消息如何分發(fā)?

若該隊(duì)列至少有一個(gè)消費(fèi)者訂閱,消息將以循環(huán)(round-robin)的方式發(fā)送給消費(fèi)者。每條消息只會(huì)分發(fā)給一個(gè)訂閱的消費(fèi)者(前提是消費(fèi)者能夠正常處理消息并進(jìn)行確認(rèn))。

013RabbitMQ中常用的交換器有哪幾種?

主要有3種:
1.fanout:如果交換器收到消息,將會(huì)廣播到所有綁定的隊(duì)列上
2.direct:如果路由鍵完全匹配,消息就被投遞到相應(yīng)的隊(duì)列
3.topic:可以使來自不同源頭的消息能夠到達(dá)同一個(gè)隊(duì)列。 使用topic交換器時(shí),可以使用通配符

014RabbitMQ的工作模式。

1.簡單模式,用的默認(rèn)交換機(jī),1個(gè)生產(chǎn)者,1個(gè)消費(fèi)者,一個(gè)消息只能被一個(gè)消費(fèi)者消息
2.工作模,多個(gè)消費(fèi)者監(jiān)聽同一個(gè)隊(duì)列,如果任務(wù)數(shù)據(jù)比較多,可以多幾個(gè)消費(fèi)者,可以加快消費(fèi)的速度
3.訂閱發(fā)布模式,引入了交換機(jī)的類型fanout,廣播模式 ,每個(gè)消費(fèi)者單獨(dú)監(jiān)聽自己的對列都可以取消費(fèi)自己隊(duì)列的消息。
4.routing,是direct的的交換機(jī)類型,指定路由
5.topic,是topic的交換機(jī)類型,比路由多了通配符的更加的靈活

015RabbitMQ是如何實(shí)現(xiàn)消息路由的?

完成RabbitMQ消息路由的核心組件是 Exchange。而消息的路由是由Exchange類型 和 Binding 來決定的。Binding 表示建立 Queue 和 Exchange 之間的綁定關(guān)系,每一個(gè)綁定關(guān)系會(huì)存在一個(gè) BindingKey。通過這種方式相當(dāng)于在 Exchange 中建立了一個(gè)路由關(guān)系表。生產(chǎn)者發(fā)送消息的時(shí)候,需要聲明一個(gè) RoutingKey(路由鍵),Exchange 拿到RoutingKey 之后,根據(jù) RoutingKey 和路由表里面的 BindingKey 進(jìn)行匹配,而匹配的規(guī)則是通過 Exchange類型來決定的。在 RabbitMQ 中,默認(rèn)有四種類型的 Exchange:Direct ,F(xiàn)anout、Topic和Header。
Direct,叫直連,也就是完整匹配方式,需要Routing Key 和 Binding Key 完全一致,相當(dāng)于點(diǎn)對點(diǎn)的發(fā)送。
Topic: 叫主題,這種方式是通過設(shè)置通配符來動(dòng)態(tài)匹配,相當(dāng)于正則。就是用Routing Key 去匹配Binging Key。BingingKey支持兩個(gè)通配符。
Fanout:叫廣播,這種方式不需要設(shè)置Routing Key,而是把消息廣播給綁定到當(dāng)前 Exchange 上的所有隊(duì)列上。

016如何保證RabbitMQ消息的順序性?

1)拆分多個(gè)queue(消息隊(duì)列),每個(gè)queue(消息隊(duì)列) 一個(gè)consumer(消費(fèi)者),就是多一些queue(消息隊(duì)列)而已,這種方式會(huì)比較麻煩;
2)一個(gè)queue (消息隊(duì)列)但是對應(yīng)一個(gè)consumer(消費(fèi)者),然后這個(gè)consumer(消費(fèi)者)內(nèi)部用內(nèi)存隊(duì)列做排隊(duì),然后分發(fā)給底層不同的worker來處理。

017為什么不應(yīng)該對所有的message都使用持久化機(jī)制?

首先,必然導(dǎo)致性能的下降,因?yàn)閷懘疟P比寫RAM慢的多,message的吞吐量可能有10倍的差距。
其次,message的持久化機(jī)制用在RabbitMQ的內(nèi)置cluster方案時(shí)會(huì)出現(xiàn)“坑爹”問題。矛盾點(diǎn)在于,若message設(shè)置了persistent屬性,但queue未設(shè)置durable屬性,那么當(dāng)該queue的owner node出現(xiàn)異常后,在未重建該queue前,發(fā)往該queue 的message將被 blackholed;若 message 設(shè)置了 persistent屬性,同時(shí)queue也設(shè)置了durable屬性,那么當(dāng)queue的owner node異常且無法重啟的情況下,則該queue無法在其他node上重建,只能等待其owner node重啟后,才能恢復(fù)該 queue的使用,而在這段時(shí)間內(nèi)發(fā)送給該queue的message將被 blackholed 。
所以,是否要對message進(jìn)行持久化,需要綜合考慮性能需要,以及可能遇到的問題。若想達(dá)到100,000 條/秒以上的消息吞吐量(單RabbitMQ服務(wù)器),則要么使用其他的方式來確保message的可靠delivery ,要么使用非常快速的存儲(chǔ)系統(tǒng)以支持全持久化(例如使用SSD)。
另外一種處理原則是:僅對關(guān)鍵消息作持久化處理(根據(jù)業(yè)務(wù)重要程度),且應(yīng)該保證關(guān)鍵消息的量不會(huì)導(dǎo)致性能瓶頸。

018RabbitMQ如何保證高可用的?

RabbitMQ有三種模式:單機(jī)模式、普通集群模式、鏡像集群模式。
單機(jī)模式就是Demo級(jí)別的,一般就是你本地啟動(dòng)了玩玩兒的?,沒人生產(chǎn)用單機(jī)模式
普通集群模式就是在多臺(tái)機(jī)器上啟動(dòng)多個(gè)RabbitMQ實(shí)例,每個(gè)機(jī)器啟動(dòng)一個(gè)。你創(chuàng)建的queue,只會(huì)放在一個(gè)RabbitMQ實(shí)例上,但是每個(gè)實(shí)例都同步queue的元數(shù)據(jù)。你消費(fèi)的時(shí)候,實(shí)際上如果連接到了另外一個(gè)實(shí)例,那么那個(gè)實(shí)例會(huì)從queue所在實(shí)例上拉取數(shù)據(jù)過來。這方案主要是提高吞吐量的,就是說讓集群中多個(gè)節(jié)點(diǎn)來服務(wù)某個(gè)queue的讀寫操作。
鏡像集群模式才是所謂的RabbitMQ的高可用模式。這種模式下,每個(gè)RabbitMQ節(jié)點(diǎn)都有這個(gè)queue的一個(gè)完整鏡像,包含queue的全部數(shù)據(jù)的意思。然后每次你寫消息到queue的時(shí)候,都會(huì)自動(dòng)把消息同步到多個(gè)實(shí)例的queue上。RabbitMQ有很好的管理控制臺(tái),就是在后臺(tái)新增一個(gè)策略,這個(gè)策略是鏡像集群模式的策略,指定的時(shí)候是可以要求數(shù)據(jù)同步到所有節(jié)點(diǎn)的,也可以要求同步到指定數(shù)量的節(jié)點(diǎn),再次創(chuàng)建queue的時(shí)候,應(yīng)用這個(gè)策略,就會(huì)自動(dòng)將數(shù)據(jù)同步到其他的節(jié)點(diǎn)上去了。這樣的好處在于,你任何一個(gè)機(jī)器宕機(jī)了,沒事兒,其它機(jī)器(節(jié)點(diǎn))還包含了這個(gè)queue的完整數(shù)據(jù),別的consumer都可以到其它節(jié)點(diǎn)上去消費(fèi)數(shù)據(jù)。壞處在于,第一,這個(gè)性能開銷也太大了吧,消息需要同步到所有機(jī)器上,導(dǎo)致網(wǎng)絡(luò)帶寬壓力和消耗很重!RabbitMQ一個(gè)queue的數(shù)據(jù)都是放在一個(gè)節(jié)點(diǎn)里的,鏡像集群下,也是每個(gè)節(jié)點(diǎn)都放這個(gè)queue的完整數(shù)據(jù)。

目錄

返回頂部
主站蜘蛛池模板: 国产成人免费不卡在线观看 | 国产热re99久久6国产精品 | 曰批免费视频播放在线看片二 | 久久国产美女 | 九九精品久久久久久久久 | 丁香狠狠色婷婷久久综合 | 欧美人与性动交α欧美精品图片 | 综合色综合 | 亚洲人成毛片线播放 | 久久五月天综合 | 久九色 | 精品国产夜色在线 | 一级毛片全部免费播放 | 亚洲高清资源在线观看 | 久久福利 | 久久乱码精品区中文字幕 | 久久久久久久久久免免费精品 | 久久久久亚洲精品影视 | 国产亚洲精品久久久久久久软件 | 四虎 2022 永久网站 | 中文字幕曰韩一区二区不卡 | 成人在线激情视频 | 久久精品久久精品久久精品 | 日日私人影院 | 亚洲国产美女视频 | 欧美不卡视频在线 | 老太太毛片 | 九九伦理 | 精品成人一区二区三区免费视频 | 亚洲国产精品网 | 操美女的视频网站 | 黑人超长巨大xxxxxxx视频 | 五月婷婷视频在线 | 精品国产一区二区三区2021 | 99精品国产高清一区二区麻豆 | 久久精品国产2020 | 在线欧美v日韩v国产精品v | 久久久久免费观看 | 欧美日韩一区二区在线观看视频 | 久久久久激情免费观看 | 国产精品中文 |