偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

面試必問 | 如何設(shè)計一款高并發(fā)的消息中間件?

開發(fā) 架構(gòu)
很多小伙伴去大廠面試,幾乎都會遇到一些開放式的題目,這些開放式的題目沒有固定的答案,但是它能夠?qū)崒嵲谠诘捏w現(xiàn)面試者較為真實的系統(tǒng)設(shè)計能力和技術(shù)功底。

[[440710]]

大家好,我是冰河~~

很多小伙伴去大廠面試,幾乎都會遇到一些開放式的題目,這些開放式的題目沒有固定的答案,但是它能夠?qū)崒嵲谠诘捏w現(xiàn)面試者較為真實的系統(tǒng)設(shè)計能力和技術(shù)功底。如果你回答的比較完美,那么,通過這種開放式題目,就能夠讓你從眾多的面試者中脫穎而出。

今天,我們就一起來聊聊,去大廠面試時,一個較為常見的開放式題目:如果讓你設(shè)計一個高并發(fā)的消息中間件,你會怎么做?

消息中間件涉及的知識點

要想設(shè)計一個具有高并發(fā)的消息中間件,那么首先就要了解下消息中間件涉及哪些具體的知識點。通常,設(shè)計一個良好的消息中間件最少需要滿足如下條件:

  • 生產(chǎn)者、消費者模型。
  • 支持分布式架構(gòu)。
  • 數(shù)據(jù)的高可用。
  • 消息數(shù)據(jù)不丟失。

接下來,我們就針對消息中間件來分別談?wù)勥@些技術(shù)點。

生產(chǎn)者消費者模型

相信很多小伙伴對于生產(chǎn)者和消費者模型都比較了解了,簡單的說:就是消息中間件能夠使其他應(yīng)用來生產(chǎn)消息,也能夠使其他應(yīng)用來消費相應(yīng)的消息。

對于生產(chǎn)者和消費者模型,我們需要考慮的問題點就比較多了。接下來,我就一步步來引導(dǎo)大家進(jìn)行思考。

首先,我們來思考這樣一個問題:如果生產(chǎn)者生產(chǎn)了消息,那么消息中間件應(yīng)該怎樣存儲相應(yīng)的數(shù)據(jù)呢?存儲在內(nèi)存? 存儲在磁盤?還是同時存儲在內(nèi)存和磁盤中呢?

如果是將消息數(shù)據(jù)同時存儲在內(nèi)存和磁盤中,我們又該如何處理這些數(shù)據(jù)呢?是生產(chǎn)者將消息投遞到消息中間件之后,我們就立刻將數(shù)據(jù)寫入磁盤?還是說數(shù)據(jù)先駐留到內(nèi)存,然后每隔一段時間刷到磁盤上?

如果是每隔一段時間刷到磁盤上,那我們又要考慮磁盤文件的切分問題,也就是說,需要將消息數(shù)據(jù)分成多少個磁盤文件?(總不能把所有的數(shù)據(jù)放到一個磁盤文件中吧)。如果是需要切分成多個磁盤文件,那切分的規(guī)則又是什么呢?

上面這些問題都是我們在設(shè)計一個消息中間件時需要考慮的問題。然而,這還只是一小部分問題。如果想在面試時脫穎而出,那就還需要繼續(xù)往下看,還有一些重要的問題點需要注意。

如果文件按照一定的規(guī)則切分到多個磁盤文件中了,那是不是還需要管理元數(shù)據(jù)來標(biāo)識數(shù)據(jù)的具體消息(就像是Hadoop中的NameNode節(jié)點中存儲著DataNode的元數(shù)據(jù)信息,NameNode節(jié)點通過這些元數(shù)據(jù)信息就能夠更好的管理DataNode節(jié)點)?

這些元數(shù)據(jù)可以包括:消息數(shù)據(jù)的偏移量、也可以是消息數(shù)據(jù)的唯一ID。

考慮完數(shù)據(jù)的存儲問題,我們還需要考慮的是:消息中間件是如何將數(shù)據(jù)投遞到對應(yīng)的消費者的?

在設(shè)計生產(chǎn)者和消費者時,還一個很重要的問題需要我們考慮:我們在設(shè)計消息中間件時,采用的消費模式是什么?會不會將數(shù)據(jù)均勻的分配給消費者?還是會通過一些其他的規(guī)則將數(shù)據(jù)投遞到消費者?

支持分布式架構(gòu)

如果我們設(shè)計的消息中間件,每天會承載TB級別的數(shù)據(jù)高并發(fā)和高吞吐量的寫入操作。這里,我們就需要考慮將消息中間件設(shè)計成分布式架構(gòu)。

在設(shè)計分布式架構(gòu)時,我們還需要考慮將存儲的比較大的數(shù)據(jù),做成分片存儲,對數(shù)據(jù)進(jìn)行分片等操作。

除了這些,我們還需要考慮另外一個核心問題:對于消息中間件來說,需要支持自動擴容操作。

還有就是是否支持?jǐn)?shù)據(jù)分片,如何實現(xiàn)數(shù)據(jù)分片的擴容和自動數(shù)據(jù)負(fù)載均衡遷移等。

數(shù)據(jù)的高可用

一般互聯(lián)網(wǎng)應(yīng)用的高可用,是通過本地堆內(nèi)存,分布式緩存,和一份數(shù)據(jù)在不同的服務(wù)器上都搞一個副本來實現(xiàn)的。此時,任何一個存儲節(jié)點宕機,都不會影響整體的高可用。我們在設(shè)計消息中間件時也可以參考這個思路。

消息數(shù)據(jù)不丟失

此時,我們就需要提供手動ACK的機制,也就是說:當(dāng)消費者真正消費消息完畢后,向消息中間件返回“ 處理完成” 的標(biāo)識,消息中間件刪除相應(yīng)的已處理的消息。

但是,細(xì)化的話,這里,我們就需要兩套ACK機制:

一種ACK對應(yīng)的是生產(chǎn)端。如果一直沒有接收到ACK消息,則需要通過生產(chǎn)者來重新發(fā)送一條消息來保證生產(chǎn)消息成功。

另一種ACK對應(yīng)的是消費端。一旦一條消息消費并處理成功,必須返回一個ack給消息中間件,然后消息中間件才能刪除這條消息。否則一旦消費者宕機,就必須重發(fā)這條消息給其他的消費者實例,保證消息一定會被處理成功。 

今天,我們沒有聊具體的業(yè)務(wù)點,而是從整體上考慮:如果實現(xiàn)一個消息中間件,需要我們注意的各項知識點和專業(yè)技能!

 

 

責(zé)任編輯:武曉燕 來源: 冰河技術(shù)
相關(guān)推薦

2022-09-21 16:09:28

消息中間件

2021-01-14 05:23:32

高并發(fā)消息中間件

2022-09-03 18:00:05

消息中間件MQ

2019-01-29 11:02:30

消息中間件Java互聯(lián)網(wǎng)

2023-10-24 07:50:18

消息中間件MQ

2023-06-29 10:10:06

Rocket MQ消息中間件

2021-05-20 11:45:16

數(shù)據(jù)庫中間件架構(gòu)

2021-06-15 10:01:02

應(yīng)用系統(tǒng)軟件

2021-12-14 10:39:12

中間件ActiveMQRabbitMQ

2022-11-02 10:08:46

分布式高并發(fā)消息中間件

2015-08-11 11:16:36

淘寶中間件

2021-04-22 10:45:28

高并發(fā)架構(gòu)BAT

2020-11-13 07:14:55

Kafka消息中間件

2019-11-12 08:40:03

RocketMQ架構(gòu)

2019-12-13 10:32:56

開源消息中間件

2023-05-08 08:09:26

路由元信息謂詞

2020-03-12 09:34:05

Redis數(shù)據(jù)技術(shù)

2022-08-09 08:31:29

RocketMQ消息中間件

2019-09-11 09:00:19

消息中間件選型

2020-10-10 08:04:09

RabbitMQ消息中間件
點贊
收藏

51CTO技術(shù)棧公眾號