Как использовать sidekiq, чтобы избежать соединения двух очередей - PullRequest
0 голосов
/ 12 февраля 2020

Прямо сейчас я использую Sidekiq, чтобы параллельно вычислить две вещи: tags & categories сообщения в блоге. Этот расчет должен произойти после того, как сообщение будет сохранено в базе данных. Итак, у меня есть:

class Post < ApplicationRecord

  after_commit :extract_tags_and_categories, if: :saved_change_to_content?

  private

  def extract_tags_and_categories
    TagsExtractorWorker(id)
    CategoriesExtractorWorker(id)
  end
end

Проблема в том, что я использую сторонний API, чтобы помочь мне получить только текст URL-адреса поста, и им обоим нужен его текст , Итак, я делаю:

class TagsExtractorWorker < Worker
  def perform(post_id)
    post = Post.find!(post_id)
    text = ThirdPartyAPI.get(post.url)
    # find out the tags here and save it to post.tags
  end
end
class CategoriesExtractorWorker < Worker
  def perform(post_id)
    post = Post.find!(post_id)
    text = ThirdPartyAPI.get(post.url)
    # find out the categories here and save it to post.categories
  end
end

Как вы можете себе представить, этот API не бесплатный и есть ограничение вызовов API (мне пришлось бы заплатить больше, чтобы получить возможность чтобы позвонить еще раз), и сейчас я делаю два звонка (на оба TagsExtractorWorker и CategoriesExtractorWorker). Я хотел бы иметь возможность назвать его только один раз, и использовать его в обоих классах. Есть ли у Sidekiq что-то, что может мне помочь с этим?

Кроме того, я не могу действительно использовать класс Post для этого:

class Post < ApplicationRecord

  after_commit :extract_tags_and_categories, if: :saved_change_to_content?

  private

  def extract_tags_and_categories
    text = get_text_somehow()
    TagsExtractorWorker(id, text)
    CategoriesExtractorWorker(id, text)
  end
end

Потому что я звоню другим вещам (кроме эти два класса), и я не хочу ждать, когда и создадут связь между вещами.

Мой вопрос: есть ли у sidekiq что-нибудь, что мне в этом поможет? Возможно, промежуточное программное обеспечение, которое будет извлекать текст и кэшировать его для других вызовов.

1 Ответ

1 голос
/ 12 февраля 2020

Вы должны иметь возможность кэшировать HTTP-ответ с вашим HTTP-клиентом, если ваш сторонний API отвечает с адекватными заголовками кэширования HTTP.

Я не знаю ничего в Sidekiq, который сделал бы это для вас , Лично я использовал для этого https://github.com/plataformatec/faraday-http-cache (с кеш-памятью memcache или redis) в прошлом.

Конечно, это будет вариант для вас, только если вы можете добавить промежуточное программное обеспечение для кэширования в ваш ThirdPartyAPI HTTP-клиент.

Если это сработает, ваши работники Sidekiq могут продолжать звонить через ThirdPartyAPI, как они и сейчас запрограммированы, фактически не затрагивая вашу третью сторону (и считая от вашей квоты).

...