開發人員設定:高可用性和多點連線

本文件將為您講解如何在開發人員裝置中設定高可用性叢集,以及指導如何在此叢集啟用多點連線,以及列出設定高可用性多點連線叢集所需的變更。

如要正式版設定,請遵循正式版設定的相關指示。

事先準備工作

如果您之前已遵循開發人員設定:單一實例的指示,在開發人員裝置設定 WhatsApp Business API 用戶端,請先遵循遷移指南的指示,然後再繼續閱讀本指南的其餘內容。

本指南的內容均假設您正在執行全新的安裝動作

您必須使用:

  • Docker Compose
    • 它應與 Docker 安裝程式為同一個套件;如果不是的話,您可以安裝它
  • 在開發環境中本機設定的測試帳戶
    • 這個帳戶是用於快速開發和測試新版本。

我們亦強烈建議您詳閱可用性和規模化指南,以進一步了解高可用性與多點連線。

高可用性叢集的設定

第 1 步:為設定指令碼建立 biz 目錄

在 WhatsApp Business API 用戶端的首選位置運行以下程式碼:

mkdir ~/biz; cd ~/biz;

第 2 步:獲取 WhatsApp Business API 用戶端配置檔案

WhatsApp Business API 用戶端的配置檔案位於 WhatsApp-Business-API-Setup-Scripts GitHub 資料庫中。您可以使用 MySQL 或 Postgres 資料庫實例設定 WhatsApp Business API 用戶端。

第 3 步:設定 WA_API_VERSION 環境變數

您需要使用以下程式碼,將 WA_API_VERSION 環境變數設定為當前版本:

export WA_API_VERSION=current-whatsapp-version

第 4 步:啟動具有高可用性 WhatsApp Business API 用戶端

高可用性簡介流程圖類似,如要啟動擁有 1 個資料庫容器、1 個網頁應用程式容器、2 個主節點容器和 2 個核心應用程式容器的高可用性叢集,請運行以下指令:

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

所得的輸出結果應如下所示:

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

第 5 步:確認容器正在運行

您可以運行以下程式碼,以檢查全部容器是否均擁有 UP 狀態:

docker-compose -f multiconnect-compose.yml ps

所得的輸出結果應如下所示:

      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

在預設情況下,網頁應用程式容器會在 9090 端口運行,而資料庫容器則會在 33060 端口運行。

第 6 步:執行系統健康檢查

如果您不想使用指令行,您可以下載並配置 Postman Collection,以便與 WhatsApp Business API 互動。

您可以在 WhatsApp Business API 用戶端上使用 API 調用 health 節點,以執行系統健康檢查

所得的輸出結果應如下所示:

{
    "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."
              }
          ]
      }
  }
}

由於 WhatsApp Business API 用戶端尚未註冊,因此回應會將主要主節點的 gateway_status 顯示為 unregisteredgateway_status

第 7 步:註冊 WhatsApp Business API 用戶端

您可以使用 API 調用 account 節點,以註冊 WhatsApp Business API 用戶端。

第 8 步:執行第二次系統健康檢查

完成註冊後,在 WhatsApp Business API 用戶端使用 API 調用 health 節點,以再次執行系統健康檢查,並確保其中一個核心應用程式容器的 gateway_statusconnected

所得的輸出結果應如下所示:

{
    "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"
        }
    }
} 

請注意:在高可用性模式下,只會有一個核心應用程式(此範例中為 wacore1)可以連接至 Whatsapp 伺服器,而所有其他節點(包括主要主節點)的 gateway_status 狀態將為 disconnected。如果 wacore1 停止運作,wacore2 將取代它,並連接至 Whatsapp 伺服器以維持高可用性。

現在,您已成功設定處於高可用性模式的 WhatsApp Business API 用戶端。在這種模式下,任何時候都只有一個核心應用程式會連接至 WhatsApp 伺服器並傳送訊息。如果您想同時使用多個核心應用程式傳送訊息,從而提升訊息輸送量,請遵循下方的設定高可用性多點連線叢集部分的指示。

高可用性多點連線叢集的設定

第 1 步:設定兩個分片

使用分片端點設定 2 個分片。您將看到狀態為 201 Created 的 HTTP 回應。

第 2 步:執行系統健康檢查

您可以在 WhatsApp Business API 用戶端上使用 API 調用 health 節點,以執行系統健康檢查

所得的輸出結果應如下所示:

{
    "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"
        }
    }
}          

請注意:在擁有 2 個分片的多點連線模式下,2 個核心應用程式(在此範例中為 wacore1wacore2)均可連接至 WhatsApp 伺服器,主要主節點(在此範例中為 master2)也將連接至該 WhatsApp 伺服器。

第 3 步:啟動第三個核心應用程式以維持高可用性

目前為止,您在此範例中擁有 2 個核心應用程式容器,而這兩個容器將共同分擔訊息負載。不過,如果其中一個核心應用程式容器停止運作,一半的訊息傳送動作將會失敗。為了在此全新多點連線設定中維持高可用性,您可以啟用第三個核心應用程式,以應付其中 1 個核心應用程式發生故障的情況。這種故障情況與多點連線簡介流程圖所示的情況類似。

如要啟用第三個核心應用程式容器,請運行以下指令:

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

所得的輸出結果應如下所示:

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

第 4 步:執行第二次系統健康檢查

使用 API 調用 health 節點,再次執行系統健康檢查,以確認所有節點正常運行。

所得的輸出結果應如下所示:

{
    "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"
        }
    }
} 

新的核心應用程式容器(在此範例中為 wacore3)現已用作為後備容器,但目前未有連接至 WhatsApp 伺服器。如果 wacore1wacore2 停止運作,wacore3 將會連接至 WhatsApp 伺服器,以將分片總數維持在 2 個。

升級 WhatsApp Business API 用戶端

升級期間將會出現停機情況。

我們強烈建議您在升級前備份當前應用程式的設定,以確保可以快速恢復並運行。請遵循備份和恢復文件的指示。

我們建議您在最不繁忙的時段升級程式。

第 1 步:將 WA_API_VERSION 環境變數改為新版本

請使用以下程式碼,將 WA_API_VERSION 環境變數更新至新版本編號:

export WA_API_VERSION=new-whatsapp-version

第 2 步:重新啟動 Docker 容器

運行以下程式碼,以重新啟動 Docker 容器:

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

若是將 MySQL 資料庫用戶升級至 v2.23.x 或更高版本

您現可使用資料庫升級服務,在應用程式運行時升級資料庫,這樣應用程式便不需要任何停機時間。

第 1 步:下載配置檔案

dbupgrade-compose.yml 檔案包含用於指定容器版本的欄位。

範例:

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

第 2 步:啟動容器

如要升級安裝程式,請啟動 dbupgrade-service 容器,並將 WA_API_VERSION 環境變數設為最新版本:

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

請注意:無論退出程式碼為何,如果您使用的編排程式會在退出時重新啟動容器,則請將 EXIT_ON_SUCCESS 環境變數設定為 FALSE 並啟動服務,以避免退出程式碼為 0 時退出容器。

第 3 步:允許升級完成

如果資料庫升級成功,則容器會退出,且退出程式碼為 0。您可使用以下 Docker 指令來追蹤狀態:

docker wait your-database-upgrade-container-name

此指令會輸出 dbupgrade-service 容器的退出程式碼。

第 4 步:重新啟動核心應用程式和網頁應用程式容器

WA_API_VERSION 環境變數設定為最新版本,並重新啟動核心應用程式和網頁應用程式 Docker 容器:

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

解除安裝 WhatsApp Business API 用戶端

我們強烈建議您在解除安裝前備份當前應用程式的設定。請遵循備份和恢復文件的指示。

如果您需要移除所有容器以重設開發環境,請從包含 multiconnect-compose.yml 檔案的目錄中運行以下指令:

docker-compose -f multiconnect-compose.yml down

如要刪除容器以外、在 multiconnect-compose.yml 檔案中定義的所有磁碟區,請使用 -v 參數運行 down

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

解決疑難

若要從所有容器收集記錄,請執行以下命令:

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

如要收集特定服務的記錄,則請將服務名稱(如 wawebmaster1wacore1)附加至 docker-compose logs 指令中:

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

您可以在當前目錄的 debug_output.txt 檔案中找到記錄。


此軟件使用根據 LGPLv2.1 授權的 FFmpeg 程式碼,您可在此處下載其原始程式碼。