1. 程式人生 > 其它 >netty服務端遇到的一個小坑

netty服務端遇到的一個小坑

之前專案為了快速處理,在服務端推送到客戶端訊息後,確保客戶端收到訊息,沿用了netty自帶的監聽器方式。程式碼如下:

ctx.channel()
   .writeAndFlush(...)
   .addListener((ChannelFuture writeFuture) -> {
       //訊息傳送成功
       if (writeFuture.isSuccess()) {
          //...
       } 
       //訊息傳送失敗
       else {
          ChannelUtils.closeOnFlush(ctx.channel());
       }
   });

推送過猛的時候,突然發現客戶端會丟包,之前一直覺得tcp協議確保可靠性傳輸,後來深入發現不是那麼回事。發現:TCP不保證您的郵件已收到。它提供可靠的有序位元組流。它對您的訊息一無所知,也無法告訴您遠端主機何時收到該訊息。因此Netty也不會。 Netty只能告訴您,您的訊息在傳輸之前已寫入作業系統緩衝區。TCP只保證過程不丟,不代表客戶端一定會收到,這個TCP是不知情的。

突然醒悟,不能偷懶,麻蛋必須等客戶端收到訊息後給予一個回執,這個需要在應用層進行處理,立帖警戒。哈哈