20 - 高并发- 序列化

本文探讨了在高并发环境中,序列化的重要性和选择,重点介绍了Protobuf作为高性能序列化框架的优势,同时分析了TCP通信中的粘包和拆包现象及其原因。针对半包问题,提出了在Netty中利用解码器进行应用层的分包解决方案。
摘要由CSDN通过智能技术生成

一、序列化框架

我们在开发一些远程过程调用RPC的程序时,通常会涉及对象的序列化和反序列化问题。因为TCP协议只能发送字节流。

  • 序列化一定会涉及编码和格式化。(Encoding&Format)。
  • 编码方式目前有:JSON和XML。
  • 序列化框架选择:1.序列化后数据要小。2.结构复杂度要低。
  • Protobuf是一个高性能、易扩展的序列化框架。可以进行二进制序列化。
  • 对于性能要求不是太高的服务器程序,可是选择JSON系列的序列化框架。对于性能要求比较高的程序,使用二进制序列化框架。

二、粘包和拆包

Netty每一次发送就是向通道写入一个ByteBuf。发送数据时先填好ByteBuf,然后通过通道发出去。

  • 理想情况下:发送端每发送一个ByteBuf,接收端就收到一个ByteBuf。并且内容一模一样。
  • 现实情况下:每次收到一个ByteBuf,就是全包。某次收到多个ByteBuf,就是粘包。每次收到部分ByteBuf,就是半包。

三、半包现象的原理

操作系统底层读取缓冲的数据容量是有限的,当TCP底层缓冲的数据包比较大时,会将一个底层包分成多次ByteBuf,进而造成半包。当TCP底层缓冲的数据包比较小时,一次复制的不止一个内核缓冲区包,进而造成粘包。

四、半包问题的解决

基本思路是,在接收端,Netty程序需要根据自定义协议,将读取到的进程缓冲区ByteBuf,在应用层进行二次拼装,重新组装我们应用层的数据包。接收端的这个过程通常也称为分包,或者叫作拆包。在netty中,分包的方法为使用解码器。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

良之才-小良

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值