マルチコネクトを使ったAPIクライアントのスケーリング

標準のWhatsApp Business APIクライアントのソリューションは、単一のDockerコンテナ上で動作します。データ通信量を分散し、複数のサーバーでWhatsAppのメッセージの送受信を行いたい場合は、このマルチコネクトソリューションを併用してください。

マルチコネクトソリューションを使うには、まず 既存のハイアベイラビリティの設定を行う必要があります。ハイアベイラビリティドキュメントに従って設定を終えてから、以下を行ってください。

概要

ハイアベイラビリティの場合、WhatsAppサーバーとメッセージの送受信を行うDockerコンテナは1つのみです。メッセージングトラフィックが単一のDockerコンテナの最大スループットを超えると、メッセージ送信のバックログが発生し、メッセージ配信におけるレイテンシが増加します。マルチコネクトは、WhatsApp Business APIクライアントをスケールアウトするため、シャーディングによって複数のDockerコンテナにデータ通信量を分散します。現時点でサポートしているのは、シャード数が1、2、4、8、16、32の静的シャーディングのみです。ハイアベイラビリティはシャード数1の特殊なマルチコネクトです。

シャード数2のマルチコネクトクラスタ

クラスタ内にWhatsAppサーバーとのメッセージの送受信を同時に行うコアアプリノードが2つ(CoreApp 1CoreApp 3)存在します。メッセージはすべて受信者ID別にいずれか1つのシャードにのみ属します。

シャーディング

WhatsApp Business APIクライアントではシャーディングによりマルチコネクトを実現します。設定したシャード数に応じて、データベースにシャードマップを保持します。このシャードマップにより受信者ID(WhatsAppユーザーネーム)別にメッセージがどのシャードに属するのかを判定します。シャードを判定するための関数は次のとおりです。

shard_id = hash(recipient-id) % shard-number

シャードはそれぞれ実行中のDockerコンテナ(コアアプリ)に紐付けられています。ウェブアプリはこの関数の戻り値をもとに、どのDockerコンテナにメッセージリクエストを送信すべきかを判断します。X台のマシン障害を許容できるようにするため、シャード数は+ Xに設定することが推奨されます。

上の図のシャード数2のマルチコネクトの場合、シャーディング関数に基づいてメッセージをCoreApp 1CoreApp 3にルーティングします。CoreApp 2はセカンダリで、電源は入っているもののWhatsAppサーバーには接続されていません。CoreApp 1shard=0CoreApp 3shard=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"
}

パラメーター

名前説明

cc

必須。

このWhatsApp Business APIクライアントに登録されている電話番号の国コードを表す文字列。例: 1

phone_number

必須。

このWhatsApp Business APIクライアントに登録されている電話番号(国番号またはプラス記号(+)を除く)を表す文字列。例: "6505551234"

shards

必須。

希望するシャードの数を表す整数。

選択肢: 1, 2, 4, 8, 16, 32

pin

任意。

二段階認証のための既存の6桁の暗証番号を表す文字列。例: "123456"。これは、このアカウントで二段階認証が有効になっている場合のみ必須です。

cert

必須。

v2.41.2においてcertパラメータが導入されたことにより、certパラメータを指定した場合、接続を切断することなく、このAPIをいつでも呼び出せるようになりました。

このフィールドを利用すると、ビジネスはいつでもこのエンドポイントを呼び出すことができます。以前は、このエンドポイントを呼び出せるのは、電話番号登録から7日以内に限られていました。


以前に指定された電話番号に関連付けられたBase64でエンコードされた証明書。


この証明書はビジネスマネージャで取得できます。Base64でエンコードされた証明書を参照してください。


注:

  • 期限切れの証明書を提出すると、アカウントはブロックされます。
  • 間違った証明書を提出すると、クライアントの設定がログオフされているというエラーが発生します。シャードを設定するには、正しい証明書を使用してエンドポイントをもう一度呼び出す必要があります。

certパラメータが指定されていない場合、電話番号登録完了から7日以上経ってからこのAPIを呼び出すと、APIクライアントの接続が切断されます。

応答

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

メッセージ送信レート

参照、メッセージ、パフォーマンスを参照してください。

AWSデプロイメントの詳細

テンプレートURL:

  • エンタープライズ: https://wa-biz-cfn.s3-us-west-2.amazonaws.com/wa_ent.yml?versionId=Tvb.Sa6uTwmvj1rSbbpKCmEKz2pyxcLG
  • DB: https://wa-biz-cfn.s3-us-west-2.amazonaws.com/wa_ent_db.yml?versionId=3.vthzENa7qUOuZrozcX9hDk9n8.kdTg
  • Lambda: https://wa-biz-cfn.s3-us-west-2.amazonaws.com/wa_ent_lambda.yml?versionId=gqIhZaXkX_NylKaPJMDBlQNk9.Pl_34b
  • ネットワーク: https://wa-biz-cfn.s3-us-west-2.amazonaws.com/wa_ent_net.yml?versionId=Y_NczQaJ.4QTAlyedZPir2XF_IAPDpsh

テンプレートにより、アクティブなコアアプリコンテナインスタンスの作成数を設定することができます。テンプレートは、コアアプリの障害発生時に素早く切り替えられるよう、コアアプリのコンテナインスタンスを1つ余分に作成します。

このテンプレートは、ハイアベイラビリティがオンの場合に、マルチコネクトの環境タイプごとに次の数のインスタンスをデフォルトで作成します。

  • 本番稼働: EC2インスタンス: 3、ウェブコンテナ: 3、コアアプリコンテナ: 3、マスターコンテナ: 3
  • ステージング: EC2インスタンス: 2、ウェブコンテナ: 2、コアアプリコンテナ: 2、マスターコンテナ: 2

テンプレートは、メモリの利用量に応じてEC2インスタンスを自動スケールするように設定されます。「アクティブ」なコアアプリコンテナインスタンスの数が増加(または減少)すると、メモリの利用量も増加(もしくは減少)します。したがって、より多くのコアアプリインスタンスが作成されると、それに応じてEC2インスタンスが自動スケールされます。しかし、作成可能なEC2インスタンスの最大数には以下の上限があります。

アクティブなコアアプリインスタンス EC2インスタンスの最大数

2

3

4

4

8

5

16

8

32

15

RDSインスタンスサイズ

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接続数

db.t2.medium

318

db.t2.large

636

db.t2.xlarge

1272

db.t2.2xlarge

2543

db.r4.large

1212

db.r4.xlarge

2424

db.r4.2xlarge

4848

db.r4.4xlarge

9696

db.r4.10xlarge

19391

db.r4.16xlarge

38783

db.m4.large

636

db.m4.xlarge

1272

db.m4.2xlarge

2543

db.m4.4xlarge

5086

db.m4.10xlarge

12716

db.m4.16xlarge

20345

db.m3.medium

298

db.m3.large

596

db.m3.xlarge

1192

db.m3.2xlarge

2384

設定

  • テンプレートに設定されたアクティブなコアアプリインスタンスは、コアアプリインスタンスの作成数のみを管理します。作成されたコアアプリインスタンスを有効にするには、シャード設定(マルチコネクトの設定セクションに記載)を使用する必要があります。シャードのデフォルト値は1です。
  • コアアプリインスタンスの数が、APIに設定されたシャード数以上であることを常に確認してください。
  • シャード数を増やすには:
    • 希望するアクティブなコアアプリインスタンス数に合わせて、スタックを作成または更新します。
    • 作成または更新が終わったら、シャード設定を使用して、その数と同じアクティブなコアアプリインスタンスまたはシャードを有効化します。
    • 注:シャード設定を使用すると、すべてのコアアプリコンテナインスタンスが停止し、自動的に再起動されます。シャード設定が実行されると、約45秒から1分間のダウンタイムが発生します。
  • シャード数を減らすには:
    • シャード設定を使用して、アクティブなコアアプリインスタンスまたはシャードを同じ数だけ減らします。
    • すべてのコアアプリインスタンスの再起動が完了したら、アクティブなコアアプリインスタンスの数に合わせてスタックを更新します。
    • 注:スタックを更新すると、現在シャードを提供しているアクティブなコアアプリインスタンスが終了する可能性があります。しかし、稼働中の他のコアアプリインスタンスがすぐに割り当てられます。この手続き中に追加のダウンタイム(最大35秒)が発生する可能性があります。