다중 연결로 API 클라이언트 확장

표준 WhatsApp Business API 클라이언트 솔루션은 단일 Docker 컨테이너에서 실행됩니다. 부하를 분할하고 여러 서버를 통해 WhatsApp과 메시지를 주고받고 싶은 경우, Meta의 다중 연결 솔루션을 추가로 사용할 수 있습니다.

다중 연결 솔루션은 먼저 기존의 고가용성 설정이 필요합니다. 고가용성 문서에 따라 고가용성을 설정한 후, 아래 단계를 진행하세요.

개요

고가용성의 경우 Docker 컨테이너 1개만 WhatsApp 서버와 메시지를 주고받습니다. 메시지 전송 트래픽이 단일 Docker 컨테이너의 최대 처리량을 초과할 경우 메시지 전송 백로그가 발생하고 메시지 전송 지연이 증가합니다. WhatsApp Business API 클라이언트를 확장할 수 있도록 다중 연결은 여러 Docker 컨테이너에 부하를 분산시키는 샤딩을 지원합니다. 현재 샤드 번호 1, 2, 4, 8, 16 또는 32로 정적 샤딩만 지원합니다. 고가용성은 샤드 번호가 1인 다중 연결로, 특수한 경우입니다.

2샤드 다중 연결 클러스터

클러스터에는 WhatsApp 서버와 동시에 메시지를 주고받는 Coreapp 노드가 2개(CoreApp 1CoreApp 3) 있습니다. 각 메시지는 수신자 ID를 기준으로 하나의 샤드에만 속합니다.

샤딩

WhatsApp Business API 클라이언트는 샤딩을 사용하여 다중 연결을 실행합니다. 설정한 샤드 개수에 따라 데이터베이스가 수신자 ID(또는 WhatsApp 사용자 이름)을 기준으로 메시지가 어느 샤드로 가야 할지 결정하는 샤드 맵을 저장합니다. 이를 결정하는 함수는 다음과 같습니다.

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

각 샤드는 실행 중인 Docker 컨테이너(Coreapp)에 매핑됩니다. Webapp은 이 함수의 반환에 기초하여 어느 Docker 컨테이너로 메시지 요청을 전송할지 파악합니다. X개의 시스템 장애를 감당할 수 있으려면 샤드 개수 + X개 시스템으로 설정하는 것이 좋습니다.

위의 2샤드 다중 연결 다이어그램에서 메시지는 샤딩 함수를 기반으로 CoreApp 1CoreApp 3으로 라우팅됩니다. CoreApp 2는 보조 역할로서, 가동 상태이지만 WhatsApp 서버와의 연결이 활성화되어 있지는 않습니다. CoreApp 1shard=0에 대한 메시지를 수신하고 CoreApp 3shard=1에 대한 메시지를 수신한다고 가정해 보세요. CoreApp 1이 중단되면 shard=0에 대한 메시지만 영향을 받습니다. 시스템은 여전히 CoreApp 3을 사용하여 shard=1에 속한 메시지를 주고받을 수 있습니다. 고가용성과 마찬가지로 Master 1CoreApp 1의 장애를 탐지하고 shard=0 트래픽을 CoreApp 2로 보내 장애 조치를 합니다. 이 장애 조치는 약 35초가 걸립니다.

다중 연결 설정

고가용성 문서에 따라 클러스터를 설정한 경우 다음 요청을 사용하여 다중 연결을 활성화합니다.

계속 진행하기 전에 샤드 숫자 + 실행 중인 Coreapp의 Docker 컨테이너 X개가 있어야 한다는 점을 기억하세요.

다중 연결은 고가용성을 보장하지 않습니다. 고가용성의 경우 실행 중인 샤드보다 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"
}

매개변수

이름설명

cc

필수 항목.

이 WhatsApp Business API 클라이언트에 등록된 전화번호의 국가 번호를 문자열로 입력해야 합니다. 예: "1".

phone_number

필수 항목.

이 WhatsApp Business API 클라이언트에 등록된 전화번호를 국가 번호나 플러스 기호(+) 없이 문자열로 입력합니다. 예: "6315550000".

shards

필수 항목.

사용하고자 하는 샤드 수를 정수로 입력합니다.

옵션:1, 2, 4, 8, 16, 32

pin

선택 사항.

2단계 인증을 위한 기존의 6자리 PIN을 문자열로 입력합니다. 예: "123456". 이 계정에 2단계 인증을 활성화한 경우에만 필수입니다.

cert

필수 항목.

v2.41.2cert 매개변수를 도입하고 나서는 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:

  • Enterprise: 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
  • Network: https://wa-biz-cfn.s3-us-west-2.amazonaws.com/wa_ent_net.yml?versionId=Y_NczQaJ.4QTAlyedZPir2XF_IAPDpsh

템플릿을 사용하면 생성할 활성 Coreapp 컨테이너 인스턴스의 개수를 구성할 수 있습니다. 템플릿은 Coreapp에 장애가 발생하면 빠르게 전환하는 데 도움이 되도록 Coreapp 컨테이너 인스턴스 1개를 추가로 생성합니다.

템플릿은 고가용성이 활성화되었을 때 기본적으로 다중 연결에 대해 환경 유형당 다음과 같은 개수의 인스턴스를 생성합니다.

  • 프로덕션: EC2 인스턴스: 3, 웹 컨테이너: 3, Coreapp 컨테이너: 3, Master 컨테이너: 3
  • 준비: EC2 인스턴스: 2, 웹 컨테이너: 2, Coreapp 컨테이너: 2, Master 컨테이너: 2

템플릿은 메모리 사용률에 따라 EC2 인스턴스를 자동으로 조정하도록 구성됩니다. 메모리 사용률은 '활성' Coreapp 컨테이너 인스턴스 수가 늘어나면(또는 줄어들면) 증가합니다(또는 감소합니다). 따라서 Coreapp 인스턴스를 더 많이 생성할수록 그에 따라 EC2 인스턴스가 자동으로 확장됩니다. 그러나 생성 가능한 EC2 인스턴스의 최대 개수는 다음과 같이 제한됩니다.

활성 Coreapp 인스턴스 최대 EC2 인스턴스

2

3

4

4

8

5

16

8

32

15

RDS 인스턴스 규모 조정

API 요청 속도와 활성 Coreapp 인스턴스의 개수에 따라 데이터베이스에 대한 연결 수가 결정됩니다. 활성 Coreapp 인스턴스가 8개이고 API 속도가 초당 메시지 100건인 경우 약 700개의 DB 연결(SSL 비활성화)과 1,200개의 DB 연결(SSL 활성화)이 필요합니다. 그러나 활성 Coreapp 인스턴스가 32개이고 API 속도가 초당 메시지 250건인 경우 약 1,700개의 DB 연결이 필요합니다.

현재 릴리스에서는 활성 Coreapp 인스턴스 8개에는 db.m4.2xlarge를 사용하였고(DB 연결 암호화 비활성화) 활성 Coreapp 인스턴스 32개에는 db.m4.4x.large를 사용하였습니다(DB 연결 암호화 활성화). 다음 표는 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

구성

  • 템플릿에 설정된 활성 Coreapp 인스턴스는 생성된 Coreapp 인스턴스 개수만 관리합니다. 그러나 이를 활성화하려면 샤드 설정(다중 연결 설정 섹션 참조)을 사용해야 합니다. 샤드의 기본값은 1입니다.
  • Coreapp 인스턴스의 개수가 언제나 API에 설정된 샤드 수보다 많거나 같도록 해야 합니다.
  • 샤드 개수를 늘리는 방법은 다음과 같습니다.
    • 원하는 개수의 활성 Coreapp 인스턴스를 사용하여 스택을 만들거나 업데이트합니다.
    • 성공하면 샤드 설정을 사용하여 동일한 개수만큼 활성 Coreapp 인스턴스/샤드를 활성화합니다.
    • 참고:샤드 설정을 사용하면 모든 Coreapp 컨테이너 인스턴스가 중단되었다가 자동으로 다시 시작합니다. 샤드 설정이 실행되면 약 45초~1분간의 가동 중단 시간이 있습니다.
  • 샤드 수를 줄이는 방법은 다음과 같습니다.
    • 샤드 설정을 사용하여 동일한 개수만큼 활성 Coreapp 인스턴스/샤드를 줄입니다.
    • 모든 Coreapp 인스턴스가 성공적으로 다시 시작되면 동일한 개수의 활성 Coreapp 인스턴스로 스택을 업데이트합니다.
    • 참고: 스택을 업데이트하면 샤드에 서비스하는 현재의 활성 Coreapp 인스턴스가 종료될 수 있습니다. 그러나 다른 활성 Coreapp 인스턴스는 잠시 후 할당됩니다. 즉, 이 절차를 진행하는 동안 추가적인 가동 중단 시간(약 35초)이 있을 수 있습니다.