標準のWhatsApp Business APIクライアントのソリューションは、単一のDockerコンテナ上で動作します。データ通信量を分散し、複数のサーバーでWhatsAppのメッセージの送受信を行いたい場合は、このマルチコネクトソリューションを併用してください。
マルチコネクトソリューションを使うには、まず 既存のハイアベイラビリティの設定を行う必要があります。ハイアベイラビリティドキュメントに従って設定を終えてから、以下を行ってください。
ハイアベイラビリティの場合、WhatsAppサーバーとメッセージの送受信を行うDockerコンテナは1つのみです。メッセージングトラフィックが単一のDockerコンテナの最大スループットを超えると、メッセージ送信のバックログが発生し、メッセージ配信におけるレイテンシが増加します。マルチコネクトは、WhatsApp Business APIクライアントをスケールアウトするため、シャーディングによって複数のDockerコンテナにデータ通信量を分散します。現時点でサポートしているのは、シャード数が1、2、4、8、16、32の静的シャーディングのみです。ハイアベイラビリティはシャード数1の特殊なマルチコネクトです。
クラスタ内にWhatsAppサーバーとのメッセージの送受信を同時に行うコアアプリノードが2つ(CoreApp 1
とCoreApp 3
)存在します。メッセージはすべて受信者ID別にいずれか1つのシャードにのみ属します。
WhatsApp Business APIクライアントではシャーディングによりマルチコネクトを実現します。設定したシャード数に応じて、データベースにシャードマップを保持します。このシャードマップにより受信者ID(WhatsAppユーザーネーム)別にメッセージがどのシャードに属するのかを判定します。シャードを判定するための関数は次のとおりです。
shard_id = hash(recipient-id) % shard-number
シャードはそれぞれ実行中のDockerコンテナ(コアアプリ)に紐付けられています。ウェブアプリはこの関数の戻り値をもとに、どのDockerコンテナにメッセージリクエストを送信すべきかを判断します。X台のマシン障害を許容できるようにするため、シャード数は+ Xに設定することが推奨されます。
上の図のシャード数2のマルチコネクトの場合、シャーディング関数に基づいてメッセージをCoreApp 1
とCoreApp 3
にルーティングします。CoreApp 2
はセカンダリで、電源は入っているもののWhatsAppサーバーには接続されていません。CoreApp 1
がshard=0
、CoreApp 3
がshard=1
のメッセージに対応するとします。CoreApp 1
がダウンした場合、影響を受けるのはshard=0
のメッセージのみです。shard=1
のメッセージについては、システムは引き続きCoreApp 3
を通じて送受信を行います。ハイアベイラビリティと同様に、Master 1
は、CoreApp 1
の障害を検出し、shard=0
のトラフィックをCoreApp 2
にフェイルオーバーします。このフェイルオーバーにはおよそ35秒かかります。
ハイアベイラビリティドキュメントに従ってクラスタを設定したら、以下のリクエストでマルチコネクトをオンにしてください。
続行するには、シャード数を+Xに設定したコアアプリのDockerコンテナを実行させておく必要があることに留意してください。
マルチコネクトはハイアベイラビリティを保証するものではありません。ハイアベイラビリティを実現するためには、シャード数よりも多くのコアアプリを実行します。
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桁の暗証番号を表す文字列。例: |
| 必須。 v2.41.2において このフィールドを利用すると、ビジネスはいつでもこのエンドポイントを呼び出すことができます。以前は、このエンドポイントを呼び出せるのは、電話番号登録から7日以内に限られていました。 以前に指定された電話番号に関連付けられたBase64でエンコードされた証明書。 この証明書はビジネスマネージャで取得できます。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 } }
参照、メッセージ、パフォーマンスを参照してください。
テンプレートにより、アクティブなコアアプリコンテナインスタンスの作成数を設定することができます。テンプレートは、コアアプリの障害発生時に素早く切り替えられるよう、コアアプリのコンテナインスタンスを1つ余分に作成します。
このテンプレートは、ハイアベイラビリティがオンの場合に、マルチコネクトの環境タイプごとに次の数のインスタンスをデフォルトで作成します。
テンプレートは、メモリの利用量に応じてEC2インスタンスを自動スケールするように設定されます。「アクティブ」なコアアプリコンテナインスタンスの数が増加(または減少)すると、メモリの利用量も増加(もしくは減少)します。したがって、より多くのコアアプリインスタンスが作成されると、それに応じてEC2インスタンスが自動スケールされます。しかし、作成可能なEC2インスタンスの最大数には以下の上限があります。
アクティブなコアアプリインスタンス | EC2インスタンスの最大数 |
---|---|
2 | 3 |
4 | 4 |
8 | 5 |
16 | 8 |
32 | 15 |
APIリクエストレートとアクティブなコアアプリインスタンスの数が、データベースへの接続数を決定します。アクティブなコアアプリインスタンスが8つで、APIレートが100メッセージ/秒の場合、約700DBの接続(SSLは無効)と1200DBの接続(SSLが有効)が必要です。一方、アクティブなコアアプリインスタンスが32で、APIレートが250メッセージ/秒の場合、約1700DBの接続が必要です。
現在のリリースでは、アクティブなコアアプリインスタンスが8つ(DB接続暗号化が無効)の場合にはdb.m4.2xlarge
を、アクティブなコアアプリインスタンスが32(DB接続暗号化が有効)の場合にはdb.m4.4x.large
を使っています。次の表は、RDSインスタンスクラスの選択と、サポート可能な最大接続数に関するガイダンスを提供するものです。
RDSインスタンス | 最大DB接続数 |
---|---|
| 318 |
| 636 |
| 1272 |
| 2543 |
| 1212 |
| 2424 |
| 4848 |
| 9696 |
| 19391 |
| 38783 |
| 636 |
| 1272 |
| 2543 |
| 5086 |
| 12716 |
| 20345 |
| 298 |
| 596 |
| 1192 |
| 2384 |