天天看點

dockercp指令同步,手把手教你用Jenkins+K8S打造流水線環境

每個請求都需要建立獨立的線程,與對應的用戶端進行資料 Read,業務處理,資料 Write 。

當并發數較大時,需要建立大量線程來處理連接配接,系統資源占用較大。

連接配接建立後,如果目前線程暫時沒有資料可讀,則線程就阻塞在 Read 操作上,造成線程資源浪費

Java NIO 全稱 java non-blocking IO,是指 JDK 提供的新 API。從 JDK1.4 開始,Java 提供了一系列改進的輸入/輸出的新特性,被統稱為 NIO(即 New IO),是同步非阻塞的

NIO 相關類都被放在 java.nio 包及子包下,并且對原 java.io 包中的很多類進行改寫。【基本案例】

NIO 有三大核心部分:Channel(通道),Buffer(緩沖區), Selector(選擇器)

Selector 、 Channel 和 Buffer 的關系圖:
dockercp指令同步,手把手教你用Jenkins+K8S打造流水線環境

每個channel都會對應一個Buffer

Selector 對應一個線程, 一個線程對應多個 channel(連接配接)

該圖反應了有三個channel注冊到該selector//程式

程式切換到哪個channel是有事件決定的,Event就是一個重要的概念

Selector 會根據不同的事件,在各個通道上切換

Buffer 就是一個記憶體塊 , 底層是有一個數組

資料的讀取寫入是通過Buffer,這個和BIO,BIO中要麼是輸入流,或者是輸出流, 不能雙向,但是 NIO 的 Buffer 是可以讀也可以寫, 需要 flip 方法切換 channel 是雙向的, 可以傳回底層作業系統的情況, 比如 Linux , 底層的作業系統通道就是雙向的。

緩沖區(Buffer):緩沖區本質上是一個可以讀寫資料的記憶體塊,可以了解成是一個容器對象(含數組),該對象提供了一組方法,可以更輕松地使用記憶體塊,,緩沖區對象内置了一些機制,能夠跟蹤和記錄緩沖區的狀态變化情況。Channel 提供從檔案、網絡讀取資料的管道,但是讀取或寫入的資料都必須經由 Buffer。

dockercp指令同步,手把手教你用Jenkins+K8S打造流水線環境

NIO 的通道類似于流,但有些差別如下:

通道可以同時進行讀寫,而流隻能讀或者隻能寫

通道可以實作異步讀寫資料

通道可以從緩沖讀資料,也可以寫資料到緩沖:

BIO 中的 stream 是單向的,例如 FileInputStream 對象隻能進行讀取資料的操作,而 NIO 中的通道(Channel) 是雙向的,可以讀操作,也可以寫操作。

Channel 在 NIO 中是一個接口 ​<code>​public interface Channel extends Closeable{}​</code>​

常 用 的 Channel 類 有 : FileChannel 、 DatagramChannel 、 ServerSocketChannel 和 SocketChannel 。 【ServerSocketChanne 類似 ServerSocket , SocketChannel 類似 Socket】

Java 的 NIO,用非阻塞的 IO 方式。可以用一個線程,處理多個的用戶端連接配接,就會使用到 Selector(選擇器)

Selector 能夠檢測多個注冊的通道上是否有事件發生(注意:多個 Channel 以事件的方式可以注冊到同一個 Selector),如果有事件發生,便擷取事件然後針對每個事件進行相應的處理。這樣就可以隻用一個單線程去管 理多個通道,也就是管理多個連接配接和請求。

隻有在連接配接/通道真正有讀寫事件發生時,才會進行讀寫,就大大地減少了系統開銷,并且不必為每個連接配接都 建立一個線程,不用去維護多個線程

避免了多線程之間的上下文切換導緻的開銷

dockercp指令同步,手把手教你用Jenkins+K8S打造流水線環境

Netty 的 IO 線程 NioEventLoop 聚合了 Selector(選擇器,也叫多路複用器),可以同時并發處理成百上千個客

戶端連接配接。

當線程從某用戶端 Socket 通道進行讀寫資料時,若沒有資料可用時,該線程可以進行其他任務。

線程通常将非阻塞 IO 的空閑時間用于在其他通道上執行 IO 操作,是以單獨的線程可以管理多個輸入和輸出

通道。

由于讀寫操作都是非阻塞的,這就可以充分提升 IO 線程的運作效率,避免由于頻繁 I/O 阻塞導緻的線程挂

起。

一個 I/O 線程可以并發處理 N 個用戶端連接配接和讀寫操作,這從根本上解決了傳統同步阻塞 I/O 一連接配接一線程模型,架構的性能、彈性伸縮能力和可靠性都得到了極大的提升。

dockercp指令同步,手把手教你用Jenkins+K8S打造流水線環境
dockercp指令同步,手把手教你用Jenkins+K8S打造流水線環境
dockercp指令同步,手把手教你用Jenkins+K8S打造流水線環境
<b> </b>