표준 WhatsApp Business API 클라이언트 솔루션은 단일 Docker 컨테이너에서 실행됩니다. 부하를 분할하고 여러 서버를 통해 WhatsApp과 메시지를 주고받고 싶은 경우, Meta의 다중 연결 솔루션을 추가로 사용할 수 있습니다.
다중 연결 솔루션은 먼저 기존의 고가용성 설정이 필요합니다. 고가용성 문서에 따라 고가용성을 설정한 후, 아래 단계를 진행하세요.
고가용성의 경우 Docker 컨테이너 1개만 WhatsApp 서버와 메시지를 주고받습니다. 메시지 전송 트래픽이 단일 Docker 컨테이너의 최대 처리량을 초과할 경우 메시지 전송 백로그가 발생하고 메시지 전송 지연이 증가합니다. WhatsApp Business API 클라이언트를 확장할 수 있도록 다중 연결은 여러 Docker 컨테이너에 부하를 분산시키는 샤딩을 지원합니다. 현재 샤드 번호 1, 2, 4, 8, 16 또는 32로 정적 샤딩만 지원합니다. 고가용성은 샤드 번호가 1인 다중 연결로, 특수한 경우입니다.
클러스터에는 WhatsApp 서버와 동시에 메시지를 주고받는 Coreapp 노드가 2개(CoreApp 1
과 CoreApp 3
) 있습니다. 각 메시지는 수신자 ID를 기준으로 하나의 샤드에만 속합니다.
WhatsApp Business API 클라이언트는 샤딩을 사용하여 다중 연결을 실행합니다. 설정한 샤드 개수에 따라 데이터베이스가 수신자 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초가 걸립니다.
고가용성 문서에 따라 클러스터를 설정한 경우 다음 요청을 사용하여 다중 연결을 활성화합니다.
계속 진행하기 전에 샤드 숫자 + 실행 중인 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" }
이름 | 설명 |
---|---|
| 필수 항목. 이 WhatsApp Business API 클라이언트에 등록된 전화번호의 국가 번호를 문자열로 입력해야 합니다. 예: |
| 필수 항목. 이 WhatsApp Business API 클라이언트에 등록된 전화번호를 국가 번호나 플러스 기호(+) 없이 문자열로 입력합니다. 예: |
| 필수 항목. 사용하고자 하는 샤드 수를 정수로 입력합니다. 옵션: |
| 선택 사항. 2단계 인증을 위한 기존의 6자리 PIN을 문자열로 입력합니다. 예: |
| 필수 항목. 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 } }
참고 자료, 메시지, 성능을 참조하세요.
템플릿을 사용하면 생성할 활성 Coreapp 컨테이너 인스턴스의 개수를 구성할 수 있습니다. 템플릿은 Coreapp에 장애가 발생하면 빠르게 전환하는 데 도움이 되도록 Coreapp 컨테이너 인스턴스 1개를 추가로 생성합니다.
템플릿은 고가용성이 활성화되었을 때 기본적으로 다중 연결에 대해 환경 유형당 다음과 같은 개수의 인스턴스를 생성합니다.
템플릿은 메모리 사용률에 따라 EC2 인스턴스를 자동으로 조정하도록 구성됩니다. 메모리 사용률은 '활성' Coreapp 컨테이너 인스턴스 수가 늘어나면(또는 줄어들면) 증가합니다(또는 감소합니다). 따라서 Coreapp 인스턴스를 더 많이 생성할수록 그에 따라 EC2 인스턴스가 자동으로 확장됩니다. 그러나 생성 가능한 EC2 인스턴스의 최대 개수는 다음과 같이 제한됩니다.
활성 Coreapp 인스턴스 | 최대 EC2 인스턴스 |
---|---|
2 | 3 |
4 | 4 |
8 | 5 |
16 | 8 |
32 | 15 |
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 연결 수 |
---|---|
| 318 |
| 636 |
| 1272 |
| 2543 |
| 1212 |
| 2424 |
| 4848 |
| 9696 |
| 19391 |
| 38783 |
| 636 |
| 1272 |
| 2543 |
| 5086 |
| 12716 |
| 20345 |
| 298 |
| 596 |
| 1192 |
| 2384 |