kafka线程模型之三 QuotaManager

本文探讨了Kafka从0.9版本引入的配额机制,主要关注QuotaManager的设计与实现。QuotaManager用于限制producer和consumer的生产和消费速度。通过delayQueue实现节流功能,当实际速度超过预设配额时,会抛出QuotaViolationException。文中还介绍了Rate类的工作原理,利用时间槽实现渐进式更新,以达到配额控制的目标。
摘要由CSDN通过智能技术生成

kafka从0.9版本之后引入了配额机制,对于每个producer或者consumer,可以对他们produce或者consum的速度上限作出限制.这边找到一篇不错的文档,可以解释这一配额的设计理念与实现方式.

kafka配额控制

这其实对应着kafka中的两个线程,限制producer的线程,以及限制consumer的线程.

"ThrottledRequestReaper-Fetch" #24 prio=5 os_prio=0 tid=0x00007fadb4ad2800 nid=0x11a61 waiting on condition [0x00007fac97ffe000]
   java.lang.Thread.State: TIMED_WAITING (parking)
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for  <0x00000000c86003a8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
	at java.util.concurrent.DelayQueue.poll(DelayQueue.java:259)
	at kafka.server.ClientQuotaManager$ThrottledRequestReaper.doWork(ClientQuotaManager.scala:158)
	at kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:63)

"ThrottledRequestReaper-Produce" #25 prio=5 os_prio=0 tid=0x00007fadb4ad7000 nid=0x11a62 waiting on condition [0x00007fac97efd000]
   java.lang.Thread.State: TIMED_WAITING (parking)
	at sun.misc.Unsafe.park(Native Method)
	- parking to wait for  <0x00000000c85e33c8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
	at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
	at java.util.concurrent.DelayQueue.poll(DelayQueue.java:259)
	at kafka.server.ClientQuotaManager$ThrottledRequestReaper.doWork(ClientQuotaManager.scala:158)
	at kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:63)

我认为QuatoManager是很有学习意义的.起码从两个方面,一是对于kafka这样请求回复式的结构,如何尽可能优雅地实现节流. 二是如何能尽可能优雅地监测一个client的流量.

关于Kafka中的commons.metrics我已经写过一篇文章介绍了,有兴趣的同学可以看这个连接kafka性能监控之KafkaMetrics Sensor

接下来我会介绍一下,具体kafka是如何使用delayQueue来实现Quato功能的,在我刚才给的那个链接里提到了,每一次broker发送response时都会记录下当前consume或者produce了多少字节,如果超出配额就会抛出QuatoVioLationException的异常.

try {
  clientSensors.quotaSensor.record(value)
  // trigger the callback immediately if quota is not violated
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值