WhatsApp은 사용자가 서로 메시지를 교환할 수 있는 소셜 메시징 프로그램입니다.
WhatsApp이 어떻게 작동하는지 생각해 본 적이 있습니까?
생성 및 운영을 뒷받침하는 개념은 무엇입니까?
이 기사에서는 WhatsApp의 기본 사항에 대해 설명합니다. 시스템 디자인.
또한 모든 종류의 채팅 소프트웨어를 구축하는 데 사용할 수 있는 WhatsApp의 일반 아키텍처를 살펴보겠습니다.
더 이상 고민하지 않고 WhatsApp의 시스템 디자인을 살펴보겠습니다!
1. 주요 요구 사항
WhatsApp은 전 세계의 많은 사람들이 사용하는 확장성이 뛰어난 기술입니다. 결과적으로 거의 항상 신뢰할 수 있고 작동할 수 있도록 잘 설계되어야 합니다.
결과적으로 시스템의 중요한 요구 사항을 결정하는 것이 중요합니다.
WhatsApp 메신저의 최소 요구 사항은 다음과 같습니다.
- 일대일 상호작용을 촉진할 수 있습니다.
- 메시지 확인 및 마지막 확인이 모두 가능합니다(전송됨, 전달됨 및 읽기).
- 종단 간 암호화 및 미디어 지원(이미지/비디오)을 허용합니다.
필요한 서비스에 필요한 용량을 알아보겠습니다.
2. 용량 추정
우리의 목표는 많은 양의 트래픽을 처리할 수 있는 플랫폼을 만드는 것입니다. 하루에 10억 개의 SMS가 전송된다고 가정합니다. 우리는있어:
- 매일 10억 명의 사람들이 XNUMX억 개의 SMS를 보냅니다.
- 최대 트래픽(초당)에서 700,000명이 활동했습니다(평균 6배).
- 최대 사용량 동안 초당 40천만 개의 메시지가 전송됩니다.
- 메시지의 평균 길이는 160자입니다. 10B * 160 = 1.6TB의 데이터가 매일 생성됩니다.
- 10년의 서비스 기간을 예로 들어 보겠습니다. 1.6 * 365B * XNUMXPB
- 전체 애플리케이션은 마이크로서비스로 구성되며 각 마이크로서비스는 특수 작업을 실행합니다. 메시지를 보내는 데 20밀리초가 걸리고 서버당 100개의 동시 연결이 있다고 가정합니다. 결과적으로 필요한 채팅 서버의 예상 수 = (초당 채팅 메시지 대기 시간)/서버당 동시 연결 수 = 40M * 20ms / 100 = 8000 서버입니다.
3. 고수준 아키텍처
이 시스템은 두 가지 핵심 서비스를 기반으로 합니다. 예를 들어 채팅 서비스 및 임시 서비스. 채팅 서비스는 사용자의 온라인 메시지에서 발생하는 모든 트래픽을 처리합니다. 동시에 임시 서비스는 사용자가 오프라인일 때 트래픽을 처리합니다.
사용자가 온라인 상태인 경우 채팅 서비스에서 메시지 전달을 담당합니다.
메시지 수신자가 온라인인지 여부를 확인합니다. 수신자가 온라인인 경우 이 서비스는 메시지를 즉시 전달합니다. 수신자가 온라인이 아닌 경우 임시 서비스는 수신자가 온라인으로 돌아올 때 메시지를 보냅니다.
임시 서비스는 오프라인 사용자가 다시 연결할 때까지 임시로 액세스할 수 있는 데이터를 유지하기 위해 별도의 저장 영역을 유지합니다.
고수준 API 설계
이 서비스에는 메시지 보내기 및 읽기를 위한 두 가지 고급 기능 API가 있습니다. REST 아키텍처를 사용하여 시스템을 구현할 수 있습니다.
메시지 전송을 위한 매개변수
이 API는 두 사용자 간에 메시지를 전송하는 데 사용됩니다.
대화의 매개변수
이 API는 스레드된 채팅을 표시하는 데 사용됩니다. WhatsApp을 열 때 가장 먼저 보이는 것을 고려하십시오. 단일 API 쿼리에서 한 사용자에 대한 몇 가지 메시지만 받고 싶습니다. 이를 처리하려면 오프셋 및 메시지 카운트 매개변수가 필요합니다.
마지막으로 본, 단일 눈금 및 이중 눈금과 같은 기능의 기능은 무엇입니까?
이러한 서비스 배포에서 중요한 역할은 승인 서비스입니다. 이러한 기능은 이 서비스가 승인 응답을 계속 생성하고 확인하기 때문에 개발되었습니다.
- 단일 틱: 사용자 A의 메시지가 사용자 B에 도달하면 서버는 메시지가 전송되었음을 확인하는 단일 틱을 보냅니다.
- 더블 틱: 서버의 메시지가 적절한 연결을 통해 사용자 B에게 전송된 후 사용자 B는 서버에 대한 메시지 수신을 확인합니다. 그런 다음 서버는 사용자 A에게 또 다른 확인을 제공합니다. 결과적으로 중복 틱이 나타납니다.
- 블루 틱: 사용자 B는 메시지를 확인한 후 서버에 또 다른 승인을 보냅니다. 그런 다음 서버는 사용자 A에게 추가 확인 메시지를 보냅니다. 그 후 사용자 A의 화면에 파란색 체크 표시가 나타납니다.
- 마지막으로 본: 하트비트 메커니즘은 마지막으로 본 기능에 대해 전적으로 책임이 있습니다. 5초마다 하트비트가 서버로 전송되어 다른 사용자가 쉽게 액세스할 수 있는 테이블에서 각 사용자의 마지막으로 본 상태를 추적합니다.
4. 주요 기능 설계
개인화된 상호작용
이것은 채팅 서비스의 필수 부분입니다. 사용자는 이 서비스를 사용하여 다른 사용자에게 간단히 메시지를 보낼 수 있습니다. 작동 방식을 살펴보겠습니다.
Jay가 Aayush와 통신하기를 원한다고 가정합니다. Jay는 메시지를 받는 채팅 서버에 연결되어 있습니다. Jay는 채팅 서버로부터 메시지가 발송되었다는 확인을 받습니다. 채팅 서버는 이제 Aayush가 연결된 채팅 서버에 대한 정보를 데이터 저장소에서 요청하고 있습니다. Jay의 채팅 서버는 이제 Aayush의 채팅 서버로 메시지를 전송하고 Aayush는 푸시 메커니즘을 통해 메시지를 받습니다. Aayush는 이제 Jay의 채팅 서버에 확인을 보내 메시지가 배달되었음을 Jay에게 알립니다. Aayush가 메시지를 다시 읽으면 메시지를 읽었다는 새로운 확인이 Jay에게 전달되었습니다.
사용자 활동 현황
사람이 마지막으로 활동한 시간은 인스턴트 메신저의 일반적인 기능입니다.
클라이언트와 서버 간의 연결을 유지 관리하기 위한 시스템이 이 다이어그램에 나와 있습니다. 웹 소켓은 서버와 클라이언트 간의 양방향 연결을 설정하는 데 사용되었습니다. 이러한 연결은 사용자의 활동 상태를 모니터링하는 데 사용되는 하트비트를 보냅니다.
엔드 투 엔드 개인 정보 보호
종단 간 암호화는 대화 중인 사용자만 통신 내용을 읽을 수 있도록 하는 핵심 기능입니다. 공개 키는 통신에 관련된 모든 사용자 간에 공유되며 종단 간 암호화를 유지하는 데 중요합니다. 채널에 서로 통신하는 Jay와 Aayush라는 두 명의 사용자가 있다고 가정합니다.
Jay에게는 Aayush의 공개 키가 있고 Aayush에는 Jay의 공개 키와 비공유 개인 키가 있습니다. 결과적으로 Jay는 메시지를 전송할 때 Aayush의 개인 키로 디코딩할 수 있는 Aayush의 공개 키로 메시지를 암호화합니다.
마찬가지로 Jay는 Aayush의 통신만 해독할 수 있습니다. 결과적으로 Jay와 Aaysuh만 서로의 통신을 볼 수 있으며 서버는 전체 프로세스에서 게이트웨이 역할만 합니다.
5. 병목 현상
모든 시스템은 오작동하기 쉽습니다. 이러한 대량의 트래픽을 관리하려면 병목 현상을 방지하기 위해 서비스가 항상 작동 상태를 유지하고 내결함성을 유지해야 합니다. 우리 서비스는 전적으로 Chat 및 Transient 서버에 의존하기 때문에 운영에서 발생하는 모든 문제를 해결해야 합니다.
채팅 서버 오류: 이것이 우리 시스템의 핵심입니다. 사용자가 온라인 상태일 때 메시지 관리 및 전달을 담당합니다. 결과적으로 이 시스템은 사용자와의 연결을 유지합니다.
결과적으로 이 서비스가 실패하면 전체 아키텍처가 손상됩니다. 채팅 서버의 장애를 관리하는 방법에는 두 가지가 있습니다. 한 가지 방법은 TCP 연결을 다른 서버로 이동하는 것이고 다른 하나는 연결이 끊어진 경우 사용자가 자동으로 연결을 시작할 수 있도록 하는 것입니다.
임시 저장소의 오류: 결국 전체 서비스를 손상시킬 수 있는 실패하기 쉬운 또 다른 구성 요소는 임시 저장소입니다. 이 서비스가 실패하면 오프라인 사용자에게 보내는 메시지가 손실됩니다.
각 사용자의 임시 저장소를 복제하여 메시지 손실을 방지할 수 있습니다. 결과적으로 사용자가 온라인으로 돌아올 때마다 복제본을 사용하여 기능을 처리할 수 있습니다. 원본 서버에 액세스할 수 있게 되면 사용자 임시 저장소의 원본 및 복제본 인스턴스가 모두 단일 저장소로 결합됩니다.
6. 최적화 기법
숨어 있음: 원활하고 향상된 클라이언트 경험을 제공하기 위해서는 메신저 서비스가 실시간이어야 합니다. 결과적으로 자주 액세스하는 데이터의 일부를 캐싱하여 대기 시간을 줄여야 합니다. Redis와 같은 분산 캐시를 사용하여 메모리에 사용자 활동 상태와 최근 대화를 캐시할 수 있습니다.
유효성: 대부분의 시간 동안 서비스를 사용할 수 있어야 합니다. 우리 시스템은 내결함성이 있어야 하므로 손실된 메시지가 중복된 메시지에서 신속하게 복구될 수 있도록 임시 메시지의 복사본을 여러 개 보관할 수 있습니다. 결과적으로 시스템의 가용성이 위협받을 수 없습니다.
결론
우리 시스템은 이제 몇 가지 기능만 지원하지만 그룹 채팅을 추가하여 여러 개인에게 메시지를 배포하도록 쉽게 확장할 수 있습니다. 화상 통화 및 전화 통화 기능을 제공할 수도 있습니다. 이 시스템은 사용자가 상태 업데이트 또는 설명을 게시하고 서로 읽을 수 있도록 개발할 수도 있습니다.
WhatsApp 시스템 디자인에 대한 높은 수준의 개요를 제공하기 위해 열심히 노력했습니다. 즐감하셨길 바라며 잘 사용하겠습니다.
댓글을 남겨주세요.