Как эффективно использовать Kafka вместо Sidekiq для фоновой работы в Rails?

В настоящее время я использую sidekiq для фоновых заданий в приложении rails. Теперь я хочу использовать Kafka для того же, используя механизм потребитель-производитель. Для этого я используюruby-kafkaи создание сообщений асинхронно.

Мой подход: вperform метод MyNewJob < ApplicationJob Я звоню на работу produce метод Кафки и когда consumer получает сообщение, я выполняю фактический фрагмент кода (который ранее выполнялся внутри метода выполнения) внутри нового метода класса MyNewJob.

Он работает, как ожидалось. Я хочу подтвердить, правильный это подход или нет? Если нет, то каким должен быть правильный подход?

Псевдокод:

Я позвоню на работу, используя любой из MyNewJob.perform_now или MyNewJob.perform_later и т.п.

my_new_job.rb

class MyNewJob < ApplicationJob

  queue_as TestMixin::QUEUE_NAME

  rescue_from(App::ServerError) do
    retry_job wait: Rails.application.config.retry_interval
  end

  def perform(paylaod)
    #producing message asynchronously
    producer = kafka.async_producer
    producer.produce(payload, topic: "topic_name")
  end

  def self.run_job(payload)
    #code to executed previously written inside perform method above.
  end

end

consumer.rb (псевдокод)

  #client consumer topic subscribe logic and then start consuming.
  consumer.each do |message|
    MyNewJob.run_job(message.payload)
  end

Я также думаю о другом подходе, при котором я не буду приноситьApplicationJob class и напрямую создавать сообщение в Kafka вместо вызова Job.

Пожалуйста подтвердите.

Изменить 1: я использую ruby-kafka с асинхронным производителем (kafka.async_producer).

0 ответов

Другие вопросы по тегам