Configuración del desarrollador: alta disponibilidad y conexión múltiple

En este documento se muestra cómo configurar un clúster de alta disponibilidad en la máquina de un desarrollador. También se proporcionan instrucciones sobre cómo habilitar en él una conexión múltiple, junto con los cambios necesarios para configurar un clúster de conexión múltiple de alta disponibilidad.

Para configurar un entorno de producción, sigue las instrucciones relevantes indicadas en la sección Configuraciones de producción.

Antes de empezar

Si anteriormente seguiste las instrucciones indicadas en Configuración del desarrollador: instancia única para configurar el cliente de la API de WhatsApp Business en la máquina de un desarrollador, sigue la guía de migración antes de continuar con el resto de este documento.

Para el contenido de esta guía, se supone que realizarás una instalación nueva.

Necesitarás lo siguiente:

  • Docker Compose
    • Debería estar incluido en la instalación de Docker pero, si no es así, puedes instalarlo.
  • Una cuenta de pruebas configurada localmente en un entorno de desarrollo
    • Sirve para agilizar el desarrollo y probar nuevos lanzamientos.

También es muy recomendable que leas la guía de disponibilidad y escalado para obtener más información acerca de la alta disponibilidad y la conexión múltiple.

Configuración de un clúster de alta disponibilidad

Paso 1: crear un directorio biz para los scripts de configuración

Ejecuta el código siguiente en tu ubicación preferida para el cliente de la API de WhatsApp Business:

mkdir ~/biz; cd ~/biz;

Paso 2: obtener los archivos de configuración del cliente de la API de WhatsApp Business

Los archivos de configuración del cliente de la API de WhatsApp Business se encuentran en el repositorio de Github WhatsApp-Business-API-Setup-Scripts. Puedes configurar el cliente de la API de WhatsApp Business con una instancia de base de datos MySQL o Postgres.

Paso 3: definir la variable de entorno WA_API_VERSION

La variable de entorno WA_API_VERSION debe establecerse en la versión actual con el comando siguiente:

export WA_API_VERSION=current-whatsapp-version

Paso 4: iniciar el cliente de la API de WhatsApp Business con alta disponibilidad

Ejecuta el siguiente comando para iniciar un contenedor de alta disponibilidad con un contenedor de base datos, un contenedor de aplicación web, dos contenedores de objeto maestro y dos contenedores de aplicación principal en segundo plano, tal y como se muestra de forma similar al diagrama de la sección Introducción a la alta disponibilidad:

docker-compose -f multiconnect-compose.yml up -d db waweb master1 master2 wacore1 wacore2

La respuesta resultante debería tener el aspecto siguiente:

Creating network "biz_default" with the default driver
Creating volume "biz_mysqlData" with local driver
Creating volume "biz_whatsappMedia" with local driver
Creating biz_db_1 ... done
Creating biz_waweb_1 ... done
Creating biz_master1_1 ... done
Creating biz_master2_1 ... done
Creating biz_wacore2_1 ... done
Creating biz_wacore1_1 ... done

Paso 5: verificar que los contenedores se están ejecutando

Para comprobar que todos los contenedores tienen el estado ACTIVADO, ejecuta el comando siguiente:

docker-compose -f multiconnect-compose.yml ps

La respuesta resultante debería tener el aspecto siguiente:

      Name                    Command               State                                                 Ports
--------------------------------------------------------------------------------------------------------------------------------------------------------------
biz_db_1        docker-entrypoint.sh mysqld      Up      0.0.0.0:33060->3306/tcp, 33060/tcp
biz_master1_1   /opt/whatsapp/bin/wait_on_ ...   Up      0.0.0.0:32931->6250/tcp, 0.0.0.0:32930->6251/tcp, 0.0.0.0:32928->6252/tcp, 0.0.0.0:32926->6253/tcp
biz_master2_1   /opt/whatsapp/bin/wait_on_ ...   Up      0.0.0.0:32929->6250/tcp, 0.0.0.0:32927->6251/tcp, 0.0.0.0:32925->6252/tcp, 0.0.0.0:32924->6253/tcp
biz_wacore1_1   /opt/whatsapp/bin/wait_on_ ...   Up      0.0.0.0:32937->6250/tcp, 0.0.0.0:32935->6251/tcp, 0.0.0.0:32933->6252/tcp, 0.0.0.0:32932->6253/tcp
biz_wacore2_1   /opt/whatsapp/bin/wait_on_ ...   Up      0.0.0.0:32939->6250/tcp, 0.0.0.0:32938->6251/tcp, 0.0.0.0:32936->6252/tcp, 0.0.0.0:32934->6253/tcp
biz_waweb_1     /opt/whatsapp/bin/wait_on_ ...   Up      0.0.0.0:9090->443/tcp

De forma predeterminada, el contenedor de la aplicación web se ejecutará en el puerto 9090, mientras que el de la base de datos se ejecutará en el puerto 33060.

Paso 6: realizar una comprobación de estado

Puedes descargar y configurar nuestra colección de Postman para interactuar con la API de WhatsApp Business si no quieres usar la línea de comandos.

Para realizar una comprobación de estado en el cliente de la API de WhatsApp Business, haz una llamada a la API al nodo health.

La respuesta resultante debería tener el aspecto siguiente:

{
    "health": {
      "master1:b28d835cd579": {
          "errors": [
              {
                  "code": 1011,
                  "title": "Service not ready",
                  "details": "Wacore is not instantiated. Please check wacore log for details."
              }
          ]
      },
      "master2:7fe542d305b4": {
          "gateway_status": "unregistered",
          "role": "primary_master"
      },
      "wacore1:35a5fabfc79d": {
          "errors": [
              {
                  "code": 1011,
                  "title": "Service not ready",
                  "details": "Wacore is not instantiated. Please check wacore log for details."
              }
          ]
      },
      "wacore2:05e1a6d70665": {
          "errors": [
              {
                  "code": 1011,
                  "title": "Service not ready",
                  "details": "Wacore is not instantiated. Please check wacore log for details."
              }
          ]
      }
  }
}

La respuesta muestra gateway_status como unregistered para gateway_status del contenedor del objeto maestro principal porque todavía no se ha registrado el cliente de la API de WhatsApp Business.

Paso 7: registrar el cliente de la API de WhatsApp Business

Para registrar el cliente de la API de WhatsApp Business, haz una llamada a la API al nodo account.

Paso 8: realizar una segunda comprobación de estado

Para realizar otra comprobación de estado en el cliente de la API de WhatsApp Business, haz una llamada a la API al nodo health después de completar el registro y asegúrate de que uno de los contenedores de aplicación principal gateway_status sea connected.

La respuesta resultante debería tener el aspecto siguiente:

{
    "health": {
        "master1:b28d835cd579": {
            "gateway_status": "disconnected",
            "role": "secondary_master"
        },
        "master2:7fe542d305b4": {
            "gateway_status": "disconnected",
            "role": "primary_master"
        },
        "wacore1:35a5fabfc79d": {
            "gateway_status": "connected",
            "role": "coreapp"
        },
        "wacore2:05e1a6d70665": {
            "gateway_status": "disconnected",
            "role": "coreapp"
        }
    }
} 

Nota: En el modo de alta disponibilidad, solo una aplicación principal (en este ejemplo, wacore1) estará conectada al servidor de WhatsApp. Todos los demás nodos, incluido el objeto maestro principal, tendrán el valor de gateway_status definido en disconnected. Si wacore1 sufre una interrupción, wacore2 lo reemplazará y se conectará al servidor de WhatsApp para mantener la alta disponibilidad.

Ya configuraste el cliente de la API de WhatsApp Business en el modo de alta disponibilidad. En este modo, solo puede conectarse una aplicación principal con el servidor de WhatsApp para enviar mensajes en un momento dado. Si quieres que varias aplicaciones principales envíen mensajes al mismo tiempo para aumentar el volumen de mensajes, sigue los pasos de la sección Configuración de un clúster de conexión múltiple de alta disponibilidad que hay a continuación.

Configuración de un clúster de conexión múltiple de alta disponibilidad

Paso 1: configurar dos particiones

Utiliza el extremo para particiones a fin de configurar dos particiones. Deberías ver una respuesta HTTP con el estado 201 Created.

Paso 2: realizar una comprobación de estado

Para realizar una comprobación de estado en el cliente de la API de WhatsApp Business, haz una llamada a la API al nodo health.

La respuesta resultante debería tener el aspecto siguiente:

{
    "health": {
        "master1:b28d835cd579": {
            "gateway_status": "disconnected",
            "role": "secondary_master"
        },
        "master2:7fe542d305b4": {
            "gateway_status": "connected",
            "role": "primary_master"
        },
        "wacore1:35a5fabfc79d": {
            "gateway_status": "connected",
            "role": "coreapp"
        },
        "wacore2:05e1a6d70665": {
            "gateway_status": "connected",
            "role": "coreapp"
        }
    }
}          

Nota: En el modo de conexión múltiple con dos particiones, se conectarán al servidor de WhatsApp dos aplicaciones principales (en este ejemplo, wacore1 y wacore2), así como el objeto maestro principal (en este ejemplo, master2).

Paso 3: iniciar una tercera aplicación principal para mantener la alta disponibilidad

Hasta ahora, en este ejemplo, existen dos contenedores de aplicación principal y cargas de mensajes que se dividen entre ellos. Sin embargo, si uno de los contenedores de la aplicación principal sufre una interrupción, se producirá un error en la mitad de los envíos de mensajes. A fin de mantener la alta disponibilidad en esta nueva configuración de conexión múltiple, puedes iniciar una tercera aplicación principal para tolerar un error de la aplicación principal, tal y como se muestra de forma similar en el diagrama de la sección Introducción a la conexión múltiple.

Para iniciar el contenedor de la tercera aplicación principal, ejecuta el siguiente comando:

docker-compose -f multiconnect-compose.yml up -d wacore3

La respuesta resultante debería tener el aspecto siguiente:

biz_db_1 is up-to-date
biz_waweb_1 is up-to-date
biz_master1_1 is up-to-date
Creating biz_wacore3_1 ... done

Paso 4: realizar una segunda comprobación de estado

Realiza otra comprobación de estado para verificar que todos los nodos se ejecutan correctamente mediante una llamada a la API al nodo health.

La respuesta resultante debería tener el aspecto siguiente:

{
    "health": {
        "master1:b28d835cd579": {
            "gateway_status": "disconnected",
            "role": "secondary_master"
        },
        "master2:7fe542d305b4": {
            "gateway_status": "connected",
            "role": "primary_master"
        },
        "wacore1:35a5fabfc79d": {
            "gateway_status": "connected",
            "role": "coreapp"
        },
        "wacore2:05e1a6d70665": {
            "gateway_status": "connected",
            "role": "coreapp"
        },
        "wacore3:23b50199bec2": {
            "gateway_status": "disconnected",
            "role": "coreapp"
        }
    }
} 

El nuevo contenedor de la aplicación principal (en este ejemplo, wacore3) ahora actúa como contenedor en pausa, pero actualmente no está conectado al servidor de WhatsApp. Si wacore1 o wacore2 dejan de funcionar, wacore3 se conectará al servidor de WhatsApp para que el recuento global de particiones siga siendo 2.

Actualización del cliente de la API de WhatsApp Business

Se producirá un tiempo de inactividad durante el proceso de actualización.

Te recomendamos encarecidamente que realices una copia de seguridad de la configuración actual de la aplicación antes de actualizarla para asegurarte de que puedas volver a trabajar rápidamente. Sigue la documentación Copia de seguridad y restauración.

Se recomienda siempre llevar a cabo las actualizaciones durante las horas de menor actividad.

Paso 1: cambiar la variable de entorno WA_API_VERSION a la nueva versión

La variable de entorno WA_API_VERSION debe actualizarse al número de la nueva versión mediante el comando siguiente:

export WA_API_VERSION=new-whatsapp-version

Paso 2: reiniciar los contenedores de Docker

Reinicia los contenedores de Docker ejecutando el comando siguiente:

docker-compose -f multiconnect-compose.yml up -d

Para los usuarios de la base de datos MySQL que realizarán la actualización v2.23.x y posteriores

Ahora puedes utilizar un servicio de actualización de bases de datos que te permitirá actualizar la base de datos mientras la aplicación continúa ejecutándose. De este modo, evitarás el tiempo de inactividad.

Paso 1: descargar el archivo de configuración

El archivo dbupgrade-compose.yml contiene campos en los que se indica la versión del contenedor.

Ejemplo:

services:
  dbupgrade:
    image: docker.whatsapp.biz/coreapp:v${WA_API_VERSION:-2.21.3}

Paso 2: iniciar el contenedor

Para actualizar una instalación, inicia el contenedor dbupgrade-service con la variable de entorno WA_API_VERSION establecida en la versión más reciente:

WA_API_VERSION=new-whatsapp-version docker-compose -f dbupgrade-compose.yml up -d

Nota: Si vas a utilizar una orquestación que reinicie el contenedor al cerrarlo (independientemente del código de salida), inicia el servicio con la variable de entorno EXIT_ON_SUCCESS establecida en FALSE para evitar que el contenedor se cierre cuando el código de salida sea 0.

Paso 3: esperar a que la actualización finalice

Si la actualización de la base de datos se realiza correctamente, el contenedor se cerrará con el código 0. Puedes utilizar el siguiente comando de Docker para hacer un seguimiento del estado:

docker wait your-database-upgrade-container-name

Este comando devolverá el código de salida del contenedor dbupgrade-service.

Paso 4: reiniciar los contenedores de la aplicación principal y la aplicación web

Reinicia los contenedores de Docker de la aplicación principal y la aplicación web con la variable de entorno WA_API_VERSION establecida en la versión más reciente:

WA_API_VERSION=new-whatsapp-version docker-compose -f multiconnect-compose.yml up -d

Desinstalación del cliente de la API de WhatsApp Business

Es muy recomendable realizar una copia de seguridad de la configuración actual de la aplicación antes de desinstalarla. Sigue la documentación Copia de seguridad y restauración.

Si necesitas restablecer tu entorno de desarrollo mediante la eliminación de todos los contenedores, ejecuta el siguiente comando desde el directorio que contiene el archivo multiconnect-compose.yml:

docker-compose -f multiconnect-compose.yml down

Si quieres deshacerte de todos los volúmenes definidos en el archivo multiconnect-compose.yml además de los contenedores, ejecuta down con el parámetro -v:

docker-compose -f multiconnect-compose.yml down -v

Solución de problemas

Para recopilar registros de todos los contenedores, ejecuta el comando siguiente:

docker-compose -f multiconnect-compose.yml logs > debug_output.txt

Para recopilar los registros de un servicio específico, añade el nombre del servicio (por ejemplo, waweb, master1 o wacore1) al comando docker-compose logs:

docker-compose -f multiconnect-compose.yml logs waweb > debug_output.txt

Puedes encontrar los registros en el archivo debug_output.txt del directorio actual.


Este software utiliza código de FFmpeg con licencia de LGPLv2.1, y el código fuente se puede descargar aquí.