加入收藏 | 设为首页 | 会员中心 | 我要投稿 衡水站长网 (https://www.0318zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 传媒 > 正文

你上世纪写的代码现在还work吗?

发布时间:2021-02-13 11:55:15 所属栏目:传媒 来源:互联网
导读:息是写入成功的。ack 中有三种类型(String)的值 acks = 1:默认值为1,生产者发送消息之后,只要分区的leader 副本成功写入消息,那么它就会收到来自服务端的成功响应 。如果消息写入 leader 副本并返回成功响应给生产者,且在被其他 fo llower 副本拉取之前

息是写入成功的。ack 中有三种类型(String)的值

  1. acks = 1:默认值为1,生产者发送消息之后,只要分区的leader 副本成功写入消息,那么它就会收到来自服务端的成功响应 。如果消息写入 leader 副本并返回成功响应给生产者,且在被其他 fo llower 副本拉取之前 leader 副本崩溃,那么此时消息还是会丢失。
  2. acks = 0:生产者发送消 息之后不需要等待任何服务端的响应。如果在消息从发送到写入 Kafka 的过程中出现某些异常,导致 Kafka 并没有收到这条消息,那么生产者也无从得知,消息也就丢失了。在其他配置环境相同的情况下,acks 设置为 0 可以达到最大的吞吐量。
  3. acks = -1或 acks = all:生产者在消 息发送之后,需要等待 ISR 中的所有副本都成功 写入消息之后才能够收到来自服务端的成功响应。在其他配置环境相同的情况下,acks 设置为 1或(all)可以达到最强的可靠性

使用」:

properties.put(ProducerConfig.PARTITIONER_CLASS_CONFIG, MyPartitioner.class.getName());

自定义分区器使用起来也简单,只需要实现 Partitioner 接口

拦截器来了?

做 web 开发的同学相信对拦截器一点也不陌生,在 Kafka 中也具有拦截器的功能,拦截器又分为「生产者拦截器」和「消费者拦截器」

生产者拦截器可以在消息发送前做一些准备工作,比如按照某个规则过滤不符合要求的消息,修改消息的内容等,也可以用来在发送回调逻辑前做一些定制化的需求。

那么有需要就会有自定义,在自定义拦截器的时候我们只需要实现ProducerInterceptor接口即可:

 

述是 kafka 中的Partitioner 接口,可以看到里面有个方法partition()是用来计算分区号,返回 int 类型的值,其中六个参数分别代表:

  1. topic:主题
  2. key:键
  3. keyBytes:序列化后的键
  4. value:值
  5. valueBytes:序列化后的值
  6. cluster:集群的元数据信息

在partition()方法中定义了主要的分区分配逻辑,如果 key 不为空时,那么默认的分区器会对 key 进行haxi(采用MurmurHash2算法),最终根据得到的哈希值来计算分区号,拥有相同 key 的消息会被写入同一个分区,如果 key 为空,那么消息将会以轮询的方式发往主题内的各个可用分区。

「如果 key 不为 null,那么计算得到的分区号会是所有分区中的任意一个,如果 key 为 空 ,那么计算得到的分区号仅为可用分区中的任意一个」

当然,分区器也是可以自定义的,操作如下:

「MyPartitioner.class」:


(编辑:衡水站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读