sql >> Database teknologi >  >> NoSQL >> Redis

Sådan bruger du ActionController::Live sammen med Resque + Redis (til chatapplikation)

Forudgående krav:

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

Initializer:

Opret en redis.rb initializer-fil i config/initializers bibliotek, som globaliserer en forekomst af redis . Det er også en god idé at konfigurere et heartbeat tråd (Alt fra 5 sekunder til 5 minutter er okay, afhængigt af dine krav):

$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

Controller:

Du skal tilføje to metoder til din ChatController , pub og sub . Rollen som pub er at udgive chatbegivenheder og beskeder til redis og sub at abonnere på disse begivenheder. Det skulle se sådan ud:

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

I dine routes , lav pub en POST og sub en GET , og match stien til noget som /chat/publish og /chat/subscribe .

Coffeescript / Javascript:

Forudsat at din faktiske webside for chat-appen er på /chat , skal du skrive noget Javascript til rent faktisk at sende og modtage chatbeskeder.

For at lette forståelsen, lad os antage, at din webside kun har en tekstboks og en knap. Hvis du trykker på knappen, skal indholdet af tekstboksen offentliggøres til chatstrømmen, det kan vi gøre ved at bruge 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

Nu skal du også kunne abonnere og modtage chatbeskeder. Du skal bruge EventSource for det. Brug af EventSource , åbn en kanal for SSE, så du kan modtage begivenheder, og brug disse data til at opdatere visningen. I dette eksempel vil vi kun logge dem til javascript-konsollen.

Koden skulle se nogenlunde sådan ud:

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

Bemærk: Placer begge kodeblokke ovenfor i din controllername.coffee fil, for dette eksempel skal det være chat.js.coffee i din app/assets/javascript vejviser. Du skal også sørge for, at den bliver indlæst i aktivpipelinen. require det i din application.js fil (hvis du ikke allerede kalder require tree . ).

Aktiver parallelle anmodninger:

I dit udviklingsmiljø bliver du nødt til at aktivere parallelle anmodninger ved at tilføje disse to linjer til din config/environments/development.rb :

config.preload_frameworks = true
config.allow_concurrency = true

Tænd nu din browser, gå til /chat og se magien. Når du skriver en besked og klikker på knappen, vil beskeden blive modtaget af alle forekomster af den pågældende webside.

Nå, det er sådan, du laver en grundlæggende chatapplikation i rails ved hjælp af ActionController::Live og Redis . Den endelige kode ville naturligvis være meget anderledes afhængigt af dine krav, men dette burde få dig i gang.

Nogle flere ressourcer, du bør tjekke ud:

  • Tender Love Making - Er det live?
  • Railscasts - #401 - ActionController::Live
  • SitePoint - Minichat med skinner og SSE'er
  • Github - mohanraj-ramanujam / live-stream
  • Thoughtbot - Chateksempel ved hjælp af SSE'er



  1. MongoDB fuld og delvis tekstsøgning

  2. installer redis på aws micro-instans

  3. MongoDB $replaceOne

  4. Sådan indstilles mongod.conf bind_ip med flere ip-adresser