Използва ли WhatsApp RabbitMQ

RabbitMq е изграден върху Ерланг Език за програмиране с общо предназначение и той също се използва от WhatsApp за съобщения.

Резюме

WhatsApp използва RabbitMQ, който е изграден на Erlang, като опашка за съобщения за доставка на съобщения.

При проектирането на чат система в реално време е важно да се разгледа опашката, използвана от популярни платформи за съобщения като WhatsApp и Facebook Messenger. Въпреки че може да изглежда логично да има опашка на човек или kafka-topic за всеки потребител, предвид милиардите потребители на тези платформи, този подход ще изисква непрактичен брой опашки или теми. Забелязано е обаче, че WhatsApp и Facebook Messenger използват опашка, наречена „Iris“ (подобно на Kafka) за доставка на съобщения.

Съществуват вътрешни системи, които попълват бази данни (като HBase и MyRocks) от опашката за съобщения, но тези бази данни не са основната система за доставка.

Въпроси и отговори

1. Какво е Rabbitmq, изграден върху?

RabbitMQ е изграден на езика за програмиране с общо предназначение на Erlang.
2. Как WhatsApp използва ribbitmq?

WhatsApp използва RabbitMQ като опашка за съобщения за доставка на съобщения.
3. Каква е целта на опашката за съобщения?

За отделяне на компоненти на система се използва опашка за съобщения, което позволява да се изпращат съобщения между тях асинхронно.
4. Може ли опашката на човек да се използва за доставка на съобщения в WhatsApp или Facebook Messenger?

Въпреки че опашката на човек може да изглежда логична, тя ще изисква непрактичен брой опашки, предвид милиардите потребители на тези платформи.
5. Каква опашка се използва от WhatsApp и Facebook Messenger за доставка на съобщения?

WhatsApp и Facebook Messenger използват опашка, наречена „Iris“ за доставка на съобщения. “Ирис” е подобен на Кафка.
6. Какви са някои от базите данни, използвани от WhatsApp за съхранение на съобщения?

WhatsApp използва бази данни като HBase и MyRocks, за да съхранява съобщения. Тези бази данни са попълнени от опашката за съобщения.
7. Е ribbitmq основната система за доставка на WhatsApp?

Не, RabbitMQ не е основната система за доставка на WhatsApp. Използва се като опашка за съобщения за доставка на съобщения.
8. Дали доставката на съобщения в WhatsApp и Facebook Messenger синхронни или асинхронни?

Доставянето на съобщения в WhatsApp и Facebook Messenger е асинхронна, което означава, че съобщенията се изпращат и получават независимо един от друг.
9. Какви са предимствата на използването на опашка за съобщения като RabbitMQ?

Използването на опашка за съобщения като RabbitMQ позволява отделяне на компоненти, подобрена мащабируемост и асинхронна комуникация между системните елементи.
10. Може ли RabbitMQ да се справи с големи обеми съобщения?

Да, RabbitMQ е проектиран да се справя с големи обеми от съобщения и е в състояние да ги доставя ефективно и надеждно.
11. Какви са алтернативите на RabbitMQ за внедряване на опашка за съобщения?

Някои алтернативи на RabbitMQ включват Apache Kafka, ActiveMq и Redis Streams.
12. Има ли някакви ограничения за използване на опашка за съобщения като RabbitMQ?

Някои ограничения на използването на опашка за съобщения като RabbitMQ включват необходимостта от правилна конфигуриране и настройка за оптимална производителност, потенциална загуба на съобщения, ако не е правилно конфигурирана и необходимостта от допълнителна инфраструктура за поддържане на опашката за съобщения.
13. Може ли ribbitmq да се използва за други цели освен съобщения?

Да, RabbitMQ може да се използва за други цели, освен съобщения, като планиране на задачи, архитектури, управлявани от събития, и стрийминг на данни.
14. Дали ribbitmq поддържа постоянство на съобщението?

Да, RabbitMQ поддържа постоянство на съобщенията, което позволява да се съхраняват и извлечени съобщения дори в случай на повреди в системата.
15. Как RabbitMQ гарантира надеждността на доставката на съобщения?

RabbitMQ гарантира надеждността на доставката на съобщения чрез функции като потвърждение на съобщението, потвърждава издателят и издръжливост на опашката.

Използва ли WhatsApp RabbitMQ

RabbitMq е изграден върху Ерланг Език за програмиране с общо предназначение и той също се използва от WhatsApp за съобщения.

Опашка, използвана в WhatsApp или FB Messenger

Докато обмислях системен дизайн за чат в реално време, аз ми е любопитно каква опашка whatsapp или fb messenger използва от страна на сървъра, за да достави съобщението до получателя. Това, което си мислех, е, че има опашка на човек/kafka-topic, така че когато трябва да се достави ново съобщение на потребителя, съобщението е заложено към опашката на A. Въпреки това, може да има милиарди потребители (FB има 2 милиарда потребители), означава ли това, че имаме нужда от 2 милиарда опашки/теми (в срока на Kafka)? Ако е така, коя опашка може да се справи с това перфектно. Всеки коментар е добре дошъл! Благодаря ти!

Попитан 25 юни 2019 г. в 16:44

1,669 8 8 златни значки 23 23 сребърни значки 37 37 бронзови значки

Можете да намерите документация, че Messager е построен над HBase, а сега MyRocks. Има вътрешни системи, които ще попълват тези бази данни от опашка, да, но това не е основната система за доставка. код.FB.com/основни данни/…

26 юни 2019 г. в 3:08

@cricket_007 Благодаря за коментарите. Yeap, изглежда, че FB използва ириса (kafka като) като опашка за доставка.

Alifzl/Yomkippur

Този ангажимент не принадлежи на нито един клон на това хранилище и може да принадлежи на вилица извън хранилището.

Превключвайте клони/маркери

Разклонени етикети

Не можеше да зареди клони

Нищо за показване

Не можах да заредя маркери

Нищо за показване

Име вече се използва

Етикет вече съществува с предоставеното име на клона. Много команди GIT приемат както имена на етикети, така и на клоновете, така че създаването на този клон може да причини неочаквано поведение. Сигурни ли сте, че искате да създадете този клон?

Отказ Create

  • Местен
  • Кодови пространства

Https github cli

Използвайте git или плащане с SVN, като използвате уеб URL адреса.

Работете бързо с нашия официален CLI. Научете повече за CLI.

Вход Изисква се

Моля, влезте, за да използвате кодексни материали.

Стартиране на GitHub Desktop

Ако нищо не се случи, изтеглете десктопа GitHub и опитайте отново.

Стартиране на GitHub Desktop

Ако нищо не се случи, изтеглете десктопа GitHub и опитайте отново.

Стартиране на Xcode

Ако нищо не се случи, изтеглете Xcode и опитайте отново.

Стартиране на код на Visual Studio

Вашето кодово пространство ще се отвори веднъж готов.

Имаше проблем с подготовката на вашето кодово пространство, моля, опитайте отново.

Последно ангажиране

Git stats

Файлове

Не успя да зареди най -новата информация за ангажиране.

Последно съобщение за ангажиране

Ангажиране на време

ПРОЧЕТИ МЕ.MD

Yom Kippur е инструмент за автоматизация на WhatsApp, който има за цел да бъде последователно и постоянно решение за нетърговско използване на WhatsApp като автоматизиран бот.

Какво прави?

Демонстрация на Йом Кипур

  • Изпращане/получаване на едно съобщение в предварително конфигурирано приложение WhatsApp в AVD (Android Virtual устройство)
  • Създайте списъка за контакт в AVD и го използвайте за нещата за изпращане/получаване
  • Буквално може да направи всичко с AVD (той създава многобройни възможности за убеждаване)

Още първо видях Yowsup моя единствен избор, но поради изброените по -долу проблеми промених решението си, за да го приложа по друг начин:

  • Разнообразие от проблеми в общността (свързани тук)
  • Yosup е асинхронен вид API, който взаимодейства с WhatsApp Restapi, по отношение на съображенията с висока сигурност на WhatsApp, той дойде много чувствителен към настоящите активни сесии на всеки потребител и няма да бъде много приятелски настроен със синхронни решения. (Както вероятно знаете ограниченията за използване на уеб-изглед на WhatsApp, който казва, че трябва едновременно да имаме последователна активна интернет връзка в телефона)
  • мързелът ми и също предизвиквах себе си да го направя по труден начин

Е, зависимости в този проект, те са доста много! Първо от вас трябва да има удовлетворени това изискване:
Инсталаторите на Windows са издръжливи, но това може да бъде имплимент в Linux или MacOS машина (и двете не са тествани)

Зависимост Връзки за описание / изтегляне
Android Studio Android Studio с Android API 28
Java Java JDK 11
Mysql MySQL Installer Community 8.X или по -горе
Python 2.7 Python 2.7
Appium V1.10 или по -горе
Rabbitmq Последна версия на RabbitMQ
Пощальон Последна версия на Postman

Съображения: Можете да използвате Conda Virenv за Python 2.7, но ми изсипа сериозно главоболие (не се препоръчва)
Основна причина, която използвах Python 2 за този проект, е, че Appium, MySQL Connector Client и RabbitMQ бяха некомперативни заедно във версия 3.

На първо място, бъдете търпеливи в тази част. Отне ми кръв и сълзи, за да избърша зависимостта, за да изпълня това толкова проста задача.

1.Android виртуално устройство
Luanch AVD мениджър на Android Studio, настройка на устройство с Android 9.0 с API 28 (изберете и подходящо име за AVD, защото имаме нужда от него в допълнителни стъпки).
Забележете, че трябва да инсталирате WhatsApp през самия AVD, така че изберете поддържаната версия на PlayStore.
Проверете дали имате променливи на средата във вашия акаунт:

Име на променлива Променлива стойност
Android_home C: \ Потребители \ FZL \ AppData \ Local \ Android \ SDK
Java_home C: \ Програмни файлове \ java \ jdk-11.0.2
Pythonpath C: \ python27; c: \ python27 \ lib \ site-packages; c: \ python27 \ lib; c: \ python27 \ dlls; c: \ python27 \ скриптове
Пластир C: \ python27; c: \ python27 \ scripts; c: \ python27 \ lib \ site-packages; c: \ програмни файлове \ java \ jdk-11.0.2; C: \ Програмни файлове \ Java \ jdk-11.0.2 \ bin;

След това трябва да стартирате своя AVD, да инсталирате WhatsApp в това, а също така да разрешите ADB с вашето устройство (задължително)
За да направите това, трябва да изпълнявате ADB устройства или ADB USB, за да проверите автоматизацията на AVD.

° С:\ Users\ FZl\ Appdata\ LОкал\ Androiddk\ pLatform-Tools: ADB устройства Списък на устройства, прикачени емулатор-5554

Ако виждате неоторизирания резултат, трябва да следвате тази връзка.

2.Конфигурация на RabbitMQ

След инсталирането на RaabitMQ, трябва да стартирате RabbitMQ-Plugins да активират ribbitmq_management в директорията SBIN на Rabbitmq, за да активирате Web-Gui на Sytem за управление на RabbitMQ. Може да е необходима ограничаване на услугата RabbitMQ.
След това трябва да можете да получите достъп до Web-Gui на RabbitMQ с http: // localhost: 15672/#/адрес в локалната ви машина. Ако да, създайте нов потребител от командите по -долу и го направете администратор:

ribbitmqctl add_user потребителско име парола # Това прави потребителя администратор ribbitmqctl set_user_tags администратор на потребителско име # Това задава разрешения за потребителя ribbitmqctl set_permissions -p / потребителско име ".*" ".*" ".*"

Влезте с новосъздадени идентификационни данни и импортирайте спецификациите на опашката, които вече са прикачени в това репо, което нарече ribbitmq_conf.JSON в секциите за дефиниции на импортиране в Menue Menue.
Това би създало необходимите конфигурации за RabbitMQ и дава възможност за необходимите привилегии.

3.Appium
Просто стартирайте Appium сървъра с настройките по подразбиране. Appium-Default-Capabilities ” вече е вграден в код. Tl; dr: в тази стъпка няма какво да се направи.

4.Mysql
Инсталирайте изданието на общността на MySQL, създайте подходящ DB акаунт и задайте услугата автоматично, когато OS стартира.

5.Инсталирайте зависимостите на Python
Просто стартирайте PIP Install – R Зависимости.TXT за разрешаване на зависимостта на използваните библиотеки.
Можете да се сблъскате с остаряла версия на библиотеката MySQLDB, която е разрешима с инсталирането на това и това. Погрижете се за инсталирането на Python 2.x Версия на споменатите библиотеки.

6.Създайте директории за дневническите файлове
Създайте директории и файлове като него’s споменато по -долу:

# директории ° С:\ var\ lOG [директория] c:\ var\ lOg\ whatsapp_api [директория] # Лог файлове ° С:\ var\ lOg\ api.log c:\ var\ lOg\ whatsapp_single_consumer.log c:\ var\ lOg\ whatsapp_single_worker.log c:\ var\ lOG \

7.Поставете Yom Kippur’S конфигурационен файл
Отидете на Yomkippur-Master \ configs \ config.CFG и въведете следното.
(Не променяйте нищо ESLE, освен ако не знаете какво правите)

[mysql] хост = 127.0.0.1 потребителско име =-Вашето потребителско име MySQL- парола =-Вашата парола за mysql- Database = WhatsApp [RabbitMQ] IP = 127.0.0.1 ipqueuename = ipaddr.потребителско име на опашка =-Вашето потребителско име на RabbitMQ- парола =-Вашата парола за заек- [queue_name] single_message = whatsapp_singlemessage_queue broadcast_message = whatsapp_broadcastmessage_queue add_contact = whatsapp_newcontact_listener_queue listen_message = whatsapp_messageListener_queue

Изпълнете основната.py и add_new_contact_producer.PY в две отделни терминални/CMD среда.
Ако не сте виждали грешка, е добре да отидете.

  1. Уверете се, че MySQL Server работи
  2. Уверете се, че ribbitmq sever е runnig
  3. Стартирайте Appium с настройки на defualt
  4. Изпълнете тези скриптове

Python Main.py python add_new_contact_producer.py python single_message_producer.PY

  1. Стартирайте Postman и създайте желани команди за публикации от списъка по -долу:

Добавяне на контакт в приложението Google Contacts

Изпращане на едно съобщение чрез WhatsApp

Развитие и допринасяне?

Искам да допринеса? Страхотен! Чувствайте се свободни да ме съборите в a.fazeli95 [at] gmail [dot] com или просто създайте заявка за изтегляне.

Всички компоненти, използвани в този проект, са с отворен код и имат лиценз за MIT и могат да бъдат използвани във всеки некомерсиален продукт

относно

WhatsApp съобщения брокер с RabbitMQ, AVD и Appium

Въведение в RabbitMq

Тук ще научим какво е ribbitmq, употребата на ribbitmq и защо трябва да използваме ribbitmq в нашите приложения с примери.

Какво е Rabbitmq?

Rabbitmq е Amqp Брокер за съобщения и това е най-популярният брокер за съобщения с отворен код и крос-платформа.

Ribbitmq също е начин за обмен на данните между различни приложения на платформата, като съобщение, изпратено от .Нета Приложението може да бъде прочетено от a Възел.JS приложение или Java приложение.

RabbitMq е изграден върху Ерланг Език за програмиране с общо предназначение и той също се използва от WhatsApp за съобщения.

Какво е AMQP?

Протоколът за усъвършенствани съобщения за опашка (Amqp) е отворен стандартен протокол на слоя за приложения за ориентирани към съобщения и характеристиките на AMQP са ориентация на съобщения, опашка, маршрутизиране (включително точка до точка и публикуване и подписване), надеждност и сигурност.

Той е разработен от JPMorgan и Imatix Corporation. AMQP е проектиран със следните основни характеристики като цели:

  • Сигурност
  • Надеждност
  • Оперативна съвместимост
  • Стандарт
  • Отворен

RabbitMQ е лек и лесен за разгръщане в наличните помещения и поддържа множество протоколи за съобщения. RabbitMQ може да бъде разгърнат в разпределени и федерални конфигурации за отговаряне на високомащабни изисквания за високо разполагаемост.

Следва изобразителното представяне на това как RabbitMQ ще действа като посредник между подателя и потребителите в нашите приложения.

Диаграма на потока на RabbitMQ Process

Защо и кога да използваме ribbitmq?

Сега дни повечето хора ще изпълняват множество задачи в едно приложение като изпращане на имейли или SMS, отчети и ще създадат тежък товар на приложението, така че ако разделите тези задачи, тогава ще получим повече място (памет), за да обслужваме повече заявки.

Използвайки RabbitMQ, можем да премахнем тежка работа от нашите уеб приложения, като изпращане на отчети в Excel или PDF формат’S или изпращане на имейл, SMS или друга задача като задействане на някои други приложения за започване на обработка.

Ribbitmq е отворен код и брокер с кросплатформени съобщения, така че то’е лесен за използване с много езици като .Net, Java, Python, Ruby, възел.JS.

Клиентски библиотеки, поддържани от RabbitMQ

RabbitMQ ще поддържа множество операционни системи и езици за програмиране. RabbitMQ е предоставил различни клиентски библиотеки за следване на езици за програмиране.

  • .Нета
  • Java
  • Пролетна рамка
  • Руби
  • Python
  • Php
  • Цел-C и Swift
  • JavaScript
  • ОТИВАМ
  • Perl

Дизайн на системата: WhatsApp

Нека проектираме WhatsApp като услуга за незабавни съобщения, подобна на услуги като WhatsApp, Facebook Messenger и WeChat.

Какво е WhatsApp?

WhatsApp е приложение за чат, което предоставя услуги за незабавни съобщения на своите потребители. Това е едно от най -използваните мобилни приложения на планетата, свързваща над 2 милиарда потребители в 180+ страни. WhatsApp също е достъпен в мрежата.

Изисквания

Нашата система трябва да отговаря на следните изисквания:

Функционални изисквания

  • Трябва да поддържа чат един на един.
  • Групови чатове (макс 100 души).
  • Трябва да поддържа споделяне на файлове (изображение, видео и т.н.).

Нефункционални изисквания

  • Висока наличност с минимална латентност.
  • Системата трябва да бъде мащабируема и ефективна.

Разширени изисквания

  • Изпратени, доставени и четене на разписки на съобщенията.
  • Покажете последното време на потребителите.
  • Натиснете известия.

Оценка и ограничения

Нека започнем с оценката и ограниченията.

Забележка: Не забравяйте да проверите всякакви предположения, свързани с мащаба или трафика, с вашия интервюиращ.

Трафик

Нека приемем, че имаме 50 милиона ежедневни активни потребители (DAU) и средно всеки потребител изпраща поне 10 съобщения до 4 различни хора всеки ден. Това ни дава 2 милиарда съобщения на ден.

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 milin

Съобщенията могат също да съдържат медии като изображения, видеоклипове или други файлове. Можем да предположим, че 5 процента от съобщенията са медийни файлове, споделени от потребителите, което ни дава допълнителни 200 милиона файла, които би трябвало да съхраняваме.

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 PRECTY \ TIMES 2 \ SPACE милиард = 200 \ Space Million 5 P erce n t × 2 bi ll i o = 200 mi ll i o n / d a y

Какви биха били заявки в секунда (RPS) за нашата система? 2 милиарда заявки на ден се превеждат в 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 \ заявки за пространство / секунда (24 h rs × 3600 seco n d s) 2 bi ll i o n = ∼ 24 k q q u es t s / seco n d

### Съхранение Ако приемем, че всяко съобщение средно е 100 байта, ще ни е необходимо около 200 GB съхранение на база данни всеки ден.

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 байта = \ sim 200 \ space gb / ден 2 bi ll i o n × 100 b y t es = ∼ 200 gb / d a y

Съгласно нашите изисквания, ние също знаем, че около 5 процента от ежедневните ни съобщения (100 милиона) са медийни файлове. Ако приемем, че всеки файл е средно 50 kb, ще се нуждаем от 10 TB съхранение всеки ден.

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 / ден 100 mi ll i o n × 100 k b = 10 tb / d a y

И в продължение на 10 години ще ни се наложи около 38 pb място за съхранение.

(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

### честотна лента, тъй като нашата система обработва 10.2 TB вход всеки ден, ще изискваме минимална честотна лента от около 120 mb в секунда.

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/секунда (24 h Rs × 3600 Seco n d s) 10.2 tb = ∼ 120 mb / seco n d

### Оценна на високо ниво Тук е нашата оценка на високо ниво:

Тип Оценка
Ежедневни активни потребители (dau) 50 милиона
Заявки в секунда (RPS) 24k/s
Съхранение (на ден) ~ 10.2 TB
Съхранение (10 години) ~ 38 Pb
Честотна лента ~ 120 mb/s

Дизайн на модела на данни

WhatsApp-Datamodel

Това е общият модел на данни, който отразява нашите изисквания. Имаме следните таблици: Потребители Тази таблица ще съдържа информация на потребителя като име, phonenumber и други подробности. съобщения Както подсказва името, тази таблица ще съхранява съобщения със свойства като тип (текст, изображение, видео и т.н.), Съдържание и времеви марки за доставка на съобщения. Съобщението ще има и съответен чат или groupid . чатове Тази таблица представлява частен чат между двама потребители и може да съдържа множество съобщения. users_chats Тази таблица картографира потребителите и чатовете, тъй като множество потребители могат да имат множество чата (N: M връзка) и обратно. групи Тази таблица представлява група между множество потребители. users_groups Тази таблица картографира потребителите и групите, тъй като множество потребители могат да бъдат част от множество групи (N: M връзка) и обратно.

Каква база данни трябва да използваме?

Въпреки че нашият модел на данни изглежда доста релационен, не е задължително да съхраняваме всичко в една база данни, тъй като това може да ограничи мащабируемостта ни и бързо да се превърне в тесни места. Ще разделим данните между различните услуги, всяка от които притежава собственост върху определена таблица. Тогава можем да използваме релационна база данни като PostgreSQL или разпределена база данни NoSQL като Apache Cassandra за нашия случай на използване.

API дизайн

Нека направим основен дизайн на API за нашите услуги:

Вземете всички чатове или групи

Този API ще получи всички чатове или групи за даден потребител .

Вземи всичко(userid: Uuid): Чат[] | Група[] 

Въведете режим на цял екран

Излезте от режим на цял екран

Параметри Потребителски идентификатор (UUID): ID на текущия потребител. Се завръща Резултат (чат [] | Group []): Всички чатове и групи, които потребителят е част от.

Получавайте съобщения

Вземете всички съобщения за потребител, даден на ChannelID (чат или идентификатор на група).

getMessages(userid: Uuid, Channelid: Uuid): Съобщение[] 

Въведете режим на цял екран

Излезте от режим на цял екран

Параметри Потребителски идентификатор (UUID): ID на текущия потребител. Идентификационен номер на канала (UUID): ID на канала (чат или група), от който трябва да бъдат извлечени съобщения. Се завръща Съобщения (съобщение []): Всички съобщения в даден чат или група.

Изпрати съобщение

Изпратете съобщение от потребител на канал (чат или група).

изпрати съобщение(userid: Uuid, Channelid: Uuid, съобщение: Съобщение): булев 

Въведете режим на цял екран

Излезте от режим на цял екран

Параметри Потребителски идентификатор (UUID): ID на текущия потребител. Идентификационен номер. Съобщение (съобщение): Съобщението (текст, изображение, видео и т.н.) че потребителят иска да изпрати. Се завръща Резултат (булев): представлява дали операцията е била успешна или не.

Присъединете се или оставете група

Изпратете съобщение от потребител на канал (чат или група).

влезе в групата(userid: Uuid, Channelid: Uuid): булев Напусни групата(userid: Uuid, Channelid: Uuid): булев 

Въведете режим на цял екран

Излезте от режим на цял екран

Параметри Потребителски идентификатор (UUID): ID на текущия потребител. Идентификационен номер на канала (UUID): ID на канала (чат или група) Потребителят иска да се присъедини или да напусне. Се завръща Резултат (булев): представлява дали операцията е била успешна или не.

Дизайн на високо ниво

Сега нека направим дизайн на високо ниво на нашата система.

Архитектура

Ще използваме архитектура на микросервизи, тъй като това ще улесни хоризонтално мащабиране и отделяне на нашите услуги. Всяка услуга ще има собственост върху собствения си модел на данни. Нека се опитаме да разделим нашата система на някои основни услуги. Потребителска услуга Това е услуга, базирана на HTTP, която обработва притесненията, свързани с потребителя, като удостоверяване и информация за потребителите. Услуга за чат Услугата за чат ще използва WebSockets и ще установи връзки с клиента за обработка на чат и функция, свързана с груповите съобщения. Можем също така да използваме кеш, за да следим всички активни връзки като сесии, които ще ни помогнат да определим дали потребителят е онлайн или не. Услуга за уведомяване Тази услуга просто ще изпраща push известия на потребителите. Той ще бъде обсъден подробно отделно. Услуга за присъствие Услугата за присъствие ще следи последното видяно състояние на всички потребители. Той ще бъде обсъден подробно отделно. Медийна услуга Тази услуга ще обработва медиите (изображения, видеоклипове, файлове и т.н.) Качва. Той ще бъде обсъден подробно отделно. Какво ще кажете за комуникация между обслужване и откриване на услуги? Тъй като нашата архитектура е базирана на микросервизи, услугите ще общуват и помежду си. Като цяло, REST или HTTP се представя добре, но можем допълнително да подобрим производителността, използвайки GRPC, което е по -леко и ефективно. Откриването на услуги е друго нещо, което ще трябва да вземем предвид. Можем също да използваме мрежа за обслужване, която позволява управлявана, наблюдавана и сигурна комуникация между отделни услуги. Забележка: Научете повече за REST, GraphQL, GRPC и как те се сравняват помежду си.

Съобщения в реално време

Как ефективно изпращаме и получаваме съобщения? Имаме две различни варианта: Модел на издърпване Клиентът може периодично да изпраща HTTP заявка до сървъри, за да провери дали има нови съобщения. Това може да се постигне чрез нещо като дълго проучване. Push Model Клиентът отваря дълготрайна връзка със сървъра и след като са налични нови данни, той ще бъде натиснат към клиента. За това можем. Подходът на модела на изтегляне не е мащабируем, тъй като ще създаде ненужна заявка за режийни разходи на нашите сървъри и през повечето време отговорът ще бъде празен, като по този начин губи нашите ресурси. За да се сведе до минимум латентността, използването на модела Push с WebSockets е по -добър избор, защото тогава можем да натискаме данни към клиента, след като е наличен без забавяне, като се има предвид, че връзката е отворена с клиента. Също така, WebSockets осигуряват комуникация с пълен дуплекс, за разлика от събития със сервиз (SSE), които са само еднопосочни. ЗАБЕЛЕЖКА: Научете повече за дългите анкети, WebSockets, събития със сървърно обслужване (SSE).

Последно видян

За да приложим последната видяна функционалност, можем да използваме механизъм за сърдечен ритъм, където клиентът може периодично да пинг сървърите, показващ неговата жизненост. Тъй като това трябва да бъде възможно най -ниско режийно, можем да съхраняваме последната активна времева марка в кеша, както следва:

Ключ Стойност
Потребител a 2022-07-01T14: 32: 50
Потребител b 2022-07-05T05: 10: 35
Потребител c 2022-07-10T04: 33: 25

Това ще ни даде последния път, когато потребителят е бил активен. Тази функционалност ще се обработва от услугата за присъствие, комбинирана с Redis или Memcached като нашия кеш. Друг начин за изпълнение е да проследявате най -новото действие на потребителя, след като последната дейност пресече определен праг, като например &bdquo;Потребителят не е извършил никакви действия през последните 30 секунди&ldquo;, Можем да покажем на потребителя като офлайн и последно да се видим с последния записан времеви марки. Това ще бъде по -скоро мързелив подход за актуализиране и може да ни е от полза за сърдечен ритъм в определени случаи.

Известия

След като съобщение бъде изпратено в чат или група, първо ще проверим дали получателят е активен или не, можем да получим тази информация, като вземем активната връзка на потребителя и за последно се разглеждаме предвид. Ако получателят не е активен, услугата за чат ще добави събитие към опашка за съобщения с допълнителни метаданни, като например платформата за устройства на клиента, която ще бъде използвана за насочване на известието до правилната платформа по -късно. След това услугата за известия ще консумира събитието от опашката за съобщения и ще препрати заявката към Firebase Cloud Messaging (FCM) или Apple Push Notification Service (APNS) въз основа на платформата за устройства на клиента (Android, iOS, Web и т.н.). Можем също да добавим поддръжка за имейл и SMS. Защо използваме опашка за съобщения? Тъй като повечето опашки за съобщения предоставят поръчка с най-добри усилия, което гарантира, че съобщенията обикновено се доставят в същия ред като изпращането и че съобщението се доставя поне веднъж, което е важна част от нашата функционалност на услугите. Въпреки че това изглежда като класически случай на използване на подновяване на публикуване, той всъщност не е като мобилни устройства и браузъри, които имат свой собствен начин за обработка на известия за натискане. Обикновено известията се обработват външно чрез Firebase Cloud Messaging (FCM) или Apple Push Notification Service (APNS) за разлика от фен-изход на съобщенията, които обикновено виждаме в Backend Services. Можем да използваме нещо като Amazon Sqs или RabbitMQ, за да поддържаме тази функционалност.

Прочетете разписки

Работата с четените разписки може да бъде сложна, за този случай на употреба можем да изчакаме някакво потвърждение (ACK) от клиента, за да определим дали съобщението е доставено и актуализиращо съответното доставено поле. По подобен начин ще маркираме съобщението, което се вижда, след като потребителят отвори чата и актуализира съответното поле за TimestAm от SeeTat.

Дизайн

WhatsApp-Basic-Design

Сега, когато сме идентифицирали някои основни компоненти, нека направим първия проект на нашия дизайн на системата.

Подробен дизайн

Време е да обсъдим подробно нашите дизайнерски решения.

Разделяне на данни

  • Разделяне на базата на хеш
  • Разделяне на базата на списъци
  • Разделяне на базата на обхват
  • Композитен дял

Горните подходи все още могат да причинят неравномерни данни и разпределение на натоварването, можем да разрешим това с помощта на последователно хеширане.

Кеширане

В приложение за съобщения трябва да внимаваме да използваме кеша, тъй като нашите потребители очакват най -новите данни, но много потребители ще искат същите съобщения, особено в групов чат. Така че, за да предотвратим използването на шипове от нашите ресурси, можем да кешираме по -стари съобщения.

Някои групови чатове могат да имат хиляди съобщения и изпращането на това през мрежата ще бъде наистина неефективно, за да подобрим ефективността, можем да добавим страници към нашите API на системата. Това решение ще бъде полезно за потребители с ограничена мрежова честотна лента, тъй като няма да се налага да извличат стари съобщения, освен ако не са поискани.

Коя политика за изгонване на кеш?

Можем да използваме решения като Redis или Memcached и да кешират 20% от ежедневния трафик, но какъв вид политика за изгонване на кеш най -добре би отговарял на нашите нужди?

Най -малко наскоро използваната (LRU) може да бъде добра политика за нашата система. В тази политика изхвърляме най -малкото наскоро използвани ключове първо.

Как да се справим с кеша пропускане?

Всеки път, когато има пропуск от кеш, нашите сървъри могат да натиснат директно базата данни и да актуализират кеша с новите записи.

За повече подробности вижте кеширането.

Достъп и съхранение на медии

Както знаем, повечето от нашето пространство за съхранение ще се използват за съхранение на медийни файлове като изображения, видеоклипове или други файлове. Нашата медийна услуга ще обработва както достъпа, така и с съхранение на файловете на потребителските медии.

Но къде можем да съхраняваме файлове в мащаб? Е, съхранението на обекти е това, което търсим. Обектните магазини разбиват файловете с данни на парчета, наречени обекти. След това съхранява тези обекти в едно хранилище, което може да се разпространи в множество мрежови системи. Можем също да използваме разпределено съхранение на файлове като HDFS или Glusterfs.

Забавен факт: WhatsApp изтрива медии на своите сървъри, след като е изтеглен от потребителя.

Можем да използваме магазини за обекти като Amazon S3, Azure Blob Storage или Google Cloud Storage за този случай на използване.

Мрежа за доставка на съдържание (CDN)

Мрежата за доставка на съдържание (CDN) увеличава наличието и съкращаването на съдържанието, като същевременно намалява разходите за честотна лента. Като цяло статичните файлове като изображения и видеоклипове се обслужват от CDN. Можем да използваме услуги като Amazon CloudFront или CloudFlare CDN за този случай на използване.

API Gateway

Тъй като ще използваме множество протоколи като HTTP, WebSocket, TCP/IP, разгръщането на множество L4 (транспортен слой) или L7 (слой на приложението) Балансиращи балансирания за всеки протокол ще бъдат скъпи. Вместо това можем да използваме API шлюз, който поддържа множество протоколи без проблеми.

API Gateway може да предложи и други функции като удостоверяване, разрешение, ограничаване на скоростта, дроселиране и API версия, които ще подобрят качеството на нашите услуги.

Можем да използваме услуги като Amazon API Gateway или Azure API Gateway за този случай на употреба.

Идентифицирайте и разрешете затрудненията

WhatsApp-Advanced-Design

Нека идентифицираме и разрешим затрудненията като единични точки на повреда в нашия дизайн:

  • &bdquo;Ами ако една от нашите услуги се срине?”
  • &bdquo;Как ще разпределяме трафика си между нашите компоненти?”
  • &bdquo;Как можем да намалим товара в нашата база данни?”
  • &bdquo;Как да подобрим наличието на нашия кеш?”
  • &bdquo;Няма ли API Gateway да бъде единична точка на неуспех?”
  • &bdquo;Как можем да направим нашата система за уведомяване по -здрава?”
  • &bdquo;Как можем да намалим разходите за съхранение на медиите&ldquo;?
  • &bdquo;Услугата за чат носи твърде голяма отговорност?”

За да направим нашата система по -устойчива, можем да направим следното:

  • Изпълнение на множество случаи на всяка от нашите услуги.
  • Въвеждане на балансиращи натоварвания между клиенти, сървъри, бази данни и кеш сървъри.
  • Използване на множество реплики за четене за нашите бази данни.
  • Множество случаи и реплики за нашия разпределен кеш.
  • Можем да имаме реплика на готовност на нашия API портал.
  • Точно след като поръчката за доставка и съобщения е предизвикателство в разпределена система, можем да използваме специален брокер на съобщения като Apache Kafka или Nats, за да направим нашата система за известия по -здрава.
  • Можем да добавим възможности за обработка на медии и компресиране към медийната услуга, за да компресираме големи файлове, подобни на WhatsApp, което ще спести много място за съхранение и ще намали разходите.
  • Можем да създадем групова услуга, отделна от услугата за чат, за да отделим допълнително нашите услуги.

Тази статия е част от моя курс за дизайн на системата с отворен код, наличен в GitHub.

Karanpratapsingh / System-Design

Научете как да проектирате системи в мащаб и се подгответе за интервюта за дизайн на системата

Курс за дизайн на системата

Ей, добре дошли в курса. Надявам се този курс да осигури страхотно изживяване на обучението.

Този курс е достъпен и на моя уебсайт и като електронна книга на Leanpub. Моля, оставете ⭐ като мотивация, ако това беше полезно!

Съдържание

  • Приготвяме се да започнем
    • Какво е дизайн на системата?
    • IP
    • OSI модел
    • TCP и UDP
    • Система за име на домейн (DNS)
    • Балансиране на натоварването
    • Клъстериране
    • Кеширане
    • Мрежа за доставка на съдържание (CDN)
    • Прокси
    • Наличност
    • Мащабируемост
    • Съхранение
    • Бази данни и СУБД
    • SQL бази данни
    • NoSQL бази данни
    • Базите данни SQL срещу NOSQL
    • Репликация на база данни
    • Индекси
    • Нормализиране и денормализиране
    • Модели на киселина и основна консистенция
    • Теорема на капачката
    • Теорема на Pacelc
    • Транзакции
    • Разпределени транзакции
    • Sharding
    • Последователно хеширане
    • Федерация по база данни
    • N-ниво архитектура
    • Брокери на съобщения
    • Опашки на съобщения
    • Публикувайте-подписване
    • Enterprise Service Bus (ESB)
    • Монолити и микросервизи
    • Архитектура, управлявана от събития (EDA)
    • Изпитване на събития
    • Сегрегация на отговорност за команда и заявка (CQRS)
    • API Gateway
    • Почивка, GraphQL, GRPC
    • Дълго гласуване, уебсайтове, събития със сървърно обслужване (SSE)