四,序列化-分区器-拦截器|小册免费学

204 阅读2分钟

序列化

生产者传递消息时,需要将信息进行序列化,消费者收到消息时,需要将消息反序列化。

什么是序列化?

序列化:序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

序列化使其他代码可以查看或修改,那些不序列化便无法访问的对象实例数据。确切地说,代码执行序列化需要特殊的权限:即指定了 SerializationFormatter 标志的 SecurityPermission。在默认策略下,通过 Internet 下载的代码或 Internet 代码不会授予该权限;只有本地计算机上的代码才被授予该权限。

分区器

在指定分区的情况下,不需要分区器来进行自动分区,但如果没有手动通过参数制定分区时,则需要通过分区器来进行自动分区。一般来说,程序是通过key值来确定最后的分区结果的。

  • if key != null :则使用hash来进行自动分区
  • else 则会将消息发送给每一个可用的分区

生产者拦截器

生产者拦截器很像Spring中的一个特性:面向切片编程。就像面向切片编程一般被使用于日志等方向,生产者拦截器一般用于过滤不符合规则的消息,也可以批量为消息添加一个头部,还可以担任一些统计性的工作。

public ProducerRecord<K, V> onSend(ProducerRecord<K, V> record);
public void onAcknowledgement(RecordMetadata metadata, Exception exception);
public void close();
  • onSend方法发生在消息序列化和计算分区之前
  • onAcknowledgement方法发生在消息被应答(Acknowledgement)之前或消息发送失败的时候,会在回调函数运行之前执行。

生产者可以有一个或多个拦截器。

多个拦截器的配合可能会出现问题,因为拦截器之间可能是互相依赖的,拦截器A执行失败,可能会使拦截器B也受到影响。一般来说,在一个拦截器链中,如果拦截器A执行失败,那么下一个拦截器会接着从上一个执行成功的拦截器继续执行。

文章末尾请带上以下文字及链接:本文正在参与「掘金小册免费学啦!」活动, 点击查看活动详情