使用 ruby-kafka(0.7.4) gem在实例失败期间不丢失数据的情况下,在RoR中实施Kafka生产者的最佳方法是什么?
该消息是从多个线程产生的。因此,仅调用 deliver_message 方法将不起作用。因此,使用 async_producer 和 delivery_interval为30秒,delivery_threshold为1000条消息。
使用 async_producer 的问题在于,如果实例关闭,我的所有消息都将丢失。无论如何,我可以保留这些消息吗?还是其他更好的方法可以做到这一点?
def asyncThreadProduce
threads=[]
kaf = Kafka.new("localhost:9093")
producer = kaf.async_producer(
delivery_threshold: 1000,
delivery_interval: 30,
)
threads << Thread.new{
1000.times do |n|
producer.produce(n.to_s + 'a', topic: 'test_topic')
end
}
threads << Thread.new{
1000.times do |n|
producer.produce(n.to_s + 'b', topic: 'test_topic')
end
}
threads.each { |thr| thr.join }
end
上面的代码是对所发生情况的模拟。它以预期的方式工作。唯一的问题是,在实例失败的情况下如何防止在后台线程中出现消息?
谢谢!