2015-12-29 3 views
1

Я продолжаю получать 503 ошибки через 30 секунд после того, как клиент отправит сообщение через faye. Через 30 секунд клиент получает сообщение, и он добавляется в чат, но ошибка все еще происходит, и сокет в конце концов будет закрыт. Как я могу изменить свой существующий код, чтобы сохранить сетевой ресурс? И как я могу избавиться от 30-секундной задержки, которую бросает герою, когда отправляется сообщение?Faye Сообщения на Heroku

сообщений/add.js.erb

<% broadcast @path do %> 
    var $chat = $("#chat<%= @conversation.id %>"); 
    $chat.append("<%= j render(@message) %>"); 
    //Set the scroll bar to the bottom of the chat box 
    var messageBox = document.getElementById('chat<%= @conversation.id %>'); 
    messageBox.scrollTop = messageBox.scrollHeight; 
<% end %> 
$("#convoId<%[email protected]%>")[0].reset(); 

application_helper.rb

def broadcast(channel, &block) 
    message = {:channel => channel, :data => capture(&block), :ext => {:auth_token => FAYE_TOKEN}} 
    uri = URI.parse(FAYE_END_PT) 
    Net::HTTP.post_form(uri, :message => message.to_json) 
end 

application.rb

config.middleware.delete Rack::Lock 
config.middleware.use FayeRails::Middleware, mount: '/faye', :timeout => 25 

faye.ru

require 'faye' 
require File.expand_path('../faye_token.rb', __FILE__) 

class ServerAuth 
    def incoming(message, callback) 
    if message['channel'] !~ %r{^/meta/} 
     if message['ext']['auth_token'] != FAYE_TOKEN 
     message['error'] = 'Invalid authentication token' 
     end 
    end 
    callback.call(message) 
    end 
end 
Faye::WebSocket.load_adapter('thin') 
faye_server = Faye::RackAdapter.new(:mount => '/faye', :timeout => 45) 
faye_server.add_extension(ServerAuth.new) 
run faye_server 

PROCFILE

web: bundle exec rails server -p $PORT 
worker: bundle exec foreman start -f Procfile.workers 

Procile.workers

faye_worker: rackup middlewares/faye.ru -s thin -E production 

503 Ошибка

/messages/add Failed to load resource: the server responded with a status of 503 (Service Unavailable) 

Я попытался добавить работника к героку вместе с веб-дино, не повезло. Все работает нормально на моем локальном хосте при запуске heroku local. Процесс на местном взгляд хозяина, как

forego | starting web.1 on port 5000 
forego | starting worker.1 on port 5100 
worker.1 | 20:33:18 faye_worker.1 | started with pid 16534 

где, как даже с веб-дино и работника на Heroku

=== web (1X): bundle exec rails server -p $PORT 
web.1: up 2015/12/28 20:08:02 (~ 1h ago) 

=== worker (1X): bundle exec foreman start -f Procfile.workers 
worker.1: up 2015/12/28 21:18:39 (~ 40s ago) 

Много этого кода был взят из различных учебных пособий так что надеюсь, если мы сможем решить эту проблему вопрос будет делать с помощью Faye с Heroku легче кому-то другому. Благодаря!

ответ

0

Heroku имеет 30-секундный таймаут для всех запросов, после чего повышается ошибка H12. https://devcenter.heroku.com/articles/limits#http-timeouts

Если ваш запрос занимает больше 30 секунд, вы должны рассмотреть вопрос о его включении в фоновое задание, например, с помощью Delayed_Job или Sidekiq.