1 寫資料的核心問題

對方倉庫爆倉時,送不了的時候,會停止送,協商等電話通知什麼時候好了,再送。
Netty寫資料,寫不進去時,會停止寫,然後注冊一個 OP_WRITE事件,來通知什麼時候可以寫進去了再寫。
1.2 挺能寫的
發送快遞時,對方倉庫都直接收下,這個時候再發送快遞時,可以嘗試發送更多的快遞試試,這樣效果更好。
Netty批量寫資料時,如果嘗試寫的都寫進去了,接下來會嘗試寫更多(調整maxBytesPerGatheringWrite)
發送快遞時,發到某個地方的快遞特别多,我們會連續發,但是快遞車畢竟有限,也會考慮下其他地方
Netty隻要有資料要寫,且能寫的出去,則一直嘗試,直到寫不出去或滿16次(writeSpinCount)
寫16次還沒有寫完,就直接 schedule 一個 task 來繼續寫,而不是用注冊寫事件來觸發,更簡潔有力。
1.4 寫不過來了
攬收太多,發送來不及時,爆倉,這個時候會出個告示牌:收不下了,最好過2天再來郵寄吧。
Netty待寫資料太多,超過一定的水位線(writeBufferWaterMark.high()) ,會将可寫的标志位改成 false,讓應用端自己做決定要不要發送資料(寫)了(很真實,将責任推給使用者)。
Write - 寫資料到buffer :
ChannelOutboundBuffer#addMessage
Flush -發送buffer裡面的資料:
AbstractChannel.AbstractUnsafe#flush
- 準備資料: ChannelOutboundBuffer#addFlush
寫完了更新狀态
發送: NioSocketChannel#doWrite
3 寫資料的根本
Single write
sun.nio.ch.SocketChannelmpl#write(java.nio.ByteBuffer)
gathering write(批量寫)
sun.nio.ch.SocketChannelmpl#write(java.nio.ByteBuffer[], int, int)
寫資料寫不進去時,會停止寫,注冊一個 OP_WRITE 事件,來通知什麼時候可以寫進去了。
OP_WRITE不代表有資料可寫,而是可以寫進去,是以正常情況下不要注冊它,否則會一直觸發。
channelHandlerContext.channel().write()
從TailContext開始執行
channelHandlerContext.write()
從目前的Context開始