在红宝石中实现kafka生产者的最佳方法而不会丢失数据

时间:2019-01-29 05:51:45

标签: ruby-on-rails ruby apache-kafka kafka-producer-api ruby-kafka

使用 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

上面的代码是对所发生情况的模拟。它以预期的方式工作。唯一的问题是,在实例失败的情况下如何防止在后台线程中出现消息?

谢谢!

0 个答案:

没有答案