動態

列表
創建 時間

MySQL 事務詳解

MySQL 事務 數據庫事務指的是一組數據操作,事務內的操作要麼就是全部成功,要麼就是全部失敗,如果部分成功,那麼已成功的必須回滾,恢復數據的原始狀態。 假設一個網購付款的操作,用户付款後要涉及到訂單狀態更新、扣庫存以及其他一系列動作,這就是一個事務,如果一切正常那就相安無事,一旦中間有某個環節異常,那整個事務就要回滾,總不能更新了訂單狀態但是不扣庫存吧,這問題就大了。 事務具有原子性(Atomi

創建 時間

Netty源碼解析-請求處理與多路複用

摘要 Netty源碼系列-NioEventLoop 1.1 Netty給Channel分配Nio Event Loop的規則 看下圖,EventLoopGroup是線程組,每個EventLoop是一個線程,那麼線程處理請求是怎麼分配的呢?我們看一下源碼 1.1.1 MultithreadEventLoopGroup.register方法 該方法是EventLoop註冊Channel的方法,

創建 時間

Netty源碼解析-零拷貝

摘要 Netty源碼系列-Netty如何使用零拷貝 1、零拷貝 Netty為了加快文件傳輸速度,採用了零拷貝技術。 sendFile(Kafka也是用該技術優化性能):發送文件描述符,如果硬件支持,圖二的文件緩衝區和Socket緩衝區可以共享,只需要兩次DMA拷貝就可以 1.1 、源碼DefaultFileRegion.transferto()方法 我們看一下源碼,Netty的文件傳

創建 時間

Netty對處理粘包和半包的支持

1.1 什麼是粘包拆包 例如:發送 ABC, DEF兩個報文 收到ABCDEF一個報文,發生了粘包 收到AB,C,DEF三個報文,ABC發生了拆包 收到AB,CD,EF三個報文,即發生了拆包又發生了粘包 1.2 看一個粘包半包樣例 客户端每次把消息“ABC,DEF,GHI,JKL,MNO\n" 發生一百次給服務端 服務端將每次收到的消息輸出,並記錄收到的次數,然後將消息返回客户端

創建 時間

Netty與網絡編程

要了解Netty,必須先了解網絡編程 1 網絡編程 1.1 網絡IO模型 1.1.1 網絡三種I/O模型分類: BIO:(同步 阻塞)jdk1.4以前 java.io包 NIO:(同步 非阻塞)jdk1.4 java.nio包 AIO:(異步 非阻塞)jdk1.7 java.nio包 1.1.2 BIO、NIO、AIO處理模式 1)BIO:一個連接一個線程,客户端有連接請求時服務器端

創建 時間

Netty源碼解析-底層原理及IO模式

1、Netty源碼編譯 我們看一下版本4.1.40.Final-SNAPSHOT源碼包,可以把源碼pull到本地,用IDEA打開。 github地址:https://github.com/netty/netty 包含的模塊如下圖: 2、Netty 源碼核心包 2.1 Netty源碼核心包主要分成下面幾塊: 1、工具類 下圖紅色的模塊,如buffer、common、resolver 2、底層協議(

創建 時間

Netty源碼解析-零拷貝

這是Netty的一個重要優化,為了解決I/O操作速度影響性能,採用零拷貝的技術 1、零拷貝 sendFile(Kafka也是用該技術優化性能):發送文件描述符,如果硬件支持,圖二的文件緩衝區和Socket緩衝區可以共享,只需要兩次DMA拷貝就可以 1.1 源碼DefaultFileRegion.transferto()方法 我們看一下源碼,Netty的文件傳輸零拷貝方法就是該方法,方法下面圈出來

創建 時間

Netty源碼解析-鎖機制

為了提高性能,Netty對鎖也做了大量優化 1、鎖優化技術 Netty大量使用了鎖優化技術: 1.1 減小鎖粒度 1.2 減少鎖對象的空間佔用 1.3 提高鎖的性能 1.4 根據不同業務場景選擇合適鎖 1.5 能不用鎖則不用鎖 1.1 減小鎖粒度 在Netty4.1.15.Final版本中ServerBootstrap.init方法中有兩個地方對對象加鎖,而不是在方法上加一個大鎖,縮

創建 時間

Netty源碼解析-響應式實現(Reactor模式)

Netty基本介紹,請參考juejin.cn/post/740884… 1、Netty如何支持Reactor模式 1.1 主從Reactor模式 實現這種模式需要定義兩個EventLoopGroup,bossGroup就是mainReactor, workerGroup就是subReactor, 接着我們進入下圖的b.group方法 1.1.2 進入ServerBootstrap.group方

創建 時間

Netty源碼解析-請求處理與多路複用

NioEventLoop是什麼? 如圖,NioEventLoop是worker threads中的thread,也就是處理請求的線程,屬於NioEventLoopGroup,那麼多個線程每次選擇哪個線程來處理請求呢? 1.1 Netty給Channel分配Nio Event Loop的規則 看下圖,EventLoopGroup是線程組,每個EventLoop是一個線程,那麼線程處理請求是怎麼分配

創建 時間

Netty源碼-責任鏈模式運用

Netty基本介紹,參考juejin.cn/post/740884… 1、Netty的責任鏈模式 1.1 責任鏈模式實現樣例 基於上圖,寫一個責任鏈模式的案例如下: 從下面的例子我們可以知道,責任鏈模式包含下面幾個重要的部分: HandlerChainContext:hander上下文,也就是責任鏈中的節點,持有一個handler,並有指向下一個節點的指針 Handler: 責任處理器

創建 時間

Netty源碼-業務流程之讀事件

Netty基本介紹,參考 https://juejin.cn/post/7408844429370834954 1 Netty讀事件 1.1 READ事件,NioEventLoop#processSelectedKey在第二次循環的時候就是讀事件 現在unsafe類不一樣,NioSocketChannel$NioSocketChannelUnsafe類,進入Read方法,我們進入了Abstarc

創建 時間

Netty源碼-Server啓動流程

Netty基本介紹,參考 https://juejin.cn/post/7408844429370834954 1、主線程: Netty源碼包的mnetty-example模塊隨便打開一個實現樣例,比如包io.netty.example.echo下的EchoServer,我們從這裏的源碼開始看 Server啓動流程: 創建Selector -》創建ServerSocketChannel -》 初始

創建 時間

Netty源碼-業務流程之寫數據

Netty基本介紹,參考 Netty與網絡編程 1、源碼分析,EchoServerHandler之Write流程 1.1 write流程入口 通常我們通過ChannelRead收到消息後,需要給一個響應,通過ctx.write()將響應返回客户端。 在自定義handler的channelRead方法打一個斷點,客户端發起請求,並進入ctx.write 1.2 AbstractChannelHa

創建 時間

Netty源碼-業務流程之構建連接

Netty基本介紹,參考 https://juejin.cn/post/7408844429370834954 1、Netty構建連接 構建連接的流程 1.1 我們知道客户端連接服務端都是通過NioEventLoop來處理請求,NioEventLoop是一個線程,連接進來首先進入run()方法。 所以我們需要啓動服務端,然後再啓動客户端發起連接,我們在run()方法打個斷點看一下。 從ru

創建 時間

Netty源碼-業務流程之請求處理

1、業務處理流程 1.1 主從模型 1.2 Debug跟蹤 我們用Netty源碼包下面的example來Debug觀察一下,包路徑io.netty.example.echo NioEventLoop#processSelectedKeysOptimized()方式循環處理不同的事件。如下圖。 NioEventLoop#processSelectedKey方法處理一個事件,在該方法中的un