這個問題是在一個群友做壓力測試的時候發現的。使用客戶端和netty創建一條連接,然后寫了一個for循環不停的給服務器發送1500條信息,發現返回只有幾百條。另外幾百條不知道哪去了。查看代碼,發現在服務器發送前做了一個判斷:

通過查看源碼,問題就在isWriteable()里面,下面看一下源碼,在AbstractChannel里面:

再看buf.isWritebale()的實現:

這里有一個變量,控制了是否可以寫,那這個變量什么時候發生變化呢,我們接着找,先看看是什么情況下被修改為非0的

這個方法是在這里被調用 的:

這個方法是用來接收發送數據的緩存的,從這里可以看出,當緩存的數據長庫大於channel.config.getWriteBufferHighWaterMark()的時候,就不能再寫了。這是一種限流 措施,防止數據寫入太大,導致消息堆積,內存不足的情況。
我們看到這個值是在channel config中配置的,那么就可以在channel config中修改這個值,
ctx.channel().config().setWriteBufferHighWaterMark(1024*1024 * 8);
也可以在服務啟動的時候設置:

給孩子的禮物:
歡迎加群交流,QQ群:66728073,197321069,398808948 還可以掃描博客左上角二維碼,關注游戲技術網公眾號