sql >> Base de Datos >  >> NoSQL >> Redis

Cómo usar ActionController::Live junto con Resque + Redis (para la aplicación de chat)

Requisitos previos:

  • Rubí 2.0.0+
  • Rieles 4.0.0+
  • Redis
  • Puma

Inicializador:

Crear un redis.rb archivo de inicialización en config/initializers directorio, globalizando una instancia de redis . También es una buena idea configurar un heartbeat hilo (cualquier cosa entre 5 segundos y 5 minutos está bien, según sus requisitos):

$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

Controlador:

Debe agregar dos métodos a su ChatController , pub y sub . El rol de pub es publicar eventos de chat y mensajes en redis y sub para suscribirse a estos eventos. Debería ser algo como esto:

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

En tus routes , hacer pub un POST y suscribir un GET y haga coincidir la ruta con algo como /chat/publish y /chat/subscribe .

Coffescript/Javascript:

Suponiendo que su página web real para la aplicación de chat esté en /chat , necesitas escribir algo de Javascript para enviar y recibir mensajes de chat.

Para facilitar la comprensión, supongamos que su página web solo tiene un cuadro de texto y un botón. Presionar el botón debería publicar el contenido del cuadro de texto en la transmisión de chat, podemos hacerlo usando 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

Ahora, debe poder suscribirse y recibir los mensajes de chat también. Necesitas usar EventSource para esto. Uso de Fuente de eventos , abra un canal para SSE para que pueda recibir eventos y use esos datos para actualizar la vista. En este ejemplo, solo los registraremos en la consola de JavaScript.

El código debería verse así:

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

Nota: Coloque los dos bloques de código de arriba en su controllername.coffee archivo, para este ejemplo debería ser chat.js.coffee en tu app/assets/javascript directorio. También debe asegurarse de que se esté cargando en la canalización de activos. require en tu application.js archivo (si aún no está llamando a require tree . ).

Habilitar solicitudes paralelas:

En su entorno de desarrollo, deberá habilitar las solicitudes paralelas agregando estas dos líneas a su config/environments/development.rb :

config.preload_frameworks = true
config.allow_concurrency = true

Ahora abra su navegador, vaya a /chat y ver la magia. Cuando escribe un mensaje y hace clic en el botón, el mensaje será recibido por todas las instancias de esa página web.

Bueno, así es como se hace una aplicación de chat básica en rails usando ActionController::Live y Redis . El código final obviamente sería muy diferente según sus requisitos, pero esto debería ayudarlo a comenzar.

Algunos recursos más que debería consultar:

  • Tender Love Making - ¿Es en vivo?
  • Railscasts - #401 - ActionController::Live
  • SitePoint - Mini Chat con Rails y SSE
  • Github - mohanraj-ramanujam / transmisión en vivo
  • Thoughtbot:ejemplo de chat con SSE