java 極客_Java極客思維

xgx120413

xgx120413?

開篇介紹

大家好,公眾號【Java極客思維】近期會整理一些Java高頻面試題分享給小伙伴,也希望看到的小伙伴在找工作過程中能夠用得到!本章節主要針對Java一些消息中間件高頻面試題進行分享。

通知:公眾號【Java極客思維】正在送書福利活動,關注公眾號并參加福利活動吧!只有參與了本次活動的小伙伴才能夠參與年底的大福利,不要錯過呀~

Q1:

RabbitMQ 的介紹、用途、好處?

RabbitMQ是一款開源的,Erlang編寫的,基于AMQP協議的消息中間件。

作用:解耦?、?異步?、?削峰?。

優點:解耦、異步、削峰;

缺點:降低了系統的穩定性:系統中使用了消息隊列,如果消息隊列掛了,那么系統也會掛。降低了系統可用性。

加入消息隊列,要考慮很多方面的問題,比如:一致性問題 、如何保證消息不被重復消費 、?如何保證消息可靠性傳輸 等。因此考慮的因素有很多方面,復雜性增加。

Q2:

RabbitMQ 包括哪些要素?生產者?:消息的創建者,發送到RabbitMQ

消費者?:連接到RabbitMQ,訂閱到隊列上,消費消息,持續訂閱(basicConsumer)和單條訂閱(basicGet)

消息 :包含有效載荷和標簽,有效載荷指要傳輸的數據,標簽描述了有效載荷,并且RabbitMQ用它來決定誰獲得消息,消費者只能拿到有效載荷,并不知道生產者是誰。

Q3:

RabbitMQ 什么是信道?

信道:是生產者、消費者與RabbitMQ通信的渠道,生產者publish或是消費者subscribe一個隊列都是通過信道來通信的。信道是建立在TCP連接上的虛擬連接。就是說RabbitMQ在一條TCP上建立成百上千個信道來達到多個線程處理,這個TCP被多個線程共享,每個線程對應一個信道,信道在RabbitMQ都有一個唯一的ID,保證了信道私有性,對應上唯一的線程使用。

疑問:為什么不建立多個TCP連接?

原因是RabbitMQ需要保證性能,系統為每個線程開辟一個TCP是非常消耗性能的,美妙成百上千的建立銷毀TCP會嚴重消耗系統性能;所以RabbitMQ選擇建立多個信道(建立在TCP的虛擬連接)連接到RabbitMQ上

Q4:

RabbitMQ概念里的channel、exchange 和 queue是邏輯概念,還是對應著進程實體?作用分別是什么?

queue?具有自己的?erlang?進程;

exchange?內部實現為保存?binding?關系的查找表;

channel?是實際進行路由工作的實體,負責按照 routing_key 將 message投遞給queue。

由 AMQP 協議描述可知,channel?是真實TCP連接之上的?虛擬連接?, 所有AMQP 命令都是通過 channel 發送的,且每一個 channel 有?唯一的ID?。一個 channel 只能被單獨一個操作系統線程使用,所以投遞到特定的 channel 上的 message 是有順序的。單一個操作系統線程上允許使用多個channel。

Q5:

RabbitMQ消息是如何路由的?

消息路由必須有三部分:交換器、路由、綁定。

生產者把消息發布到交換器上,綁定決定了消息如何從路由器路由到特定的隊列;消息最終到達隊列,并被消費者接收。

消息發布到交換器時,消息將擁有一個?路由鍵(routing key)?, 在消息創建時設定。

通過隊列路由鍵,可以把隊列綁定到交換器上。

消息到達交換器后,RabbitMQ會將消息的路由鍵與隊列的路由鍵進行匹配(針對不同的交換器有不同的路由規則)。如果能夠匹配到隊列,則消息會投遞到相應隊列中;如果不能匹配到任何隊列,消息將進入"黑洞"。

常用的交換器主要分為以下三種:direct?:如果路由鍵完全匹配,消息就會被投遞到相應的隊列;每個AMQP的實現都必須有一個direct交換器,包含一個空白字符串名稱的默認交換器。聲明一個隊列時,會自動綁定到默認交換器,并且以隊列名稱作為路由鍵:channel -> basic_public($msg, '', 'queue-name')

fanout?:?如果交換器收到消息,將會廣播到所有綁定的隊列上;

topic?:可以使來自不同源頭的消息能夠到達同一個隊列。使用topic交換器時,可以使用通配符,比如:"*"?匹配特定位置的任意文本,"."?把路由鍵分為了幾個標識符,?"#"?匹配所有規則等。

特別注意:發往topic交換器的消息不能隨意的設置選擇鍵(routing_key),必須是有"."隔開的一系列的標識符組成。

Q6:

RabbitMQ消息確認過程?

消費者收到的每一條消息都必須進行確認(自動確認和自行確認)

消費者在聲明隊列時,可以置頂autoAck參數,當autoAck = false時,RabbitMQ會等待消費者顯式發送回 ack 信號后才從內存(和磁盤,如果是持久化消息的話)中刪除消息,否則RabbitMQ會在隊列中消息被消費后立即刪除它。

采用消息確認機制后,只要使 autoAck = false,消費者就有足夠的時間處理消息(任務),不用擔心處理消息過程中消費者進程掛掉后消息丟失的問題,因為RabbitMQ會一直持有消息直到消費者顯式調用basicAck為止。

當autoAck = false時,對于RabbitMQ服務器端而言,隊列中的消息分成了兩部分:一部分是等待投遞給消費者的消息;一部分是已經投遞給消費者,但是還沒有收到消費者ack信號的消息。如果服務器端一直沒有收到消費者的ack信號,并且消費此消息的消費者已經斷開連接,則服務器端會安排該消息 重新進入隊列,等待投遞給下一個消費者(也可能還是原來的那個消費者)。

RabbitMQ不會為 ack消息設置超時時間,它判斷此消息是否需要重新投遞給消費者的唯一依據是消費該消息的消費者連接是否已經斷開。這么設計的原因是RabbitMQ允許消費者消費一條消息的時間可以很久很久。

Q7:

如何保證RabbitMQ不被重復消費?

正常情況下,消費者在消費消息的時候,消費完畢后,會發送一個確認信息給消息隊列,消息隊列就知道該消息被消費了,就會將該消息從消息隊列中刪除。

但是因為網絡傳輸等故障,確認信息沒有傳送到消息隊列,導致消息隊列不知道自己已經消費過該消息了,再次將消息分發給其他的消費者。

解決思路:

保證消息的唯一性,就算是多次傳輸,不要讓消息的多次消費帶來影響;

保證消息冪等性;

比如:在寫入消息隊列的數據做唯一標識,消費消息時,根據唯一標識判斷該消息是否被消費過。

Q8:

如何保證RabbitMQ消息的可靠傳輸?

消息不可靠的情況可能是消息丟失,劫持等原因;

丟失可能又分為:生產者丟失消息

消息隊列丟失消息

消費者丟失消息

生產者丟失消息:

從生產者弄丟數據來看,RabbitMQ提供了?transaction?機制 和?confirm 模式 來確保生產者不丟失消息;transaction機制:?發送消息前,開啟事務(channel.exSelect()),然后發送消息,如果發送過程中出現異常,事務就會回滾(channel.txRollback()),如果發送成功則提交事務(channel.txCommit())。

confirm模式:一般這種模式居多,一旦channel進入confirm模式,所有在該信道上發布的消息都將會被指派一個唯一的ID(從1開始),一旦消息被投遞到所有匹配的隊列后;RabbitMQ就會發送一個ACK給生產者(包含消息的唯一ID),這就使得生產者知道消息已經正確到達目的隊列了。

如果RabbitMQ沒能處理該消息,則會發送一個Nack消息回來,這樣可以進行重試操作。

消息隊列丟失消息:

針對消息隊列丟失數據的情況,一般是開啟持久化磁盤的配置:

將隊列的持久化標識?durable?設置為?true?, 則代表是一個持久的隊列,發送消息的時候講?deliveryMode=2?這樣設置以后,即使RabbitMQ掛了,重啟后也能恢復數據。

消費者丟失消息:

消費者丟失消息一般是因為采用了自動確認消息模式,改為手動確認消息即可。

消費者在收到消息之后,處理消息之前,會自動回復RabbitMQ已收到消息;如果這時候處理消息失敗,就會丟失該消息;

解決方案:處理消息成功后,手動回復確認消息。

點關注、不迷路

如果覺得文章不錯,歡迎關注、點贊、收藏,你們的支持是我創作的動力,感謝大家。

如果文章寫的有問題,請不要吝嗇,歡迎留言指出,我會及時核查修改。

如果你還想更加深入的了解我,可以微信搜索「Java極客思維」進行關注。每天8:00準時推送技術文章,讓你的上班路不在孤獨,而且每月還有送書活動,助你提升硬實力!查看原文

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/533032.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/533032.shtml
英文地址,請注明出處:http://en.pswp.cn/news/533032.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java拼三級魔方_魔方秘籍(詳細解法)《三階》

魔方根據視頻理解:上 下 左 右先將白面變好:(1).變一個白十字(如圖所示)(2).轉好以后檢查十字的四個角的顏色(藍綠紅橙)與旁邊面上的中心塊的顏色是否相同。(有兩個相同的時,如果它們相鄰,就一個放在后面,一個放在左面…

php怎么實現點卡充值,利用自動發卡程序的點卡充值傳奇腳本

首先:自動售卡 玩家購買到卡密 在游戲輸入卡密領取元寶下面是NPC腳本:[main]!這里是點卡充值平臺!\\\ \ \\[InPutString18]#IFCHECKCODELIST ..\QuestDiary\卡號列表\5.txt#actCLEARCODELIST ..\QuestDiary\卡號列表\5.txtGAMEGOL…

php轉換ofd文件格式,一種OFD格式文檔支持腳本的方法與流程

本發明涉及電子文檔格式的處理技術,特別涉及一種OFD格式文檔支持腳本的方法。背景技術:OFD是一種版式文檔格式,全稱為開放式版式文檔(Open Fixed-layout Document),是國家版式文檔格式規范。版式文檔是電子文件應用的一個重要門類…

php成品代碼,PHP代碼

日期當日date(Y-m-d")date(Y-m-d 00:00:00)取日期:年 月 日date("Y", strtotime($startday))date("m", strtotime($startday))date("d", strtotime($startday))上月 下月$last_mont_first_date date(Y-m-01 00:00:00,strtotime…

tp框架中引入php文件,Laravel框架及ThinkPHP框架超級簡單的公共文件引入(保留變量)...

為什么要把兩個框架放在一起來說呢?額。。。因為TP5.1.x與Laravel實在是太像了,本文主要講述關于大家頂部及底部文件引入的問題。但是如果頂部和尾部只是單純的html代碼還好說,但是里面通常有變量賦值和循環遍歷以及判斷等邏輯,這樣就帶來了比…

pHp30充電寶能用快充嗎,65W快充 30分鐘充滿電 是時候淘汰充電寶了嗎?

在過去的一年里,手機快充技術有了新的突破,OPPO推出了65W快充。無獨有偶,聯想拯救者電競手機的預熱宣傳中,號稱搭載90W快充。有評測稱,使用65W快充,30分鐘可以充滿一塊4000mAh容量的電池,使用90…

php+mockjs,mockjs的常用方法分享

本文主要和大家分享mockjs的常用方法,結合文字和代碼和大家講解,希望能幫助到大家。一.mock.mock()根據數據模板生成模擬數據。更關鍵的是,我們發起Ajax請求的時候要能夠接收到這些數據。這就是Mock.mock()的作用啦!Mock.mock( ru…

php 截取音頻文件后綴名,使用PHP從音頻流中提取音軌信息

這是一個PHP功能,讓您從流媒體URL中提取MP3元數據(StreamTitle)。通常,流服務器icy-metaint在響應中放置一個標題,告訴我們在流中發送元數據的頻率。該函數檢查該響應頭,如果存在,它將用它替換interval參數。否則&…

matlab畫圓柱,Matlab 畫三維圓柱體

主要學習了畫空間圓柱體和空間長方形的繪制方法。有兩個surface property:FaceColor和EdgeColor’;先講FaceColor’,它指定了surface畫出曲面的顏色,可以是[r,g,b]的一個向量,分別表示了紅綠藍的顏色配比;也可以是inte…

matlab類間散度矩陣,協方差矩陣和散布矩陣(散度矩陣)的意義

在機器學習模式識別相關算法中,經常需要求樣本的協方差矩陣C和散布矩陣S。如在PCA主成分分析中,就需要計算樣本的散度矩陣,而有的教材資料是計算協方差矩陣。實質上協方差矩陣和散度矩陣的意義就是一樣的,散布矩陣(散度矩陣)前乘以…

把樹分成森林 matlab,20170106RF_Matlab 隨機森林指的是利用多棵樹對樣本進行訓練并預測的一種分類器,包括兩個方面:數據的隨 269萬源代碼下載- www.pudn.com...

文件名稱: 20170106RF_Matlab下載 收藏√ [5 4 3 2 1 ]開發工具: matlab文件大小: 441 KB上傳時間: 2017-01-06下載次數: 0提 供 者: yanxiu詳細說明:隨機森林指的是利用多棵樹對樣本進行訓練并預測的一種分類器,包括兩個方面:數據的隨…

inur new.php id,Cmsez(隨易)全站系統 0day

程序名稱:Cmsez Web Content Manage System v2.0.0文件:comments.php viewimg.php代碼:---------------//commentsinclude "mainfile.php";$artnew article();//設定$confirmyes;//yes:需要管理員認證后才能顯示,no:直接顯示$membe…

PHP紅黑源碼,紅黑樹的實現源碼(第二次修訂版)

/*-----------------------------------------------------------RB-Tree的插入和刪除操作的實現算法參考資料:1) <>2) http://lxr.linux.no/linux/lib/rbtree.c作者&#xff1a;http://www.cppblog.com/converse/您可以自由的傳播&#xff0c;修改這份代碼&#xff0c;轉…

python 自動點擊上傳以后上傳文件,python使用selenium模擬點擊網頁實現自動導入上傳文件功能...

一、環境準備Python版本&#xff1a;3.4編輯器&#xff1a;Pycharmexcel文件&#xff1a;導入的excel模板二、python代碼由于工作需要&#xff0c;需要每天定時導入相關excel文件進入后臺數據庫&#xff0c;由于導入的邏輯比較復雜&#xff0c;所以決定通過python模擬登陸導入網…

php繪制頻譜圖,一步一步教你實現iOS音頻頻譜動畫(二)

本文是系列文章中的第二篇&#xff0c;上篇講述了音頻播放和頻譜數據計算&#xff0c;本篇講述數據處理和動畫的繪制。前言在上篇文章中我們已經拿到了頻譜數據&#xff0c;也知道了數組每個元素表示的是振幅&#xff0c;那這些數組元素之間有什么關系呢&#xff1f;根據FFT的原…

php刪除尾部字符,php如何刪除字符串末尾字符

我們知道字符串刪除字符的方式有好幾種&#xff0c;今天就來介紹三種php刪除字符串最后一個字符的函數&#xff0c;有需要的小伙伴可以參考一下。方法一&#xff1a;substr()函數substr()函數返回字符串的一部分。語法如下&#xff1a;substr(string string, int start, int [l…

empinfo Oracle數據庫,Oracle數據庫---包

--根據員工號或員工姓名獲取員工的信息--根據員工號或員工姓名刪除員工的信息--創建包規范CREATE OR REPLACE PACKAGE overload_pkgISFUNCTION get_info(eno NUMBER) RETURN emp%ROWTYPE;FUNCTION get_info(name VARCHAR2) RETURN emp%ROWTYPE;PROCEDURE del_emp(eno NUMBER);P…

oracle查看context,oracle context(上下文)

context在計算機領域翻譯為上下文context的信息也就是當前會話中的環境變量&#xff0c;如&#xff1a;登錄的session_id&#xff0c;用戶名&#xff0c;語言等信息查看context中的屬性信息。oracle默認的為我們創建了一個context叫userenv(user environment)SYS_CONTEXT(USERE…

oracle標量子查詢的優勢,標量子查詢

--標量子查詢select e.empno, e.ename, e.sal, e.deptno,(select d.dname from dept d where e.deptno d.deptno)as dnamefrom emp e--插入一條數據insert into emp(empno,deptno) values(9999,null)--返回結果15條記錄--改成left join(hash outer)select e.empno, e.ename, e…

切割照片php上傳,php下ajax的文件切割上傳

var myForm document.getElementById("myForm");var upfile document.getElementById("upfile");myForm.onsubmit function() {//獲取文件對象var file upfile.files[0];//獲取文件大小var fileSize file.size;//一次截取的大小(字節)var CutSize 10…