netty服務端遇到的一個小坑
阿新 • • 發佈:2021-01-06
之前專案為了快速處理,在服務端推送到客戶端訊息後,確保客戶端收到訊息,沿用了netty自帶的監聽器方式。程式碼如下:
ctx.channel() .writeAndFlush(...) .addListener((ChannelFuture writeFuture) -> { //訊息傳送成功 if (writeFuture.isSuccess()) { //... } //訊息傳送失敗 else { ChannelUtils.closeOnFlush(ctx.channel()); } });
推送過猛的時候,突然發現客戶端會丟包,之前一直覺得tcp協議確保可靠性傳輸,後來深入發現不是那麼回事。發現:TCP不保證您的郵件已收到。它提供可靠的有序位元組流。它對您的訊息一無所知,也無法告訴您遠端主機何時收到該訊息。因此Netty也不會。 Netty只能告訴您,您的訊息在傳輸之前已寫入作業系統緩衝區。TCP只保證過程不丟,不代表客戶端一定會收到,這個TCP是不知情的。
突然醒悟,不能偷懶,麻蛋必須等客戶端收到訊息後給予一個回執,這個需要在應用層進行處理,立帖警戒。哈哈