Как эффективно использовать 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
).