这个故障在我们前段时间线上服务碰到过,具体的问题描述跟KAFKA-1415里提及的完全一样。
简单概括就是,正常情况下,使用kafka异步producer.send()发送消息时,会在后台创建一个守护线程,通过jstack查看jvm线程堆栈信息会找到这个线程,默认名称:ProducerSendThread-。ProducerSendThread驻留在后台,负责将待发送的消息批量往kafka topic转移。
"ProducerSendThread-" prio=10 tid=0x00007f6b3c01c800 nid=0x40fa waiting on condition [0x00007f6b90510000] java.lang.Thread.State: TIMED_WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00007f6bc6d53cd8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:198)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.

当使用Kafka异步producer.send()时,出现ProducerSendThread线程死亡导致所有调用线程阻塞的问题。原因是消息队列积压达到上限,queue.buffering.max.messages设置为10000。临时解决方案是设置queue.enqueue.timeout.ms避免阻塞,但可能导致消息丢失。故障引发对后台线程数量和稳定性问题的思考。
最低0.47元/天 解锁文章
1304

被折叠的 条评论
为什么被折叠?



