kafka系列(二)

本章承接kafka一内容,文章在本人博客主页都有,可以自行点击浏览。

幂等性

请求执行多次,但执行的结果是一致的。

如果,某个系统是不具备幂等性的,如果用户重复提交了某个表格,就可能会造成不良影响。例如:用户在浏览器上点击了多次提交订单按钮,会在后台生成多个一模一样的订单。

kafka幂等性

在生产者生产消息时,如果出现retry时,有可能会一条消息被发送了多次,如果Kafka不具备幂等性的,就有可能会在partition中保存多条一模一样的消息。

配置

props .put(" enable.idempotence " ,true);

原理

为了实现生产者的幂等性,Kafka引入了 Producer ID(PID)和 Sequence Number的概念。

PID:每个Producer在初始化时,都会分配一个唯一的PID,这个PID对用户来说,是透明的。

Sequence Number:针对每个生产者(对应PID)发送到指定主题分区的消息都对应一个从0开始递增的Sequence Number。

如果同一个生产者,发送的消息序列号一致了,那么消息就已经存在了。

消费者组Rebalance机制

Rebalance再均衡

Kafka中的Rebalance称之为再均衡,是Kafka中确保Consumer group下所有的consumer如何达成一致,分配订阅的topic的每个分区的机制。

Rebalance触发的时机有:

  1. 消费者组中consumer的个数发生变化。例如:有新的consumer加入到消费者组,或者是某个consumer停止了。
  2. 订阅的topic个数发生变化。消费者可以订阅多个主题,假设当前的消费者组订阅了三个主题,但有一个主题突然被删除了,此时也需要发生再均衡。
  3. 订阅的topic分区数发生变化

坏处

  1. 发生Rebalance时,consumer group下的所有consumer都会协调在一起共同参与,Kafka使用分配策略尽可能达到最公平的分配
  2. Rebalance过程会对consumer group产生非常严重的影响,Rebalance的过程中所有的消费者都将停止工作,直到Rebalance完成

消费者分区分配策略

range范围分配

Range范围分配策略是Kafka默认的分配策略,它可以确保每个消费者消费的分区数量是均衡的。

注意:Rangle范围分配策略是针对每个Topic的。

轮询分配

RoundRobinAssignor轮询策略是将消费组内所有消费者以及消费者所订阅的所有topic的partition按照字典序排序(topic和分区的hashcode进行排序),然后通过轮询方式逐个将分区以此分配给每个消费者。

粘性分配

没有重新分配的时候和轮询一样,当消费者挂掉的时候,发生重新分配,尽可能保留之前的分配不变,将挂点的消费者上绑定的分区平均分配到没挂掉的消费者上面。由于rebalance发生,导致消费者需要重新消费之前正在处理的分区,导致不必要的系统开销。(例如:某个事务正在进行就必须要取消了)

副本机制

副本的目的就是冗余备份,当某个Broker上的分区数据丢失时,依然可以保障数据可用。因为在其他的Broker上的副本是可用的。

producer的ACKs参数

对副本关系较大的就是,producer配置的acks参数了,acks参数表示当生产者生产消息的时候,写入到副本的要求严格程度。它决定了生产者如何在性能和可靠性之间做取舍。

确认机制 说明
acks=0 生产者在成功写入消息之前不会等待任何来自服务器的响应,消息有丢失的风险,但是速度最快
acks=1(默认值) 只要集群首领节点收到消息,生产者就会收到一个来自服务器的成功响应
acks=all 只有当所有参与赋值的节点全部收到消息时,生产者才会收到一个来自服务器的成功响应

Kafka的数据存储形式

  1. 一个topic由多个分区组成
  2. 一个分区(partition)由多个segment(段)组成
  3. 一个segment(段)由多个文件组成(log、index、timeindex)

​​​​​​​Kafka配额限速机制(Quotas)

生产者和消费者以极高的速度生产/消费大量数据或产生请求,从而占用broker上的全部资源,造成网络IO饱和。有了配额(Quotas)就可以避免这些问题。Kafka支持配额管理,从而可以对Producer和Consumer的produce&fetch操作进行流量限制,防止个别业务压爆服务器。

​​​​​​​限制producer端速率

为所有client id设置默认值,以下为所有producer程序设置其TPS不超过1MB/s,即1048576‬/s,命令如下:

|------------------------------------------------------------------------------------------------------------------------------------------------|
| bin/kafka-configs.sh --zookeeper node1.itcast.cn:2181 --alter --add-config 'producer_byte_rate=1048576' --entity-type clients --entity-default |

运行基准测试,观察生产消息的速率

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| bin/kafka-producer-perf-test.sh --topic test --num-records 500000 --throughput -1 --record-size 1000 --producer-props bootstrap.servers:9092=node1.itcast.cn,node2.itcast.cn:9092,node3.itcast.cn:9092 acks=1 |

结果:

50000 records sent, 1108.156028 records/sec (1.06 MB/sec)

​​​​​​​限制consumer端速率

对consumer限速与producer类似,只不过参数名不一样。

为指定的topic进行限速,以下为所有consumer程序设置topic速率不超过1MB/s,即1048576/s。命令如下:

|------------------------------------------------------------------------------------------------------------------------------------------------|
| bin/kafka-configs.sh --zookeeper node1.itcast.cn:2181 --alter --add-config 'consumer_byte_rate=1048576' --entity-type clients --entity-default |

运行基准测试:

|------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| bin/kafka-consumer-perf-test.sh --broker-list node1.itcast.cn:9092,node2.itcast.cn:9092,node3.itcast.cn:9092 --topic test --fetch-size 1048576 --messages 500000 |

结果为:

MB.sec:1.0743

​​​​​​​取消Kafka的Quota配置

使用以下命令,删除Kafka的Quota配置

|-------------------------------------------------------------------------------------------------------------------------------------------|
| bin/kafka-configs.sh --zookeeper node1.itcast.cn:2181 --alter --delete-config 'producer_byte_rate' --entity-type clients --entity-default |
| bin/kafka-configs.sh --zookeeper node1.itcast.cn:2181 --alter --delete-config 'consumer_byte_rate' --entity-type clients --entity-default |

相关推荐
weixin_437398212 小时前
RabbitMQ深入学习
java·分布式·后端·spring·spring cloud·微服务·rabbitmq
心碎土豆块3 小时前
hadoop的运行模式
大数据·hadoop·分布式
2301_780789663 小时前
高防ip是怎么做到分布式防御的
分布式·网络协议·tcp/ip·游戏·ddos·高防ip·高防cdn
Timmer丿3 小时前
kafka学习笔记(四、生产者、消费者(客户端)深入研究(三)——事务详解及代码实例)
java·笔记·学习·kafka
搏博4 小时前
软件工程之形式化说明技术深度解析
分布式·软件工程·软件构建·软件需求
XQ丶YTY6 小时前
记录一下学习kafka的使用以及思路
分布式·学习·kafka
马剑威(威哥爱编程)7 小时前
HarmonyOS 5.0 分布式数据协同与跨设备同步
分布式·华为·harmonyos·arkts·harmonyos-next
全栈工程师修炼指南8 小时前
解锁 Jenkins Agent 技巧,容器化轻松实现分布式构建节点扩展
运维·分布式·jenkins
黄俊懿9 小时前
【深入理解SpringCloud微服务】手写实现一个微服务分布式事务组件
java·分布式·后端·spring·spring cloud·微服务·架构师
Themberfue9 小时前
RabbitMQ ②-工作模式
开发语言·分布式·后端·rabbitmq