成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

RocketMQ 為什么性能不如 Kafka?

云計(jì)算 Kafka
我們知道,消息隊(duì)列的消息為了防止進(jìn)程崩潰后丟失,一般不會(huì)放內(nèi)存里,而是放磁盤上。那么問(wèn)題就來(lái)了,消息從消息隊(duì)列的磁盤,發(fā)送到消費(fèi)者,過(guò)程是怎么樣的呢?

在上篇文章《rocketmq 是什么》中,我們了解到 RocketMQ 的架構(gòu)其實(shí)參考了 kafka 的設(shè)計(jì)思想,同時(shí)又在 kafka 的基礎(chǔ)上做了一些調(diào)整。看起來(lái),RocketMQ 好像各方面都比 kafka 更能打。

圖片圖片

但 kafka 卻一直沒被淘汰,說(shuō)明 RocketMQ 必然是有著不如 kafka 的地方。是啥呢? 性能,嚴(yán)格來(lái)說(shuō)是吞吐量。阿里中間件團(tuán)隊(duì)對(duì)它們做過(guò)壓測(cè),同樣條件下,kafka 比 RocketMQ 快 50%左右。但即使這樣,RocketMQ 依然能每秒處理 10w 量級(jí)的數(shù)據(jù),依舊非常能打。你不能說(shuō) RocketMQ 弱,只能說(shuō) Kafka 性能太強(qiáng)了。

不過(guò)這就很奇怪了,為什么 RocketMQ 參考了 kafka 的架構(gòu),卻不能跟 kafka 保持一樣的性能呢?在回答這個(gè)問(wèn)題之前,我們來(lái)聊下什么是零拷貝。

零拷貝是什么

我們知道,消息隊(duì)列的消息為了防止進(jìn)程崩潰后丟失,一般不會(huì)放內(nèi)存里,而是放磁盤上。那么問(wèn)題就來(lái)了,消息從消息隊(duì)列的磁盤,發(fā)送到消費(fèi)者,過(guò)程是怎么樣的呢?

消息的發(fā)送過(guò)程

操作系統(tǒng)分為用戶空間和內(nèi)核空間。程序處于用戶空間,而磁盤屬于硬件,操作系統(tǒng)本質(zhì)上是程序和硬件設(shè)備的一個(gè)中間層。程序需要通過(guò)操作系統(tǒng)去調(diào)用硬件能力。

圖片圖片

如果用戶想要將數(shù)據(jù)從磁盤發(fā)送到網(wǎng)絡(luò)。那么就會(huì)發(fā)生下面這幾件事:程序會(huì)發(fā)起系統(tǒng)調(diào)用read(),嘗試讀取磁盤數(shù)據(jù),

? 磁盤數(shù)據(jù)從設(shè)備拷貝到內(nèi)核空間的緩沖區(qū)。

? 再?gòu)膬?nèi)核空間的緩沖區(qū)拷貝到用戶空間。

程序再發(fā)起系統(tǒng)調(diào)用write(),將讀到的數(shù)據(jù)發(fā)到網(wǎng)絡(luò):

? 數(shù)據(jù)從用戶空間拷貝到 socket 發(fā)送緩沖區(qū)

? 再?gòu)?socket 發(fā)送緩沖區(qū)拷貝到網(wǎng)卡。

最終數(shù)據(jù)就會(huì)經(jīng)過(guò)網(wǎng)絡(luò)到達(dá)消費(fèi)者。

圖片圖片

整個(gè)過(guò)程,本機(jī)內(nèi)發(fā)生了 2 次系統(tǒng)調(diào)用,對(duì)應(yīng) 4 次用戶空間和內(nèi)核空間的切換,以及 4 次數(shù)據(jù)拷貝。

圖片圖片

一頓操作猛如虎,結(jié)果就是同樣一份數(shù)據(jù)來(lái)回拷貝。有沒有辦法優(yōu)化呢?有,它就是零拷貝技術(shù),常見的方案有兩種,分別是 mmap 和 sendfile。我們來(lái)看下它們是什么。

mmap 是什么

mmap 是操作系統(tǒng)內(nèi)核提供的一個(gè)方法,可以將內(nèi)核空間的緩沖區(qū)映射到用戶空間。

圖片圖片

用了它,整個(gè)發(fā)送流程就有了一些變化。程序發(fā)起系統(tǒng)調(diào)用mmap(),嘗試讀取磁盤數(shù)據(jù),具體情況如下:

? 磁盤數(shù)據(jù)從設(shè)備拷貝到內(nèi)核空間的緩沖區(qū)。

? 內(nèi)核空間的緩沖區(qū)映射到用戶空間,這里不需要拷貝。

程序再發(fā)起系統(tǒng)調(diào)用write(),將讀到的數(shù)據(jù)發(fā)到網(wǎng)絡(luò):

? 數(shù)據(jù)從內(nèi)核空間緩沖區(qū)拷貝到 socket 發(fā)送緩沖區(qū)。

? 再?gòu)?socket 發(fā)送緩沖區(qū)拷貝到網(wǎng)卡。

圖片圖片

整個(gè)過(guò)程,發(fā)生了 2 次系統(tǒng)調(diào)用,對(duì)應(yīng) 4 次用戶空間和內(nèi)核空間的切換,以及 3 次數(shù)據(jù)拷貝,對(duì)比之前,省下一次內(nèi)核空間到用戶空間的拷貝。

圖片圖片

看到這里大家估計(jì)也蒙了,不是說(shuō)零拷貝嗎?怎么還有 3 次拷貝。mmap 作為一種零拷貝技術(shù),指的是用戶空間到內(nèi)核空間這個(gè)過(guò)程不需要拷貝,而不是指數(shù)據(jù)從磁盤到發(fā)送到網(wǎng)卡這個(gè)過(guò)程零拷貝。

圖片圖片

確實(shí)省了一點(diǎn),但不多。有沒有更徹底的零拷貝?有,用 sendfile.

sendfile 是什么

sendfile,也是內(nèi)核提供的一個(gè)方法,從名字可以看出,就是用來(lái)發(fā)送文件數(shù)據(jù)的。程序發(fā)起系統(tǒng)調(diào)用sendfile(),內(nèi)核會(huì)嘗試讀取磁盤數(shù)據(jù)然后發(fā)送,具體情況如下:

? 磁盤數(shù)據(jù)從設(shè)備拷貝到內(nèi)核空間的緩沖區(qū)。

? 內(nèi)核空間緩沖區(qū)里的數(shù)據(jù)可以直接拷貝到網(wǎng)卡。

圖片圖片

整個(gè)過(guò)程,發(fā)生了 1 次系統(tǒng)調(diào)用,對(duì)應(yīng) 2 次用戶空間和內(nèi)核空間的切換,以及 2 次數(shù)據(jù)拷貝。這時(shí)候問(wèn)題很多的小明就有意見了,說(shuō)好的零拷貝怎么還有 2 次拷貝?

圖片圖片

其實(shí),這里的零拷貝指的是零 CPU拷貝。也就是說(shuō) sendfile 場(chǎng)景下,需要的兩次拷貝,都不是 CPU 直接參與的拷貝,而是其他硬件設(shè)備技術(shù)做的拷貝,不耽誤我們 CPU 跑程序。

kafka 為什么性能比 RocketMQ 好

聊完兩種零拷貝技術(shù),我們回過(guò)頭來(lái)看下 kafka 為什么性能比 RocketMQ 好。這是因?yàn)?nbsp;RocketMQ 使用的是 mmap 零拷貝技術(shù),而 kafka 使用的是 sendfile。kafka 以更少的拷貝次數(shù)以及系統(tǒng)內(nèi)核切換次數(shù),獲得了更高的性能。但問(wèn)題又來(lái)了,為什么 RocketMQ 不使用 sendfile?參考 kafka 抄個(gè)作業(yè)也不難啊?我們來(lái)看下 sendfile 函數(shù)長(zhǎng)啥樣。

ssize_t sendfile(int out_fd, int in_fd, off_t* offset, size_t count);
// num = sendfile(xxx);

再來(lái)看下 mmap 函數(shù)長(zhǎng)啥樣。

void *mmap(void *addr, size_t length, int prot, int flags,
           int fd, off_t offset);
// buf = mmap(xxx)

注釋里寫的是兩個(gè)函數(shù)的用法,mmap 返回的是數(shù)據(jù)的具體內(nèi)容,應(yīng)用層能獲取到消息內(nèi)容并進(jìn)行一些邏輯處理。

圖片圖片

而 sendfile 返回的則是發(fā)送成功了幾個(gè)字節(jié)數(shù),具體發(fā)了什么內(nèi)容,應(yīng)用層根本不知道。

圖片圖片

而 RocketMQ 的一些功能,卻需要了解具體這個(gè)消息內(nèi)容,方便二次投遞等,比如將消費(fèi)失敗的消息重新投遞到死信隊(duì)列中,如果 RocketMQ 使用 sendfile,那根本沒機(jī)會(huì)獲取到消息內(nèi)容長(zhǎng)什么樣子,也就沒辦法實(shí)現(xiàn)一些好用的功能了。

圖片圖片

而 kafka 卻沒有這些功能特性,追求極致性能,正好可以使用 sendfile。

除了零拷貝以外,kafka 高性能的原因還有很多,比如什么批處理,數(shù)據(jù)壓縮啥的,但那些優(yōu)化手段 rocketMQ 也都能借鑒一波,唯獨(dú)這個(gè)零拷貝,那是毫無(wú)辦法。

圖片圖片

所以還是那句話,沒有一種架構(gòu)是完美的,一種架構(gòu)往往用于適配某些場(chǎng)景,你很難做到既要又要還要。當(dāng)場(chǎng)景不同,我們就需要做一些定制化改造,通過(guò)犧牲一部分能力去換取另一部分能力。做架構(gòu),做到最后都是在做折中。是不是感覺升華了。

kafka 和 RocketMQ 怎么選?

這時(shí)候大家估計(jì)還是想知道 kafka 和 RocketMQ 到底該怎么選,用哪個(gè)。官方點(diǎn)的回答是"這個(gè)要看場(chǎng)景的"。說(shuō)了等于沒說(shuō)。這不是我的風(fēng)格。我的標(biāo)準(zhǔn)只有一個(gè),如果是大數(shù)據(jù)場(chǎng)景,比如你能頻繁聽到 spark,flink 這些關(guān)鍵詞的時(shí)候,那就用 kafka。除此之外,如果公司組件支持,盡量用 RocketMQ。

現(xiàn)在大家通了嗎?

責(zé)任編輯:武曉燕 來(lái)源: 小白debug
相關(guān)推薦

2020-09-24 06:41:33

通信IT行業(yè)

2022-09-24 09:52:42

TopicQueuekafka

2024-08-19 00:10:05

RocketMQ應(yīng)用SDK

2021-03-01 10:45:45

開發(fā)技能代碼

2024-02-26 21:15:20

Kafka緩存參數(shù)

2018-08-10 09:40:02

數(shù)據(jù)庫(kù)MySQL存儲(chǔ)過(guò)程

2021-08-05 12:41:57

高并發(fā)性能CAS

2021-12-29 21:46:20

iOS蘋果系統(tǒng)

2022-04-30 08:09:37

面試開發(fā)閱讀源碼

2021-01-21 07:16:03

RocketMQKafka中間件

2020-03-30 15:05:46

Kafka消息數(shù)據(jù)

2024-10-17 16:41:57

KafkaZooKeeper

2021-05-31 07:44:08

Kafka分布式系統(tǒng)

2022-05-10 15:24:34

KafkaZooKeeperKafka Raft

2020-08-13 09:19:10

Kafka存儲(chǔ)MQ

2021-02-01 07:20:51

KafkaPulsar搜索

2021-03-17 15:54:32

IO零拷貝方式

2011-08-09 16:08:53

數(shù)據(jù)庫(kù)連接

2017-03-16 07:28:35

科技新聞早報(bào)

2022-08-22 15:32:59

C++C代碼
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 欧美又大粗又爽又黄大片视频 | 欧美精品一区二区三区在线播放 | 欧美九九九 | 欧美成人激情 | 成人在线电影在线观看 | 福利片在线看 | 日韩综合在线播放 | 日韩一级| 久久久久成人精品亚洲国产 | 中文字幕一区二区三区四区 | 免费一看一级毛片 | 中文字幕亚洲专区 | 黄色一级免费 | 欧美成人在线影院 | 国产精品久久久久久久久久久久 | 欧美一区2区三区4区公司二百 | 狠狠操天天干 | 黄色一级大片视频 | 在线观看av不卡 | 放个毛片看看 | 狠狠狠色丁香婷婷综合久久五月 | 日日av | 久久久久久久久91 | 午夜电影一区二区 | 精品永久 | www.一级毛片 | 国产精品久久久久久久7电影 | www.久| 网站国产 | 精品一区二区三区四区五区 | 亚洲精品免费观看 | 欧美成年黄网站色视频 | 久久综合香蕉 | 日本精品在线观看 | 免费观看毛片 | 国产欧美精品区一区二区三区 | 91精品福利 | 国产精品久久久久一区二区三区 | 狠狠爱一区二区三区 | 最新av在线播放 | 亚洲午夜精品一区二区三区 |