Стандартный клиент API WhatsApp Business работает в одном контейнере Docker. Если вы хотите разделить нагрузку так, чтобы сообщениями с WhatsApp обменивались несколько серверов, используйте конфигурацию с распределением нагрузки.
Чтобы реализовать распределение нагрузки, необходимо сначала настроить повышенную доступность. Для этого следуйте инструкциям из этой статьи.
В кластерах повышенной доступности за обмен сообщениями с серверами WhatsApp отвечает только один контейнер Docker. Если трафик сообщений превышает его пропускную способность, они дольше ждут в очереди и задержка их доставки увеличивается. Чтобы обеспечить масштабируемость клиента API WhatsApp Business, кластер разделяется на сегменты для распределения нагрузки по нескольким контейнерам Docker. На данный момент поддерживается только статическое сегментирование (с 1, 2, 4, 8, 16 или 32 сегментами). Кластер повышенной доступности представляет собой частный случай распределения нагрузки, когда число сегментов равно 1.
В этом кластере за обмен сообщениями с сервером WhatsApp одновременно отвечают два узла Coreapp: CoreApp 1
и CoreApp 3
. За каждое сообщение отвечает только один сегмент, с которым оно связано по ID получателя.
Клиент API WhatsApp Business распределяет нагрузку с помощью сегментирования кластера. С учетом количества сегментов, которые вы настроили, в базе данных создается таблица сегментирования, на основе которой сообщения распределяются по сегментам по ID получателя или его имени пользователя в WhatsApp. Для этого используется следующая функция:
shard_id = hash(recipient-id) % shard-number
Каждому сегменту соответствует активный контейнер Docker (Coreapp). Узел Webapp перенаправляет запросы сообщений в нужные контейнеры Docker в зависимости от результата функции. Чтобы исключить отказ при сбое X компьютеров, их количество должно превышать число сегментов на величину X.
Как показывает приведенная выше схема кластера с распределением нагрузки, состоящего из 2 сегментов, сообщения направляются на узел CoreApp 1
или CoreApp 3
в зависимости от того, с каким сегментом они связаны. Узел CoreApp 2
является второстепенным: он работает, но без активного подключения к серверам WhatsApp. Предположим, что узел CoreApp 1
принимает сообщения, связанные с сегментом shard=0
, а CoreApp 3
— с сегментом shard=1
. Если узел CoreApp 1
откажет, это затронет только сообщения, связанные с сегментом shard=0
. Узел CoreApp 3
по-прежнему будет исправно отправлять и принимать сообщения, относящиеся к сегменту shard=1
. Как и в кластере повышенной доступности, основной узел Master 1
выявляет отказ CoreApp 1
и переключает трафик сегмента shard=0
на узел CoreApp 2
. Время переключения составляет приблизительно 35 секунд.
Настроив кластер повышенной доступности, включите распределение нагрузки, используя приведенный ниже запрос.
Помните: чтобы обеспечить повышенную доступность,
количество контейнеров Docker Coreapp должно превышать количество сегментов. Распределение нагрузки само по себе не гарантирует повышенную доступность.
POST /v1/account/shards { "cc": "country-code", "phone_number": "phone-number", "shards": 1 | 2 | 4 | 8 | 16 | 32, "pin": "pin", "cert": "verified-name-cert-in-base64" }
Имя | Описание |
---|---|
| Обязательный параметр. Код страны для номера телефона, зарегистрированного для этого клиента WhatsApp Business API, в виде строки. Пример: |
| Обязательный параметр. Номер телефона, зарегистрированный для этого клиента WhatsApp Business API, без кода страны и знака "плюс", в виде строки. Пример: |
| Обязательный параметр. Желаемое количество сегментов в виде целого числа. Параметры: |
| Необязательный параметр. Существующий 6-значный PIN-код для двухфакторной проверки в виде строки. Пример: |
| Обязательный параметр. После внедрения параметра Если это поле заполнено, компания сможет выполнять вызовы к этой конечной точке в любое время. Ранее их можно было выполнять только в течение 7 дней с момента регистрации номера телефона. Сертификат в кодировке Base64, связанный с ранее указанным номером телефона. Получить этот сертификат можно с помощью Business Manager. Сведения см. в разделе Копирование сертификата в кодировке Base64. Примечания
Если |
201 Created : You successfully changed shard number 403 Forbidden : You could hit this if server is temporarily unavailable, retry the request should fix it
GET /v1/account/shards
{ "account": { "shards": number-of-shards } }
Шаблон позволяет настроить количество активных экземпляров контейнеров Coreapp, которое необходимо создать. Для быстрого переключения в случае сбоя Coreapp создается один дополнительный экземпляр контейнера Coreapp.
Если включена повышенная доступность, по умолчанию шаблон создает следующее количество экземпляров для распределения нагрузки:
Шаблон предусматривает автоматическое масштабирование экземпляров EC2 в соответствии с использованием памяти. Использование памяти увеличивается (или уменьшается) одновременно с количеством активных экземпляров контейнеров Coreapp. Т. е. чем больше создается экземпляров Coreapp, тем больше будет экземпляров EC2. Однако максимальное количество экземпляров EC2 ограничено:
Количество активных экземпляров Coreapp | Максимальное количество экземпляров EC2 |
---|---|
2 | 3 |
4 | 4 |
8 | 5 |
16 | 8 |
32 | 15 |
Частота запросов API и количество активных экземпляров Coreapp определяют количество подключений к базе данных. Для 8 активных экземпляров Coreapp при частоте 100 сообщений в секунду требуется примерно 700 подключений к БД, если протокол SSL отключен, и 1200, если он включен. Для 32 активных экземпляров Coreapp при частоте 250 сообщений в секунду требуется порядка 1700 подключений к БД.
В текущей версии для 8 активных экземпляров Coreapp (шифрование подключений к базе данных отключено) используется db.m4.2xlarge
, а для 32 активных экземпляров Coreapp (шифрование подключений к базе данных включено) — db.m4.4x.large
. В таблице ниже указано поддерживаемое максимальное количество подключений для различных классов экземпляров RDS.
Экземпляр RDS | Максимальное количество подключений к базе данных |
---|---|
| 318 |
| 636 |
| 1 272 |
| 2 543 |
| 1 212 |
| 2 424 |
| 4 848 |
| 9 696 |
| 19 391 |
| 38 783 |
| 636 |
| 1 272 |
| 2 543 |
| 5 086 |
| 12 716 |
| 20 345 |
| 298 |
| 596 |
| 1 192 |
| 2 384 |