日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

生产者和消费者代码———操作系统_kafka如何保证高并发(从生产者、消费者角度)...

發布時間:2025/3/20 windows 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 生产者和消费者代码———操作系统_kafka如何保证高并发(从生产者、消费者角度)... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

內容梗概:

系統緩存+順序寫+批處理+mmap(生產者角度-高并發寫入)

零拷貝技術(消費者角度-高并發讀取)

Kafka在生產者寫入消息的時候會將數據最終寫入磁盤,既然它是基于磁盤讀寫,那么頻繁的IO操作肯定會影響讀寫的性能,為何會有高性能呢?

1.系統緩存+順序寫+批處理+mmap(生產者角度-高并發寫入)

在這里,Kafka生產者將消息寫入各個broker中的時候,并不會直接寫入磁盤,會將數據先寫入緩存OS Cache(基于操作系統,所以命名OS),然后操作系統會決定什么時候將消息成批地將數據寫入磁盤(批處理),因為寫入數據時是直接和內存交互,所以其寫入性能很高,而且在從緩存寫入磁盤的時候,它會將隨機寫優化為順序寫,我們都知道,磁盤的寫入是基于磁道尋址的,隨機寫會引發大量的磁盤尋址(即要先找到數據在磁盤上的位置,再進行數據讀寫),浪費大量的時間,而順序寫避免了頻繁的尋址操作(直接追加數據至末尾),寫入性能提高了數倍。(畫外音:很多優秀的開源框架都采用了順序來優化寫入,比如HBase memestore)

[mmap]:即便是順序寫入硬盤,硬盤的訪問速度還是不可能追上內存。所以Kafka的數據并不是實時的寫入硬盤 ,它充分利用了現代操作系統分頁存儲來利用內存提高I/O效率。

Memory Mapped Files(mmap 內存映射文件) ,它的工作原理是直接利用操作系統的Page來實現硬盤和物理內存之間的映射。完成映射之后你對物理內存的操作會被同步到硬盤上(操作系統在適當的時候)。通過mmap,進程像讀寫硬盤一樣讀寫內存(當然是虛擬機內存),也不必關心內存的大小有虛擬內存為我們兜底。(Oda.你以為你在操作硬盤,實際你在操作內存,內存會定時同步到硬盤)

但也有一個很明顯的缺陷——不可靠,寫到mmap中的數據并沒有被真正的寫到硬盤,操作系統會在程序主動調用flush的時候才把數據真正的寫到硬盤。

Kafka提供了一個參數——producer.type來控制是不是主動flush,如果Kafka寫入到mmap之后就立即flush然后再返回Producer叫 同步 (sync);寫入mmap之后立即返回Producer不調用flush叫異步(async)。

2.零拷貝技術(消費者角度-高并發讀取)

非零拷貝的流程:

(1)操作系統將數據從磁盤文件中讀取到內核空間的頁面緩存;
(2)應用程序將數據從內核空間讀入用戶空間緩沖區;(優化)
(3)應用程序將讀到數據寫回內核空間并放入 socket 緩沖區;
(4)操作系統將數據從 socket 緩沖區復制到網卡接口,此時數據才能通過網絡發送。

在磁盤上的數據格式、producer發送到broker的數據格式、和consumer收到的數據格式一模一樣。由于磁盤格式與consumer以及producer的數據格式一模一樣,這樣就使得Kafka可以通過Linux的sendFile技術(NIO),省去了進程切換和一次數據拷貝,讓性能變得更好。

SendFile優化后,直接把數據從內核區copy到socket,然后發送到網卡,避免了在內核Buffer與用戶Buffer來回拷貝的弊端。

本筆記本內容綜合整理自多方資料加上個人心得,只用于非盈利內容分享,如有侵權,請聯系刪除。

總結

以上是生活随笔為你收集整理的生产者和消费者代码———操作系统_kafka如何保证高并发(从生产者、消费者角度)...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。