alibaba / jstorm

Enterprise Stream Process Engine
http://jstorm.io
Apache License 2.0
3.91k stars 1.81k forks source link

kafka spout race condition #553

Closed dengbo closed 7 years ago

dengbo commented 7 years ago

当TOPOLOGY_MAX_SPOUT_PENDING设置不为1的时候,ack和nextTuple分属两个线程,两个线程都会对PartitionConsumer中的pendingOffsets产生修改,而这个数据结构是非线程安全的,最终会导致竞态,使得程序卡住,处于不可预期状态

longdafeng commented 7 years ago

你可以关掉spout 多线程

Force spout use single thread

spout.single.thread: false

jstorm spout 为什么要2个线程,主要是读写分离, nexttuple是发送, ack是接收, 将2个动作揉在一起, 那任何一个动作不能block另外一个动作,否则会出很多问题, 分开后,pipeline会更通畅。

现在kafka-storm这个设计已经被storm强奸了, 导致一个错误的设计就这么一直这样用。理论上nexttuple 就只能读不能

rocketmq-jstorm里面所有对偏移量的修改都是在ack线程中, 性能更好