Laravel socket chat en vivo sin un evento de transmisión

Uso websockets de Laravel y Echo para crear un chat en vivo de simpel. Pero hay algo que no entiendo.

Tengo 2 servidores:

  1. Aplicación Laravel con Laravel Echo (el frontend de chat)
  2. Servidor Laravel con Websocket Laravel instalado.

Cuando un usuario envía un mensaje, una solicitud de correo irá al servidor 1. El servidor 1 enviará un evento de mensaje enviado al servidor de sockets (servidor 2):

event(new NewMessage($channel, $message));

Mientras tanto el chat está escuchando el servidor de socket:

    Echo.channel(channel).listen('NewMessage', (data) => {
        console.log(data.question)
    })

Todo esto funciona bien, y según la documentación leí que este es el camino a seguir. El problema que tengo, es que siento que la solicitud de correo para enviar un mensaje es completly innecesaria. No guardo el mensaje en una base de datos ni nada. Así que lo único que hace la solicitud de correo es enviar el mensaje a un servidor, que luego envía el mensaje al siguiente servidor. Así que es una solicitud de correo innecesaria para cada mensaje enviado.

En los docs mencionan algo acerca de Laravel echo Whisper, que utilizan para enviar un "alguien está escribiendo" tipo de actualización:

.whisper('typing', {
    name: "me"
});

y escuchar mensajes:

.listenForWhisper('typing', (e) => {
    console.log(e.name);
});

¿Sería inteligente usar esto para enviar mensajes? ¿O hay otra manera de evitar la solicitud de correo?

Pregunta hecha hace 3 años, 4 meses, 29 días - Por codeglitch


2 Respuestas:

  • La función whisper de Laravel Echo se usa específicamente para enviar eventos de forma privada a un solo usuario o a un grupo específico de usuarios. En tu caso, si deseas evitar la solicitud de correo innecesaria para enviar un mensaje al servidor de sockets, podrías considerar usar whisper en lugar de enviar un evento público con event.

    En tu situación, podrías hacer algo así:

    En tu servidor 1, en lugar de enviar el evento de mensaje de forma pública:

    php
    event(new NewMessage($channel, $message));
    

    Podrías enviarlo de forma privada utilizando whisper:

    php
    $user = Auth::user(); // Obtén al usuario actual o al usuario específico al que deseas enviar el mensaje
    $user->notify(new NewMessage($channel, $message));
    

    Luego, en tu cliente, puedes escuchar el mensaje utilizando listenForWhisper en lugar de listen:

    javascript
    Echo.private('user.' + user_id) // Escucha mensajes privados para un usuario específico
        .listenForWhisper('NewMessage', (data) => {
            console.log(data.message)
        });
    

    Esto permitirá enviar mensajes de forma privada directamente al servidor de sockets sin necesidad de la solicitud de correo. Solo asegúrate de ajustar el código según tus necesidades específicas y estructuras de datos.

    Espero que esta solución te ayude a evitar la solicitud de correo innecesaria en tu aplicación de chat en vivo con Laravel y Echo. ¡Si tienes más preguntas, no dudes en decírmelo!

    Respondida el Dec 19, 2020 a las 12:06 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Uso de Laravel Echo Whisper

    Puedes utilizar Laravel Echo Whisper para enviar mensajes sin realizar una solicitud HTTP. Esto es útil cuando no necesitas almacenar mensajes en una base de datos.

    Para usar Whisper, sigue estos pasos:

    • En el servidor de aplicaciones Laravel (frontend de chat):
    php
    event(new NewMessage($channel, $message));
    
    // Whisper para notificar a otros usuarios que estás escribiendo (opcional)
    Echo::channel($channel)
           
    • >whisper('typing', ['name' => 'me']);
    • En el servidor Laravel con WebSockets:
    php
    Echo::channel(channel)
           
    • >listenForWhisper('typing', (e) => {
    console.log(e.name); }); Echo::channel(channel)
    • >listen('NewMessage', (data) => {
    console.log(data.message); });

    Ventajas de usar Whisper:

    Elimina la necesidad de una solicitud HTTP para cada mensaje enviado. Reduce la latencia y mejora el rendimiento. Es fácil de implementar y usar.

    Nota:

    Whisper solo funciona para eventos personalizados, no para eventos de transmisión predeterminados como "MessageSent". Asegúrate de utilizar un canal privado al utilizar Whisper para evitar que usuarios no autorizados reciban mensajes.

    Solución alternativa

    Si no deseas utilizar Whisper, puedes utilizar un evento de transmisión personalizado en lugar de una solicitud de correo. Esto implica crear tu propio evento y escucharlo en el servidor WebSockets.

    Ejemplo:*

    • En el servidor de aplicaciones Laravel:
    php
    broadcast(new MyCustomEvent($channel, $message));
    
    • En el servidor Laravel con WebSockets:
    php
    Echo::channel(channel)
           
    • >listen('MyCustomEvent', (data) => {
    console.log(data.message); });

    Esta solución también elimina la necesidad de una solicitud HTTP, pero requiere un poco más de configuración personalizada.

    Respondida el Dec 19, 2020 a las 12:16 - por Gemini

    Votos positivos: 0 | Votos negativos: 0