WhatsApp은 RabbitMQ를 사용합니다

Rabbitmq는 기반을 쌓았습니다 Erlang 범용 프로그래밍 언어 및 WhatsApp에서 메시징에도 사용됩니다.

요약

WhatsApp은 Erlang에 구축 된 RabbitMQ를 사용하여 메시지 전달을위한 메시징 대기열로 사용합니다.

실시간 채팅 시스템을 설계 할 때 WhatsApp 및 Facebook Messenger와 같은 인기있는 메시징 플랫폼에서 사용하는 대기열을 고려하는 것이 중요합니다. 이 플랫폼의 수십억 명의 사용자를 고려할 때 각 사용자마다 개인 대기열 또는 카프카 주제를 갖는 것이 논리적으로 보일 수 있지만,이 접근법은 실용적으로 많은 수의 대기열이나 주제가 필요합니다. 그러나 WhatsApp 및 Facebook 메신저는 메시지 전달을 위해 “iris”(Kafka와 유사)라는 대기열을 사용하는 것으로 관찰되었습니다.

메시지 대기열에서 데이터베이스 (예 : HBase 및 Myrocks)를 채우는 내부 시스템이 있지만 이러한 데이터베이스는 기본 전달 시스템이 아닙니다.

질문과 답변

1. Rabbitmq는 무엇입니까??

Rabbitmq는 Erlang General-Progrose 프로그래밍 언어를 기반으로합니다.
2. WhatsApp은 RabbitMQ를 어떻게 사용합니까??

WhatsApp은 RabbitMQ를 메시지 전달을위한 메시징 대기열로 사용합니다.
삼. 메시징 대기열의 목적은 무엇입니까??

메시징 큐는 시스템의 구성 요소를 분리하는 데 사용되어 메시지를 비동기 적으로 전송할 수 있습니다.
4. whatsapp 또는 Facebook 메신저에서 메시지 전달에 개인 대기열을 사용할 수 있습니까??

개인 대기열은 논리적으로 보일 수 있지만,이 플랫폼의 수십억 명의 사용자를 고려할 때 비현실적인 대기열이 필요합니다.
5. WhatsApp 및 Facebook Messenger가 메시지 전달을 위해 사용하는 큐?

Whatsapp 및 Facebook 메신저 메시지 전달에 “iris”라는 대기열을 사용합니다. “Iris”는 Kafka와 유사합니다.
6. WhatsApp에서 메시지 저장에 사용하는 데이터베이스 중 일부는 무엇입니까??

WhatsApp은 HBase 및 MyRocks와 같은 데이터베이스를 사용하여 메시지를 저장합니다. 이 데이터베이스는 메시지 큐에서 채워져 있습니다.
7. RabbitMQ는 WhatsApp의 1 차 전달 시스템입니다?

아니요, RabbitMQ는 WhatsApp의 주요 전달 시스템이 아닙니다. 메시지 전달을위한 메시징 대기열로 사용됩니다.
8. WhatsApp 및 Facebook 메신저 동기 또는 비동기식에서 메시지 전달입니다?

WhatsApp 및 Facebook 메신저에서의 메시지 전달은 비동기식이므로 메시지가 서로 독립적으로 전송되고받습니다.
9. RabbitMQ와 같은 메시징 대기열을 사용하면 어떤 이점이 있습니까??

RabbitMQ와 같은 메시징 큐를 사용하면 구성 요소의 분리, 확장 성 향상 및 시스템 요소 간의 비동기 통신이 가능합니다.
10. RabbitMQ는 높은 볼륨의 메시지를 처리 ​​할 수 ​​있습니다?

예, RabbitMQ는 많은 양의 메시지를 처리하도록 설계되었으며 효율적이고 안정적으로 전달할 수 있습니다.
11. 메시징 대기열을 구현하기위한 RabbitMQ의 대안은 무엇입니까??

RabbitMQ의 일부 대안에는 Apache Kafka, ActiveMQ 및 Redis Streams가 있습니다.
12. RabbitMQ와 같은 메시징 대기열을 사용하는 데 제한이 있습니까??

RabbitMQ와 같은 메시징 대기열 사용의 일부 제한 사항에는 최적의 성능에 맞게 구성하고 조정해야 할 필요성, 제대로 구성되지 않은 경우 잠재적 메시지 손실 및 메시징 큐를 지원하기 위해 추가 인프라가 필요합니다.
13. RabbitMQ는 메시지 외에 다른 목적으로 사용할 수 있습니다?

예, RabbitMQ는 작업 일정, 이벤트 중심 아키텍처 및 데이터 스트리밍과 같은 메시징 외에 다른 목적으로 사용할 수 있습니다.
14. RabbitMQ는 메시지 지속성을 지원합니다?

예, RabbitMQ는 메시지 지속성을 지원하여 시스템 실패시 메시지를 저장 및 검색 할 수 있습니다.
15. RabbitMQ는 메시지 전달 신뢰성을 어떻게 보장합니까??

RabbitMQ는 메시지 승인, 게시자 확인 및 대기열 내구성과 같은 기능을 통해 메시지 전달 신뢰성을 보장합니다.

WhatsApp은 RabbitMQ를 사용합니다

Rabbitmq는 기반을 쌓았습니다 Erlang 범용 프로그래밍 언어 및 WhatsApp에서 메시징에도 사용됩니다.

WhatsApp 또는 FB 메신저에 사용되는 대기열

실시간 채팅을위한 시스템 디자인을 생각하면서, 나는 어떤 종류의 대기열 WhatsApp 또는 FB Messenger를 서버 측에서 사용하여 수신자에게 메시지를 전달하는지 궁금합니다. 내가 생각했던 것은 개인당 대기열/카프카 주제가 있다는 것이 었으므로 새로운 메시지를 사용자 A로 전달해야 할 때 메시지는 A의 대기열에 eNqueue입니다. 그러나 수십억의 사용자가있을 수 있습니다 (FB는 20 억 명의 사용자가 있습니다)? 그렇다면 어떤 대기열이이를 수행 할 수 있습니다. 모든 의견을 환영합니다! 감사합니다!

2019 년 6 월 25 일 16:44에 요청했습니다

1,669 8 8 금 배지 23 23은 배지 37 37 청동 배지

Messager가 HBase를 통해 구축되었다는 문서를 찾을 수 있으며 이제 MyRocks. 큐에서 해당 데이터베이스를 채울 내부 시스템이 있지만 예, 기본 전달 시스템은 아닙니다. 암호.FB.com/core-data/…

2019 년 6 월 26 일 3:08

@cricket_007 의견에 감사드립니다. Yeap, FB가 Iris (Kafka Like)를 배달 대기열로 사용하는 것처럼 보입니다.

alifzl/yomkippur

이 커밋은이 저장소의 어떤 지점에도 속하지 않으며, 저장소 외부의 포크에 속할 수 있습니다.

스위치 브랜치/태그

지점 태그

분기를로드 할 수 없었습니다

보여줄 것이 없습니다

태그를로드 할 수 없습니다

보여줄 것이 없습니다

이미 사용중인 이름입니다

제공된 지점 이름이 이미 존재합니다. 많은 git 명령은 태그와 분기 이름을 모두 받아들이 므로이 분기를 만드는 것이 예기치 않은 동작을 유발할 수 있습니다. 이 지점을 만들고 싶습니까??

취소 생성

  • 현지의
  • Codespaces

https github cli

웹 URL을 사용하여 SVN과 함께 git 또는 체크 아웃 사용.

공식 CLI와 함께 빨리 일하십시오. CLI에 대해 자세히 알아보십시오.

필요한 로그인

Codespace를 사용하려면 로그인하십시오.

Github 데스크탑을 시작합니다

아무 일이 발생하지 않으면 Github 데스크탑을 다운로드하고 다시 시도하십시오.

Github 데스크탑을 시작합니다

아무 일이 발생하지 않으면 Github 데스크탑을 다운로드하고 다시 시도하십시오.

Xcode를 시작합니다

아무 일이 발생하지 않으면 Xcode를 다운로드하고 다시 시도하십시오.

Visual Studio 코드 시작

Codespace가 준비된 후에 열립니다.

Codespace를 준비하는 데 문제가있었습니다. 다시 시도하십시오.

최신 커밋

git 통계

파일

최신 커밋 정보를로드하지 못했습니다.

최신 커밋 메시지

시간을 투입하십시오

readme.MD

Yom Kippur.

무엇을합니까?

Yom Kippur 데모

  • AVD (Android Virtual Device)에서 사전 구성된 WhatsApp 응용 프로그램에서 단일 메시지 보내기/받기
  • AVD에서 Contact-List를 만들고 보내기/수신 물건에 사용하십시오
  • 말 그대로 그것은 AVD로 모든 것을 할 수 있습니다 (설득 할 수있는 수많은 가능성을 만듭니다)

첫 번째로, 나는 Yowsup의 유일한 선택을 보았지만 아래에 나열된 문제로 인해 다른 방식으로 구현하기 위해 마음이 바뀌 었습니다

  • 다양한 커뮤니티 문제 (여기 링크)
  • YOSUP는 WhatsApp의 높은 보안 고려 사항과 관련하여 WhatsApp Restapi와 상호 작용하는 비동기식 종류의 API이며 모든 사용자의 현재 활성 세션에 대해 매우 민감했으며 동기 솔루션에 매우 친숙하지 않을 것입니다. (아마도 WhatsApp의 웹 뷰를 사용하는 제한 사항을 알고 있듯이 휴대 전화에서 동시에 일관된 활성 인터넷 연결을해야한다고 말합니다
  • 내 게으름과도 어려운 방식으로 그렇게하도록 도전

글쎄,이 프로젝트의 의존성, 그들은 다소 다소! 먼저이 요구 사항을 만족시켜야합니다
Windows 설치 업체는 굴절되지만 Linux 또는 MacOS 머신에서 이행 할 수 있습니다 (둘 다 테스트되지 않음)

의존 설명 / 다운로드 링크
안드로이드 스튜디오 Android API 28을 가진 Android Studio
자바 Java JDK 11
MySQL MySQL 설치 프로그램 커뮤니티 8.x 이상
파이썬 2.7 파이썬 2.7
Appium v1.10 이상
RabbitMq Rabbitmq의 최신 버전
우편 집배원 Postman의 최신 버전

고려 사항 : Python 2에는 Conda Virenv를 사용할 수 있습니다.7, 그러나 그것은 나에게 심각한 두통을 쳤다 (권장되지 않음)
이 프로젝트에 Python 2를 사용한 주된 이유는 Appium, MySQL Connector Client 및 RabbitMQ가 버전 3에서 호환성이 없기 때문입니다.

우선,이 부분에서 인내하십시오. 이렇게 간단한 작업을 수행하기 위해 의존성을 닦는 데 피와 눈물이 필요했습니다.

1.안드로이드 가상 장치
Android Studio의 Luanch AVD 관리자, Android 9로 장치 설정.0 API 28 (추가 단계로 필요하기 때문에 AVD의 선택 및 적절한 이름).
AVD 자체를 통해 WhatsApp을 설치해야하므로 PlayStore 지원 버전을 선택하십시오.
계정 에이 환경 변수가 있는지 확인하십시오

변수 이름 가변 값
Android_home C : \ 사용자 \ fzl \ appdata \ local \ android \ sdk
java_home C : \ Program Files \ Java \ JDK-11.0.2
Pythonpath C : \ python27; c : \ python27 \ lib \ site-packages; c : \ python27 \ lib; c : \ python27 \ dlls; c : \ python27 \ scripts
반점 C : \ python27; c : \ python27 \ scripts; c : \ python27 \ lib \ site-packages; c : \ program files \ java \ jdk-11.0.2; C : \ Program Files \ Java \ JDK-11.0.2 \ bin;

그런 다음 AVD를 시작하고 WhatsApp을 설치하고 장치로 ADB를 승인해야합니다 (필수)
이를 위해 AVD의 자동화를 확인하려면 ADB 장치 또는 ADB USB를 실행해야합니다.

씨:\유SERS\에프ZL\ㅏppdata\엘OCAL\ㅏndroid\에스DK\피latform-tools : ADB 장치 첨부 된 장치 목록 에뮬레이터 -5554 장치

무단 결과를보고 있다면이 링크를 따라야합니다.

2.RabbitMQ 구성

RAABITMQ를 설치 한 후 RabbitMQ-Plugins를 실행해야합니다. RabbitMQ 서비스를 제한하는 것이 필요할 수 있습니다.
이 후에는 로컬 컴퓨터의 http : // localhost : 15672/#/주소로 Rabbitmq Web-Gui에 액세스 할 수 있어야합니다. 그렇다면 아래 명령으로 새 사용자를 만들고 관리자를 만들 수 있습니다

Rabbitmqctl add_user 사용자 이름 비밀번호  이것은 사용자를 관리자로 만듭니다 Rabbitmqctl set_user_tags 사용자 이름 관리자  이것은 사용자에 대한 권한을 설정합니다 Rabbitmqctl set_permissions -p / username ".*" ".*" ".*"

새로 생성 된 자격 증명으로 로그인하고 rabbitmq_conf라고 불리는이 저장소에 이미 첨부 된 대기열 사양을 가져옵니다.개요 menue 아래의 가져 오기 정의 섹션에서 JSON.
RabbitMQ에 필요한 구성을 생성하고 필요한 특권을 가능하게합니다.

삼.Appium
기본 설정으로 Appium 서버를 실행하십시오. Appium-Default-Capabilities ”는 이미 코드에 포함되어 있습니다. TL; DR :이 단계에서 할 일이 없습니다.

4.MySQL
MySQL의 커뮤니티 에디션을 설치하고 OS가 시작될 때 적절한 DB 계정을 작성하고 서비스를 자동으로 설정하십시오.

5.파이썬 종속성을 설치하십시오
단순히 PIP 설치 – R 종속성을 실행하십시오.중고 라이브러리의 종속성을 해결하기 위해 TXT.
당신은 이것과 이것과 이것과 이것을 설치할 수있는 mysqldb 라이브러리의 더 이상 사용되지 않는 버전에 직면 할 수 있습니다. Python 2 설치를 관리하십시오.언급 된 라이브러리의 X 버전.

6.로그 파일에 대한 디렉토리를 만듭니다
디렉토리와 파일을 만듭니다’아래 언급 :

 디렉토리 씨:\VAR\엘OG [디렉토리] C :\VAR\엘OG\ wHatsapp_api [디렉토리]  로그 파일 씨:\VAR\엘OG\ㅏpi.로그 C :\VAR\엘OG\ wHatsapp_single_consumer.로그 C :\VAR\엘OG\ wHatsapp_single_worker.로그 C :\VAR\엘OG \

7.Yom Kippur를 설정하십시오’s 구성 파일
Yomkippur-Master \ configs \ config로 이동하십시오.CFG 및 다음을 입력하십시오.
(당신이 무엇을하고 있는지 알지 않는 한 아무것도 바꾸지 마십시오)

[MySQL] 호스트 = 127.0.0.1 사용자 이름 ='MySQL 사용자 이름입니다' 비밀번호 ='MySQL 비밀번호' 데이터베이스 = WhatsApp [RabbitMq] IP = 127.0.0.1 ipqueuename = iPaddr.대기열 사용자 이름 ='RabbitMQ 사용자 이름' 비밀번호 ='RabbitMQ 비밀번호' [queue_name] single_message = whatsapp_singlemessage_queue broadcast_message = whatsapp_broadcastmessage_queue add_contact = whatsapp_newcontact_listener_queue _message = whatsapp_messagelistener_queue

메인을 실행하십시오.py 및 add_new_contact_producer.두 개의 개별 터미널/CMD 환경에서 PY.
오류가 보이지 않으면 가기에 좋습니다.

  1. MySQL 서버가 실행 중인지 확인하십시오
  2. RabbitMQ Sever가 runnig인지 확인하십시오
  3. Defualt 설정으로 Appium을 실행하십시오
  4. 이 스크립트를 실행하십시오

파이썬 메인.Py Python add_new_contact_producer.Py Python Single_Message_Producer.파이

  1. 우체부를 실행하고 아래 목록에서 바람직한 포스트 명령을 작성하십시오

Google Contacts 앱에서 연락처 추가

WhatsApp을 통해 단일 메시지를 보냅니다

개발 및 기여?

기여하고 싶습니다? 엄청난! a에서 나를 두드리십시오.fazeli95 [at] gmail [dot] com 또는 풀 요청을 만듭니다.

이 프로젝트에 사용 된 모든 구성 요소는 오픈 소스이며 MIT 라이센스가 있으며 비 통신 제품에 사용할 수 있습니다

에 대한

RabbitMQ, AVD 및 Appium을 사용한 WhatsApp 메시지 중개인

Rabbitmq 소개

여기서 우리는 RabbitMQ가 무엇인지, RabbitMQ의 사용 및 예제와 함께 응용 분야에서 RabbitMQ를 사용해야하는 이유를 배웁니다.

Rabbitmq 란 무엇입니까??

RabbitMq 이다 AMQP 메시징 브로커 및 가장 인기있는 오픈 소스 및 크로스 플랫폼 메시지 중개인입니다.

RabbitMQ는 또한 발송 된 메시지와 같은 다른 플랫폼 응용 프로그램간에 데이터를 교환하는 방법입니다 .그물 응용 프로그램은 a 마디.JS 응용 프로그램 또는 자바 애플리케이션.

Rabbitmq는 기반을 쌓았습니다 Erlang 범용 프로그래밍 언어 및 WhatsApp에서 메시징에도 사용됩니다.

AMQP는 무엇입니까??

고급 메시지 대기 프로토콜 (AMQP)는 메시지 지향을위한 개방형 표준 응용 프로그램 레이어 프로토콜이며 AMQP의 기능은 메시지 방향, 대기열, 라우팅 (포인트 간 포인트 및 게시 및 게시 포함), 신뢰성 및 보안입니다.

JPMorgan과 Imatix Corporation에 의해 개발되었습니다. AMQP는 다음 주요 특성으로 목표로 설계되었습니다

  • 보안
  • 신뢰할 수 있음
  • 상호 운용성
  • 기준
  • 열려 있는

RabbitMQ는 가볍고 사용 가능한 구내에 쉽게 배포 할 수 있으며 여러 메시징 프로토콜을 지원합니다. RabbitMQ는 분산 및 연합 구성에 배치하여 고 규모의 고용성 요구 사항을 충족 할 수 있습니다.

다음은 RabbitMQ가 응용 프로그램에서 발신자와 소비자 사이의 중재자 역할을하는 방법에 대한 그림 표현입니다.

RabbitMQ 프로세스 흐름도

RabbitMQ를 사용하는 이유와시기?

이제 대부분의 사람들이 이메일 또는 SMS, 보고서를 보내는 것과 같은 단일 응용 프로그램에서 여러 작업을 수행하고 응용 프로그램에 무거운로드가 발생하므로 이러한 작업을 분리하면 더 많은 요청을 제공 할 수있는 더 많은 공간 (메모리)을 얻게됩니다.

RabbitMQ를 사용하면 Excel 또는 PDF 형식으로 보고서를 보내는 것과 같은 웹 응용 프로그램에서 많은 작업을 제거 할 수 있습니다’S 또는 전자 메일, SMS 또는 다른 응용 프로그램 트리거 처리를 시작하기 위해 다른 작업을 보내기.

RabbitMQ는 오픈 소스 및 크로스 플랫폼 메시지 중개인이므로 IT’S와 같은 많은 언어와 함께 사용하기 쉽습니다 .네트, 자바, 파이썬, 루비, 노드.JS.

RabbitMQ 지원 클라이언트 라이브러리

RabbitMQ는 여러 운영 체제 및 프로그래밍 언어를 지원합니다. Rabbitmq는 다음 과정을위한 다양한 클라이언트 라이브러리를 제공했습니다.

  • .그물
  • 자바
  • 봄 프레임 워크
  • 루비
  • 파이썬
  • PHP
  • 목표 C 및 신속한
  • 자바 스크립트
  • 가다

시스템 설계 : WhatsApp

Whatsapp, Facebook Messenger 및 Wechat과 같은 서비스와 유사한 인스턴트 메시징 서비스와 같은 WhatsApp을 설계합시다.

WhatsApp이란 무엇입니까??

WhatsApp은 사용자에게 인스턴트 메시징 서비스를 제공하는 채팅 응용 프로그램입니다. 180 개 이상의 국가에서 20 억 명이 넘는 사용자를 연결하는 지구상에서 가장 많이 사용되는 모바일 애플리케이션 중 하나입니다. WhatsApp도 웹에서 사용할 수 있습니다.

요구 사항

당사 시스템은 다음 요구 사항을 충족해야합니다

기능 요구 사항

  • 일대일 채팅을 지원해야합니다.
  • 그룹 채팅 (최대 100 명).
  • 파일 공유 (이미지, 비디오 등.)).

비 기능적 요구 사항

  • 최소한의 대기 시간으로 고 가용성.
  • 시스템은 확장 가능하고 효율적이어야합니다.

확장 된 요구 사항

  • 메시지 영수증을 보내, 배달 및 읽기.
  • 마지막으로 본 사용자의 시간을 보여줍니다.
  • 푸시 알림.

추정 및 제약

추정과 제약으로 시작하겠습니다.

참고 : 면접관과 규모 또는 트래픽 관련 가정을 확인하십시오.

교통

DAU (Daily Active 사용자)가 5 천만 명 있다고 가정하고 평균적으로 각 사용자는 매일 4 명의 다른 사람에게 최소 10 개의 메시지를 보냅니다. 이것은 하루에 20 억 메시지를 제공합니다.

50 m i l l i o n × 20 m e s s a g e s = 2 b i l l i o n / d a y 50 \ space million \ times 20 \ space 메시지 = 2 \ space billion / day 50 mi ll i o n × 20 m es = 2 bi ll i o n / d a y

메시지는 이미지, 비디오 또는 기타 파일과 같은 미디어를 포함 할 수도 있습니다. 메시지의 5 %가 사용자가 공유하는 미디어 파일이라고 가정 할 수 있습니다.

5 p e r c e n t × 2 b i l l i o n = 200 m i l l i o n / d a y 5 \ space \ times 2 \ space billion = 200 \ space million / day 5 perce n t × 2 bi ll i o n = 200 mi ll i o n / d a y

우리 시스템에 대한 초당 요청 (RPS)은 무엇입니까?? 하루에 20 억 요청은 초당 24K 요청으로 변환됩니다.

2 b i l l i o n (24 h r s × 3600 s e c o n d s) = ~ 24 k r e q u e s t s / s e c o n d \ frac<2 \space billion> <(24 \space hrs \times 3600 \space seconds)>= \ SIM 24K \ Space Requests / Second (24 h rs × 3600 Seco n d s) 2 bi ll i o n = ~ 24k re q u es t s / seco n d

### 스토리지 각 메시지가 평균 100 바이트라고 가정하면 매일 약 200GB의 데이터베이스 스토리지가 필요합니다.

2 b i l l i o n × 100 b y t e s = ~ 200 g b / d a y 2 \ space \ times 100 \ space bytes = \ sim 200 \ space gb / day 2 bi ll i o n × 100 b y t es = ~ 200 gb / d a y

우리의 요구 사항에 따라, 우리는 또한 일일 메시지 (1 억)의 약 5 %가 미디어 파일이라는 것을 알고 있습니다. 각 파일이 평균 50kb라고 가정하면 매일 10TB의 스토리지가 필요합니다.

100 m i l l i o n × 100 k b = 10 t b / d a y 100 \ space million \ times 100 \ space kb = 10 \ space tb / day 100 mi ll i o n × 100 k b = 10 tb / d a y

그리고 10 년 동안 약 38pb의 저장 공간이 필요합니다.

(10 T B + 0.2 T B) × 10 Y E A R S × 365 D A Y S = ~ 38 P B (10 \ Space TB + 0.2 \ space tb) \ Times 10 \ Space Years \ Times 365 \ Space Days = \ SIM 38 \ Space PB (10 TB + 0.2 tb) × 10 Ye a rs × 365 d a ys = ~ 38 pb

### 대역폭 시스템이 처리 중입니다.매일 2TB의 입학, 초당 약 120MB의 최소 대역폭이 필요합니다.

10.2 T B (24 H R S × 3600 S E C O N D S) = ~ 120 M B / S E C O N D \ FRAC<10.2 \space TB> <(24 \space hrs \times 3600 \space seconds)>= \ SIM 120 \ Space MB/Second (24 H rs × 3600 Seco N D S) 10.2 tb = ~ 120 mb / seco n d

### 높은 수준의 추정치는 여기에 우리의 높은 수준의 추정치가 있습니다

유형 추정
매일 활성 사용자 (DAU) 5 천만
초당 요청 (RPS) 24k/s
저장 (하루) ~ 10.2 tb
스토리지 (10 년) ~ 38 PB
대역폭 ~ 120 MB/s

데이터 모델 설계

whatsapp-datamodel

이것은 우리의 요구 사항을 반영하는 일반적인 데이터 모델입니다. 다음 테이블이 있습니다 사용자 이 테이블에는 이름, 전화기 및 기타 세부 사항과 같은 사용자의 정보가 포함됩니다. 메시지 이름에서 알 수 있듯이이 테이블은 유형 (텍스트, 이미지, 비디오 등과 같은 속성이있는 메시지를 저장합니다.메시지 전달을위한), 내용 및 타임 스탬프. 메시지에는 해당 ChatId 또는 GroupId도 있습니다 . 채팅 이 테이블은 기본적으로 두 사용자 간의 개인 채팅을 나타내며 여러 메시지를 포함 할 수 있습니다. user_chats 이 테이블은 여러 사용자가 여러 채팅 (N : M 관계)을 가질 수 있고 그 반대의 경우 사용자를 매핑하고 채팅합니다. 여러 떼 이 테이블은 여러 사용자 간의 그룹을 나타냅니다. user_groups 이 테이블은 사용자와 그룹을 여러 사용자로 매핑하여 여러 그룹 (N : M 관계)의 일부가 될 수 있으며 그 반대도 마찬가지입니다.

우리는 어떤 종류의 데이터베이스를 사용해야합니까??

우리의 데이터 모델은 매우 관계적인 것처럼 보이지만 반드시 모든 것을 단일 데이터베이스에 저장할 필요는 없습니다. 이것은 확장 성을 제한하고 빠르게 병목 현상이 될 수 있습니다. 우리는 특정 테이블에 대한 소유권이있는 다른 서비스간에 데이터를 분할합니다. 그런 다음 PostgreSQL과 같은 관계형 데이터베이스 또는 Apache Cassandra와 같은 분산 NOSQL 데이터베이스를 사용할 수 있습니다.

API 디자인

서비스에 대한 기본 API 설계를 수행하겠습니다

모든 채팅이나 그룹을 얻으십시오

이 API는 주어진 userID의 모든 채팅 또는 그룹을 얻을 수 있습니다 .

모든 것을 가져라(userID: uuid) : : 채팅[] | 그룹[] 

전체 화면 모드로 들어갑니다

전체 화면 모드 종료

매개 변수 사용자 ID (UUID) : 현재 사용자의 ID. 보고 결과 (Chat [] | group []) : 모든 채팅 및 그룹은 사용자가 일부입니다.

메시지를 받으십시오

channelId (채팅 또는 그룹 ID)가 주어진 사용자에 대한 모든 메시지를받습니다.

GetMessages(userID: uuid, channelid: uuid) : : 메시지[] 

전체 화면 모드로 들어갑니다

전체 화면 모드 종료

매개 변수 사용자 ID (UUID) : 현재 사용자의 ID. 채널 ID (UUID) : 메시지를 검색 해야하는 채널 (채팅 또는 그룹)의 ID. 보고 메시지 (메시지 []) : 주어진 채팅 또는 그룹의 모든 메시지.

문자 보내

사용자로부터 채널 (채팅 또는 그룹)으로 메시지를 보내십시오.

문자 보내(userID: uuid, channelid: uuid, 메시지: 메시지) : : 부울 

전체 화면 모드로 들어갑니다

전체 화면 모드 종료

매개 변수 사용자 ID (UUID) : 현재 사용자의 ID. 채널 ID (UUID) : 채널의 ID (채팅 또는 그룹) 사용자는 메시지를 보내려고합니다. 메시지 (메시지) : 메시지 (텍스트, 이미지, 비디오 등.) 사용자가 보내고 싶어합니다. 보고 결과 (부울) : 작업이 성공했는지 여부를 나타냅니다.

그룹에 가입하거나 떠납니다

사용자로부터 채널 (채팅 또는 그룹)으로 메시지를 보내십시오.

Joingroup(userID: uuid, channelid: uuid) : : 부울 그룹을 떠나다(userID: uuid, channelid: uuid) : : 부울 

전체 화면 모드로 들어갑니다

전체 화면 모드 종료

매개 변수 사용자 ID (UUID) : 현재 사용자의 ID. 채널 ID (UUID) : 채널의 ID (채팅 또는 그룹) 사용자가 가입하거나 떠나고 자합니다. 보고 결과 (부울) : 작업이 성공했는지 여부를 나타냅니다.

고급 디자인

이제 시스템의 고급 디자인을 해 보겠습니다.

건축학

우리는 MicroServices 아키텍처를 사용하여 수평으로 규모를 확장하고 서비스를 해체 할 수있게되므로. 각 서비스에는 자체 데이터 모델의 소유권이 있습니다. 우리 시스템을 일부 핵심 서비스로 나누자. 사용자 서비스 인증 및 사용자 정보와 같은 사용자 관련 문제를 처리하는 HTTP 기반 서비스입니다. 채팅 서비스 채팅 서비스는 WebSockets를 사용하고 클라이언트와 연결하여 채팅 및 그룹 메시지 관련 기능을 처리합니다. 또한 캐시를 사용하여 사용자가 온라인인지 여부를 결정하는 데 도움이되는 모든 활성 연결 종류의 세션을 추적 할 수 있습니다. 알림 서비스 이 서비스는 단순히 사용자에게 푸시 알림을 보냅니다. 그것은 별도로 자세히 논의 될 것입니다. 존재 서비스 PRESENTED SERVITY는 모든 사용자의 마지막으로 본 상태를 추적합니다. 그것은 별도로 자세히 논의 될 것입니다. 미디어 서비스 이 서비스는 미디어 (이미지, 비디오, 파일 등)를 처리합니다.) 업로드. 그것은 별도로 자세히 논의 될 것입니다. 서비스 간 커뮤니케이션 및 서비스 발견은 어떻습니까?? 우리의 아키텍처는 마이크로 서비스 기반이므로 서비스는 서로 소통 할 것입니다. 일반적으로 REST 또는 HTTP는 성능이 좋지만 더 가볍고 효율적인 GRPC를 사용하여 성능을 더욱 향상시킬 수 있습니다. 서비스 발견은 우리가 고려해야 할 또 다른 것입니다. 또한 개별 서비스 간의 관리, 관찰 가능 및 안전한 커뮤니케이션을 가능하게하는 서비스 메쉬를 사용할 수 있습니다. 참고 : REST, GraphQL, GRPC 및 서로 비교하는 방법에 대해 자세히 알아보십시오.

실시간 메시징

우리는 어떻게 효율적으로 메시지를 보내고받을 수 있습니까?? 두 가지 옵션이 있습니다 풀 모델 클라이언트는 주기적으로 HTTP 요청을 서버에 보내서 새 메시지가 있는지 확인할 수 있습니다. 이것은 긴 여론 조사와 같은 것을 통해 달성 될 수 있습니다. 푸시 모델 클라이언트는 서버와의 오래 지속되는 연결을 엽니 다. 새로운 데이터를 사용할 수있게되면 클라이언트에게 푸시됩니다. 이를 위해 WebSockets 또는 Serverent Events (SSE)를 사용할 수 있습니다. 풀 모델 접근법은 서버에 불필요한 요청 간접비를 생성하기 때문에 확장 가능하지 않으며 대부분의 경우 응답이 비어 있으므로 리소스를 낭비합니다. 대기 시간을 최소화하려면 Websockets와 함께 푸시 모델을 사용하는 것이 더 나은 선택입니다. 그러면 클라이언트와 연결이 열려 있으면 지연없이 클라이언트에게 데이터를 푸시 할 수 있기 때문입니다. 또한 Websockets는 단방향 단지 서버에서 단순한 이벤트 (SSE)와 달리 전이중 통신을 제공합니다. 참고 : 긴 폴링, 웹 소켓, 서버 펜싱 이벤트 (SSE)에 대해 자세히 알아보십시오.

마지막으로 본

마지막으로 본 기능을 구현하려면 하트 비트 메커니즘을 사용할 수 있습니다. 이것은 가능한 한 낮은 오버 헤드 여야하므로 마지막 활성 타임 스탬프를 캐시에 다음과 같이 저장할 수 있습니다

열쇠
사용자 a 2022-07-01T14 : 32 : 50
사용자 b 2022-07-05T05 : 10 : 35
사용자 c 2022-07-10T04 : 33 : 25

이것은 사용자가 마지막으로 활동 한 시간을 우리에게 줄 것입니다. 이 기능은 Redis와 결합 된 존재 서비스에 의해 처리되거나 캐시로 Memcached가 처리됩니다. 이것을 구현하는 또 다른 방법 “사용자는 지난 30 초 동안 어떤 행동도 수행하지 않았습니다.”, 우리는 사용자를 오프라인으로 보여줄 수 있으며 마지막으로 녹음 된 타임 스탬프로 마지막으로 보았습니다. 이것은 게으른 업데이트 접근 방식이 더 많으며 특정 경우 심장 박동보다 우리에게 도움이 될 수 있습니다.

알림

채팅이나 그룹에서 메시지가 전송되면 먼저 수신자가 활성화되어 있는지 확인하면 사용자의 활성 연결을 취하여이 정보를 얻을 수 있으며 마지막으로 고려할 수 있습니다. 수신자가 활성화되지 않은 경우 채팅 서비스는 클라이언트 장치 플랫폼과 같은 추가 메타 데이터가있는 메시지 큐에 이벤트를 추가하여 나중에 올바른 플랫폼으로 알림을 올바른 플랫폼으로 라우팅하는 데 사용됩니다. 그런 다음 알림 서비스는 메시지 대기열에서 이벤트를 소비하고 클라이언트 장치 플랫폼 (Android, iOS, 웹 등)을 기반으로 FIRBASE 클라우드 메시징 (FCM) 또는 APNS (Apple Push 푸시 알림 서비스)에 대한 요청을 전달합니다. 또한 이메일 및 SMS에 대한 지원을 추가 할 수 있습니다. 왜 우리는 메시지 대기열을 사용하고 있습니까?? 대부분의 메시지 대기열은 메시지가 일반적으로 전송 된 것과 동일한 순서로 전달되며 메시지가 서비스 기능의 중요한 부분 인 최소한 한 번은 전달되도록 최상의 효과 순서를 제공하기 때문에. 이것은 클래식 한 게시-서브 스크립 사용 사례처럼 보이지만 실제로는 모바일 장치와 브라우저가 각각 고유 한 푸시 알림을 처리하는 방법이 아닙니다. 일반적으로 Backend Services에서 일반적으로 볼 수있는 메시지 팬 아웃과는 달리 Firebase Cloud 메시징 (FCM) 또는 Apple Push 푸시 알림 서비스 (APN)를 통해 알림이 외부에서 처리됩니다. Amazon SQS 또는 RabbitMQ와 같은 것을 사용 하여이 기능을 지원할 수 있습니다.

영수증을 읽으십시오

읽기 영수증 처리는 까다로울 수 있습니다.이 유스 케이스에 대해서는 클라이언트의 ACK (Accisturedgement)를 기다릴 수있어 메시지가 전달되었는지 확인하고 해당 DeliveredAt 필드를 업데이트 할 수 있습니다. 마찬가지로 사용자가 채팅을 열고 해당 Seenat 타임 스탬프 필드를 업데이트하면 메시지를 표시합니다.

설계

whatsapp-basic design

이제 몇 가지 핵심 구성 요소를 식별 했으므로 시스템 설계의 첫 번째 초안을 해 보겠습니다.

자세한 디자인

디자인 결정에 대해 자세히 논의 할 시간입니다.

데이터 파티셔닝

  • 해시 기반 파티셔닝
  • 목록 기반 파티셔닝
  • 범위 기반 파티션
  • 복합 분할

위의 접근 방식은 여전히 ​​고르지 않은 데이터와로드 분포를 유발할 수 있습니다. 일관된 해싱을 사용하여이를 해결할 수 있습니다.

캐싱

메시징 애플리케이션에서는 사용자가 최신 데이터를 기대할 때 캐시 사용에주의해야하지만 많은 사용자가 동일한 메시지, 특히 그룹 채팅에서 요청할 것입니다. 따라서 리소스의 사용 스파이크를 방지하기 위해 오래된 메시지를 캐시 할 수 있습니다.

일부 그룹 채팅은 수천 개의 메시지를 가질 수 있으며 네트워크를 통해 보낼 수있는 것은 실제로 비효율적 일 수 있습니다. 효율성을 향상시키기 위해 시스템 API에 Pagination을 추가 할 수 있습니다. 이 결정은 제한된 네트워크 대역폭을 가진 사용자에게 요청하지 않는 한 이전 메시지를 검색 할 필요가 없기 때문에 도움이됩니다.

사용할 캐시 퇴거 정책?

우리는 Redis 또는 Memcached와 같은 솔루션을 사용할 수 있으며 일일 트래픽의 20%를 캐시 할 수 있지만 어떤 종류의 캐시 퇴거 정책이 우리의 요구에 가장 잘 맞을 수 있는지?

최근에 사용 된 최소한 (LRU)는 우리 시스템에 좋은 정책이 될 수 있습니다. 이 정책에서는 가장 최근에 사용 된 키를 먼저 버립니다.

캐시 미스 처리 방법?

캐시 미스가있을 때마다 서버는 데이터베이스를 직접 맞고 새 항목으로 캐시를 업데이트 할 수 있습니다.

자세한 내용은 캐싱을 참조하십시오.

미디어 액세스 및 스토리지

아시다시피, 대부분의 저장 공간은 이미지, 비디오 또는 기타 파일과 같은 미디어 파일을 저장하는 데 사용됩니다. 미디어 서비스는 사용자 미디어 파일의 액세스 및 스토리지를 모두 처리합니다.

그러나 파일을 규모로 어디서 저장할 수 있습니까?? 객체 저장소는 우리가 찾고있는 것입니다. 객체 저장은 데이터 파일을 객체라는 조각으로 나눕니다. 그런 다음 해당 객체를 단일 저장소에 저장하여 여러 네트워크 시스템에 퍼질 수 있습니다. HDFS 또는 Glusterfs와 같은 분산 파일 스토리지를 사용할 수도 있습니다.

재미있는 사실 : WhatsApp은 서버에서 미디어를 삭제하면 사용자가 다운로드 한 후.

이 유스 케이스에 Amazon S3, Azure Blob Storage 또는 Google Cloud Storage와 같은 객체 저장소를 사용할 수 있습니다.

콘텐츠 전달 네트워크 (CDN)

CDN (Content Delivery Network). 일반적으로 이미지와 같은 정적 파일 및 비디오는 CDN에서 제공됩니다. 이 유스 케이스에 Amazon Cloudfront 또는 CloudFlare CDN과 같은 서비스를 사용할 수 있습니다.

API 게이트웨이

HTTP, WebSocket, TCP/IP, 다중 L4 (전송 계층) 또는 L7 (애플리케이션 레이어) 배포와 같은 여러 프로토콜을 사용하므로 각 프로토콜에 대해 별도로로드 밸런서를 별도로 사용하면 비용이 많이 듭니다. 대신 문제없이 여러 프로토콜을 지원하는 API 게이트웨이를 사용할 수 있습니다.

API 게이트웨이는 인증, 승인, 요금 제한, 스로틀 링 및 API 버전화와 같은 다른 기능을 제공하여 서비스 품질을 향상시킬 수 있습니다.

이 유스 케이스에 Amazon API 게이트웨이 또는 Azure API 게이트웨이와 같은 서비스를 사용할 수 있습니다.

병목 현상을 식별하고 해결합니다

WhatsApp Advanced-Design

설계에서 단일 고장 지점과 같은 병목 현상을 식별하고 해결하겠습니다

  • “우리의 서비스 중 하나가 충돌하면 어떨까요??”
  • “구성 요소간에 트래픽을 어떻게 배포 할 것인가?”
  • “데이터베이스의 부하를 어떻게 줄일 수 있습니까??”
  • “캐시의 가용성을 향상시키는 방법?”
  • “API 게이트웨이는 단일 실패 지점이되지 않습니까??”
  • “알림 시스템을보다 강력하게 만들 수있는 방법?”
  • “미디어 저장 비용을 어떻게 줄일 수 있습니까?”?
  • “채팅 서비스에는 너무 많은 책임이 있습니까??”

시스템을보다 탄력적으로 만들기 위해 다음을 수행 할 수 있습니다

  • 각 서비스의 여러 인스턴스를 실행합니다.
  • 클라이언트, 서버, 데이터베이스 및 캐시 서버간에로드 밸런서 소개.
  • 데이터베이스에 다중 읽기 복제본을 사용합니다.
  • 분산 캐시의 여러 인스턴스 및 복제품.
  • API 게이트웨이의 대기 복제품을 가질 수 있습니다.
  • 분산 시스템에서 정확히 한 번 배송 및 메시지 주문이 어려운 경우 Apache Kafka 또는 NATS와 같은 전용 메시지 중개인을 사용하여 알림 시스템을보다 강력하게 만들 수 있습니다.
  • 미디어 처리 및 압축 기능을 미디어 서비스에 추가하여 WhatsApp과 유사한 큰 파일을 압축하여 많은 저장 공간을 절약하고 비용을 줄일 수 있습니다.
  • 우리는 채팅 서비스와 별도로 그룹 서비스를 만들어 서비스를 추가로 해체 할 수 있습니다.

이 기사는 github에서 사용할 수있는 오픈 소스 시스템 설계 코스의 일부입니다.

KaranPratapsingh / System Design

규모로 시스템을 설계하는 방법을 배우고 시스템 설계 인터뷰 준비 방법

시스템 설계 코스

이봐, 코스에 오신 것을 환영합니다. 이 과정이 훌륭한 학습 경험을 제공하기를 바랍니다.

이 과정은 내 웹 사이트 및 Leandpub의 eBook으로도 제공됩니다. 도움이된다면 동기 부여로 mot을 남겨주세요!

목차

  • 시작하기
    • 시스템 설계 가란 무엇입니까??
    • IP
    • OSI 모델
    • TCP 및 UDP
    • 도메인 이름 시스템 (DNS)
    • 로드 밸런싱
    • 클러스터링
    • 캐싱
    • 콘텐츠 전달 네트워크 (CDN)
    • 대리
    • 유효성
    • 확장 성
    • 저장
    • 데이터베이스 및 DBM
    • SQL 데이터베이스
    • NOSQL 데이터베이스
    • SQL 대 NOSQL 데이터베이스
    • 데이터베이스 복제
    • 인덱스
    • 정규화 및 피식
    • 산 및 기본 일관성 모델
    • 캡 정리
    • Pacelc 정리
    • 업무
    • 분산 거래
    • 샤딩
    • 일관된 해싱
    • 데이터베이스 연맹
    • n-tier 아키텍처
    • 메시지 중개인
    • 메시지 대기열
    • 게시-구독
    • 엔터프라이즈 서비스 버스 (ESB)
    • 모놀리스 및 마이크로 서비스
    • 이벤트 중심 건축 (EDA)
    • 이벤트 소싱
    • 명령 및 쿼리 책임 분리 (CQRS)
    • API 게이트웨이
    • REST, GraphQL, Grpc
    • 긴 폴링, 웹 소켓, 서버 entent 이벤트 (SSE)