2015-07-25 1 views
0

Я использую Twitter gem и Devise/Omniauth для выполнения действий от имени пользователя. Все идет гладко, и я могу успешно чирикать для людей. Однако что-то неловкое.Rails: Персистент клиента из щебетать от sferik

Как вы, ребята, сохраняете клиента Twitter? То есть

client = Twitter::REST::Client.new do |config| 
    config.consumer_key = Rails.application.secrets.twitter_consumer_key 
    config.consumer_secret = Rails.application.secrets.twitter_consumer_secret 
    config.access_token = 'xxxx' 
    config.access_token_secret = 'xxxx' 
end 

В моем мозгу не имеет смысла создавать экземпляр клиента перед каждым последующим вызовом API. Твиттер, как вы знаете, будет оценивать ограничение вас через некоторое время.

Итак, каков наилучший способ сохранить «клиент» на протяжении всего сеанса?

ответ

1

Фактически, создание экземпляра клиента 100 раз не связано с более тесной связью с Твиттером, чем создание экземпляра его один раз; фактический использует клиента, который вызывает сетевой трафик и, следовательно, имеет значение. Но вы не ошибаетесь в том, что нет никакой реальной причины повторно создавать его каждый раз. У вас есть несколько вариантов, в зависимости от вашего прецедента:

  • Использовать инициализатор Rails. То есть вы можете создать свой экземпляр клиента в config/initializers/twitter.rb и назначить его чему-то глобально доступному, например константу (TwitterClient = Twitter::REST::Client.new do ...). Это нормально, если ваша конфигурация никогда не изменяется, если вы не перераспределяете приложение, и - что важно - если клиент Twitter - thread-safe. Это часто неверное предположение для драгоценных камней Ruby, но если вы работаете на MRI, вам, вероятно, не нужно беспокоиться об этом.
  • Внутри любого объекта, в котором используется клиент Twitter, кешируйте экземпляр. Самый простой способ сделать это так:

    def twitter_client 
        @twitter_client ||= Twitter::REST::Client.new do ... 
    end 
    
    # ... 
    
    def other_method 
        twitter_client.do_something(foo: "bar") 
    end 
    

    Однако, пробег может варьироваться - экземпляр переменного Кешируются палочки вокруг до тех пор, пока объект делает, что для контроллера только в течение одного запроса. Вы также можете кэшировать его в переменную класса, но это фактически то же самое, что и первый вариант выше.

В конечном счете, создание объектов Ruby довольно дешево, поэтому я бы не стал слишком беспокоиться об этом. Попытка избежать создания экземпляров объектов часто заканчивается тем, что вы тратите больше времени на разработку, чем на самом деле экономить на производстве (как и при большинстве преждевременных оптимизаций).

+0

Если экземпляр нового клиента Twitter не учитывает ваши вызовы API, то я полностью согласен с вашей второй маркой. На самом деле, это уже то, как я работаю. С моей стороны, вероятно, было плохое предположение, что создание клика Twitter-клиента [this] (https://dev.twitter.com/rest/reference/get/account/verify_credentials), которое допускает очень мало запросов. 15 за 15 минут. Спасибо. Я буду продолжать, как я! – mhaliski

0

При инициализации клиента Twitter в инициализаторе лучше не включать токен доступа и секретный токен доступа в инициализаторе, поскольку это значение будет отличаться от пользователя к пользователю. И при инициализации его для любых переменных локального/экземпляра попытайтесь использовать TWITTERCLIENT .dup, потому что он создаст другой идентификатор объекта для вашего экземпляра, если вы будете использовать ту же константу, то любое изменение переменных экземпляра повлияет на константу.

Смежные вопросы