传统的序列化

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

 

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

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

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

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

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

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

 

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

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

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

 

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

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

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

 

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

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

 

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

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

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

 

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

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

key1

value1

key2

value2

key3

value3

 

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

 

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

 

 

 

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

相关文章:

  • 2022-01-13
  • 2021-12-25
  • 2021-10-22
  • 2022-03-06
  • 2021-12-12
  • 2021-07-22
  • 2022-12-23
猜你喜欢
  • 2020-03-16
  • 2022-02-13
  • 2021-08-24
  • 2022-12-23
  • 2021-07-20
  • 2019-12-09
  • 2022-02-20
相关资源
相似解决方案