Redis
 sql >> Baza danych >  >> NoSQL >> Redis

Jak używać ActionController::Live wraz z Resque + Redis (dla aplikacji Chat)

Wymagania wstępne:

  • Rubin 2.0.0+
  • Szyny 4.0.0+
  • Ponownie
  • Puma

Inicjator:

Utwórz plik redis.rb plik inicjujący w config/initializers katalog, globalizując instancję redis . Dobrym pomysłem jest również ustawienie heartbeat wątek (Wszystko od 5 sekund do 5 minut jest w porządku, w zależności od Twoich wymagań):

$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

Kontroler:

Musisz dodać dwie metody do swojego ChatController , pub i sub . Rola pub jest publikowanie wydarzeń i wiadomości czatu w redis i sub aby zapisać się na te wydarzenia. Powinno to wyglądać mniej więcej tak:

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

W Twoich routes , utwórz publikację POST i sub GET i dopasuj ścieżkę do czegoś takiego jak /chat/publish i /chat/subscribe .

Skrypt kawowy / Javascript:

Zakładając, że Twoja rzeczywista strona internetowa aplikacji czatu znajduje się pod adresem /chat , musisz napisać jakiś Javascript aby faktycznie wysyłać i odbierać wiadomości na czacie.

Dla ułatwienia załóżmy, że Twoja strona internetowa ma tylko pole tekstowe i przycisk. Naciśnięcie przycisku powinno opublikować zawartość pola tekstowego w strumieniu czatu, możemy to zrobić za 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

Teraz musisz mieć możliwość subskrybowania i odbierania wiadomości na czacie. Musisz użyć EventSource dla tego. Korzystanie z Źródła zdarzeń , otwórz kanał dla SSE, aby móc odbierać zdarzenia i używać tych danych do aktualizowania widoku. W tym przykładzie zarejestrujemy je tylko w konsoli javascript.

Kod powinien wyglądać mniej więcej tak:

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

Uwaga: Umieść oba powyższe bloki kodu w swoim controllername.coffee plik, w tym przykładzie powinien to być chat.js.coffee w Twojej app/assets/javascript informator. Musisz również upewnić się, że jest ładowany do potoku zasobów. require w swoim application.js plik (jeśli jeszcze nie wywołujesz require tree . ).

Włącz żądania równoległe:

W swoim środowisku programistycznym będziesz musiał włączyć żądania równoległe, dodając te dwie linie do swojego config/environments/development.rb :

config.preload_frameworks = true
config.allow_concurrency = true

Teraz uruchom przeglądarkę, przejdź do /chat i zobacz magię. Po wpisaniu wiadomości i kliknięciu przycisku wiadomość zostanie odebrana przez wszystkie wystąpienia tej strony internetowej.

Oto jak tworzysz podstawową aplikację do czatu w rails za pomocą ActionController::Live i Redis . Ostateczny kod będzie oczywiście bardzo różny w zależności od Twoich wymagań, ale to powinno Cię zacząć.

Więcej zasobów, które powinieneś sprawdzić:

  • Czuła miłość — czy jest na żywo?
  • Railscasts — #401 — ActionController::Live
  • SitePoint - Miniczat z Railsami i SSE
  • Github - mohanraj-ramanujam / transmisja na żywo
  • Thinkbot — przykład czatu z użyciem SSE



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. hdel wewnątrz bloku hget nodejs redis

  2. Jak komunikować się z hamowniami Web i Worker z Node.js na Heroku?

  3. Wydajny sposób mapowania danych z Redis

  4. Redis AOF fsync (ZAWSZE) vs. drzewo LSM

  5. Listy Redis