sql >> Databáze >  >> NoSQL >> Redis

Jak používat ActionController::Live spolu s Resque + Redis (pro aplikaci Chat)

Předběžné požadavky:

  • Ruby 2.0.0+
  • Rails 4.0.0+
  • Redis
  • Puma

Inicializátor:

Vytvořte redis.rb inicializační soubor v config/initializers adresář, globalizující instanci redis . Je také dobré nastavit heartbeat vlákno (Cokoli od 5 sekund do 5 minut je v pořádku, v závislosti na vašich požadavcích):

$redis = Redis.new

heartbeat_thread = Thread.new do
  while true
    $redis.publish("heartbeat","thump")
    sleep 15.seconds
  end
end

at_exit do
  heartbeat_thread.kill
  $redis.quit
end

Ovladač:

Do ChatController musíte přidat dvě metody , pub a sub . Role pub je publikovat chatové události a zprávy na redis a sub k odběru těchto akcí. Mělo by to vypadat nějak takto:

class ChatController < ApplicationController
    include ActionController::Live

    skip_before_filter  :verify_authenticity_token

    def index
    end

    def pub
        $redis.publish 'chat_event', params[:chat_data].to_json
        render json: {}, status: 200
    end

    def sub
        response.headers["Content-Type"] = "text/event-stream"

        redis = Redis.new
        redis.subscribe(['chat_event', 'heartbeat']) do |on|
            on.message do |event, data|
                response.stream.write "event: #{event}\ndata: #{data}\n\n"
            end
        end
    rescue IOError
        logger.info "Stream Closed"
    ensure
        redis.quit
        response.stream.close
    end
end

Ve vašich routes , udělat hospodu POST a sub GET a cestu přiřaďte k něčemu jako /chat/publish a /chat/subscribe .

Coffeescript / Javascript:

Za předpokladu, že vaše skutečná webová stránka chatovací aplikace je na /chat , musíte napsat nějaký Javascript skutečně odesílat a přijímat chatové zprávy.

Pro snazší pochopení předpokládejme, že vaše webová stránka má pouze textové pole a tlačítko. Stisknutím tlačítka byste měli publikovat obsah textového pole do streamu chatu, můžeme to udělat pomocí AJAX:

$('button#send').click (e) ->
    e.preventDefault()
    $.ajax '/chat/publish',
        type: 'POST'
        data:
            chat_data: {
                message: $("input#message").val()
                timestamp: $.now()
        error: (jqXHR, textStatus, errorThrown) ->
            console.log "Failed: " + textStatus 
        success: (data, textStatus, jqXHR) ->
            console.log "Success: " + textStatus

Nyní musíte mít možnost přihlásit se k odběru a také přijímat chatové zprávy. Musíte použít EventSource pro tohle. Pomocí EventSource otevřete kanál pro SSE, abyste mohli přijímat události, a použijte tato data k aktualizaci zobrazení. V tomto příkladu je přihlásíme pouze do konzole javascriptu.

Kód by měl vypadat nějak takto:

$(document).ready ->
    source = new EventSource('/chat/subscribe')
    source.addEventListener 'chat_event', (e) ->
        console.log(e.data)

Poznámka: Umístěte oba výše uvedené bloky kódu do controllername.coffee soubor, v tomto příkladu by to mělo být chat.js.coffee ve vaší app/assets/javascript adresář. Musíte se také ujistit, že se načítá do potrubí aktiv. require ve vašem application.js soubor (pokud již nevoláte require tree . ).

Povolit paralelní požadavky:

Ve svém vývojovém prostředí budete muset povolit paralelní požadavky přidáním těchto dvou řádků do config/environments/development.rb :

config.preload_frameworks = true
config.allow_concurrency = true

Nyní spusťte prohlížeč, přejděte na /chat a uvidíte kouzlo. Když napíšete zprávu a kliknete na tlačítko, zpráva bude přijata všemi instancemi dané webové stránky.

Takhle vytvoříte základní chatovací aplikaci v rails pomocí ActionController::Live a Redis . Konečný kód by se samozřejmě velmi lišil v závislosti na vašich požadavcích, ale toto by vám mělo pomoci začít.

Některé další zdroje, které byste si měli prohlédnout:

  • Něžné milování – je to živé?
  • Railscasts – #401 – ActionController::Live
  • SitePoint – Mini Chat s Rails a SSE
  • Github – mohanraj-ramanujam / živé vysílání
  • Thoughtbot – příklad chatu pomocí SSE



  1. Jsou operace redis na datových strukturách bezpečné pro vlákna

  2. ruby resque bez nakládacích kolejnic prostředí

  3. Použití záloh k opravě běžných scénářů selhání pro MongoDB

  4. Jaký je nejlepší způsob použití Redis v prostředí Multi-threaded Rails? (Puma / Sidekiq)