Closed dengbo closed 7 years ago
你可以关掉spout 多线程
spout.single.thread: false
jstorm spout 为什么要2个线程,主要是读写分离, nexttuple是发送, ack是接收, 将2个动作揉在一起, 那任何一个动作不能block另外一个动作,否则会出很多问题, 分开后,pipeline会更通畅。
现在kafka-storm这个设计已经被storm强奸了, 导致一个错误的设计就这么一直这样用。理论上nexttuple 就只能读不能
rocketmq-jstorm里面所有对偏移量的修改都是在ack线程中, 性能更好
当TOPOLOGY_MAX_SPOUT_PENDING设置不为1的时候,ack和nextTuple分属两个线程,两个线程都会对PartitionConsumer中的pendingOffsets产生修改,而这个数据结构是非线程安全的,最终会导致竞态,使得程序卡住,处于不可预期状态