谈谈 kafka 的序列化和反序列化

传统的序列化

 

很明显这种序列化有一个问题,虽然能满足append的存储模式,但无法从中读取第n个对象,每次得从第一个开始读。

kafka作为一种C-S架构,C端需要和S端进行通信,批量向S端传送序列化的对象,达到batch.size(8K)或者时间达到linger.ms(5ms)向server端传送数据,据此推断C端和S端的通信应该使用的是长连接,而不会是每次传送数据打开一个socket,并且还支持压缩,高效稳定的通信和存储是这类软件必备的特质之一。

除此以外还有一种提交的情况,那就是事务提交了。。。。。。

 

可以看出key和value都被序列化为byte[],每跳过length个byte就是跳过了一组key-value,因此可以根据这个进行寻找第offset个key-value

如何将一个Object序列化为byte[] ,很明显需将Object的所有字段进行序列化,进而最终转化为基本数据类型和String等的序列化。

 

以下是将Double进行序列化和反序列化

 

相比较而言使用kafka的序列化,一个Double占用8个字节, 

而使用writeDouble进行序列化则占用了14个字节

 

而使用writeObject进行序列化则占用了84个字节。务必请慎用,占用大量字节,进而占内存和带宽。。。

 

也许序列化的本质就是将对象转换为可识别的字节流。

有时会想为什么不这样存储?

key1

value1

key2

value2

key3

value3

 

首先这种存储面临一个问题, 换行回车符号需进行转义存储。二是这种存储和读取高效么,一行一行进行处理。仅仅是推测,具体实现是不是这样没有考究。一行一行的读取无非是一个一个字节的读取,读到\n便是一行,这种读取方式应该不是很高明。

 

写代码只是为了生存,学习如何写代码却是为了生活。

 

 

 

转载于:https://my.oschina.net/qidis/blog/1528569

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值