Использует ли WhatsApp Rabbitmq

RabbitMQ построен на Эрланг Язык программирования общего назначения, а также используется WhatsApp для обмена сообщениями.

Краткое содержание

WhatsApp использует Rabbitmq, который построен на Erlang, в качестве очереди в сообщениях об обмене сообщениями для доставки сообщений.

При разработке системы чата в реальном времени важно рассмотреть очередь, используемая популярными платформами обмена сообщениями, такими как WhatsApp и Facebook Messenger. Несмотря на то, что может показаться логичным иметь очередь для каждого человека или кафка-Topic для каждого пользователя, учитывая миллиарды пользователей на этих платформах, этот подход потребует непрактичного количества очередей или тем. Тем не менее, было замечено, что WhatsApp и Facebook Messenger используют очередь под названием «Iris» (аналогично Kafka) для доставки сообщений.

Существуют внутренние системы, которые заполняют базы данных (такие как Hbase и Myrocks) из очереди сообщений, но эти базы данных не являются основной системой доставки.

Вопросы и ответы

1. На что построено Rabbitmq?

RabbitMQ построен на языке программирования общего назначения Erlang.
2. Как WhatsApp использует Rabbitmq?

WhatsApp использует RabbitMQ в качестве очереди обмена сообщениями для доставки сообщений.
3. Какова цель очереди обмена сообщениями?

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

Несмотря на то, что очередь на человека может показаться логичной, для этого потребуется непрактичное количество очередей, учитывая миллиарды пользователей на этих платформах.
5. Какая очередь используется WhatsApp и Facebook Messenger для доставки сообщений?

WhatsApp и Facebook Messenger используют очередь под названием «Iris» для доставки сообщений. «Iris» похож на Kafka.
6. Какие базы данных используются WhatsApp для хранения сообщений?

WhatsApp использует базы данных, такие как Hbase и Myrocks для хранения сообщений. Эти базы данных заполнены из очереди сообщений.
7. Rabbitmq – основная система доставки для WhatsApp?

Нет, Rabbitmq не является основной системой доставки для WhatsApp. Он используется в качестве очереди обмена сообщениями для доставки сообщений.
8. Доставка сообщений в WhatsApp и Facebook Messenger синхронно или асинхронно?

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

Использование очереди обмена сообщениями, такая как RabbitMQ, позволяет разместить компоненты, улучшенную масштабируемость и асинхронную связь между системными элементами.
10. Can Rabbitmq обрабатывает высокие объемы сообщений?

Да, RabbitMQ предназначен для обработки больших объемов сообщений и способен выполнять их эффективно и надежно.
11. Каковы альтернативы Rabbitmq для реализации очереди обмена сообщениями?

Некоторые альтернативы Rabbitmq включают потоки Apache Kafka, ActiveMQ и Redis.
12. Есть ли какие -либо ограничения на использование очереди обмена сообщениями, как Rabbitmq?

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

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

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

Rabbitmq обеспечивает надежность доставки сообщений с помощью таких функций, как подтверждение сообщений, подтверждает издатель и долговечность в очереди.

Использует ли WhatsApp Rabbitmq

RabbitMQ построен на Эрланг Язык программирования общего назначения, а также используется WhatsApp для обмена сообщениями.

Очередь, используемая в WhatsApp или FB Messenger

Обдумывая разработку системы для чата в реальном времени, мне любопытно, какая очередь WhatsApp или FB Messenger использует на стороне сервера для доставки сообщения получателю. Что я думал, так это то, что есть очередь для каждого человека/кафка-топик, поэтому, когда новое сообщение нужно доставить пользователю A, сообщение введено в очередь A. Тем не менее, могут быть миллиарды пользователей (у FB 2 миллиарда пользователей), это означает, что нам нужно 2 миллиарда очередей/тем (в термине Kafka)? Если это так, какая очередь может выполнить эту работу. Приглашается любой комментарий! Спасибо!

спросил 25 июня 2019 года в 16:44

1 669 8 8 Золотые значки 23 23 Серебряные значки 37 37 Бронзовые значки

Вы можете найти документацию о том, что Messager был построен над Hbase, а теперь Myrocks. Есть внутренние системы, которые будут заполнять эти базы данных из очереди, да, но это не основная система доставки. код.фб.com/core-data/…

26 июня 2019 в 3:08

@Cricket_007 Спасибо за комментарии. Да, похоже, что FB использует Iris (Kafka Like) в качестве очереди для доставки.

alifzl/yomkippur

Этот коммит не принадлежит ни к какой ветви в этом хранилище и может принадлежать вилке за пределами репозитория.

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

Теги ветвей

Не мог загрузить ветви

Нечего показать

Не мог загрузить теги

Нечего показать

Имя уже используется

Тег уже существует с предоставленным названием филиала. Многие команды GIT принимают имена тегов, и ветви, поэтому создание этой ветви может вызвать неожиданное поведение. Вы уверены, что хотите создать эту ветку?

Отменить создание

  • Местный
  • Кодепсы

Https github cli

Используйте GIT или Checkout с SVN, используя веб -URL.

Работать быстро с нашим официальным CLI. Узнайте больше о CLI.

Войдите в обязатель

Пожалуйста, войдите в систему, чтобы использовать Codespaces.

Запуск настольного компьютера GitHub

Если ничего не произойдет, загрузите настольный компьютер GitHub и попробуйте еще раз.

Запуск настольного компьютера GitHub

Если ничего не произойдет, загрузите настольный компьютер GitHub и попробуйте еще раз.

Запуск Xcode

Если ничего не произойдет, загрузите Xcode и попробуйте еще раз.

Запуск кода Visual Studio

Ваше кодовое откроется, как только будет готово.

Была проблема с подготовкой вашего кода, попробуйте еще раз.

Последний коммит

GIT STATS

Файлы

Не удалось загрузить последнюю информацию о коммите.

Последнее сообщение о коммите

Совершить время

ПРОЧТИ МЕНЯ.доктор медицинских наук

Yom Kippur-это инструмент автоматизации WhatsApp, целью которого является постоянное и постоянное решение для некоммерческого использования WhatsApp в качестве автоматизированного бота.

Что оно делает?

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

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

Сначала я увидел YOWSUP по своему единственному выбору, но из -за проблем, перечисленных ниже, я передумал, чтобы реализовать его другим образом:

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

Ну, зависимости в этом проекте, они довольно много! Прежде всего, должны быть удовлетворены эти требования:
Установщики Windows обновляются, но это может быть имплантинг в Macos или Macos Machine (оба они не протестированы)

Зависимость Описание / Ссылки загрузки
Android Studio Android Studio с Android API 28
ДЖАВА Java JDK 11
Mysql MySQL -установщика сообщества 8.X или выше
Питон 2.7 Питон 2.7
Аппий V1.10 или выше
Rabbitmq Последняя версия Rabbitmq
Почтальон Последняя версия почтальника

Соображения: Вы можете использовать Conda Virenv для Python 2.7, но это вызвало мне серьезную головную боль (не рекомендуется)
Основная причина, по которой я использовал Python 2 для этого проекта, заключается в том, что клиент Appium, MySQL Connector и RabbitMQ были несовместимыми в версии 3.

Прежде всего, будьте терпеливы в этой части. Мне потребовалась кровь и слезы, чтобы вытереть Shits зависимости для выполнения такой простой задачи.

1.Виртуальное устройство Android
Luanch Avd Manager из Android Studio, настройте устройство с Android 9.0 с API 28 (выберите и соответствующее имя для AVD, потому что он нуждается в дальнейших шагах).
Обратите внимание, что вам следует установить WhatsApp через сам AVD, поэтому выберите версию поддержанного PlayStore.
Проверьте, что у вас есть переменные среды в вашей учетной записи:

Имя переменной Переменное значение
Android_home C: \ users \ 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 с вашим устройством (обязательно)
Для этого вы должны выполнить устройства ADB или USB ADB, чтобы проверить ауторизацию AVD.

C:\ Uсмеситель\ FZl\ Appdata\ Lокал\ Android\ Sдк\пЛатформа-инструменты: устройство ADB Список устройств прикрепленного эмулятора-5554

Если вы видите несанкционированный результат, вы должны перейти по этой ссылке.

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

После установки raabitmq вы должны запустить Rabbitmq-Plugins, включив Rabbitmq_management в каталоге Rabbitmq SBIN, чтобы включить веб-пар. Потребуется ограничение обслуживания RabbitMQ.
После этого вы должны иметь возможность получить доступ к веб-GUI RabbitMQ с помощью http: // localhost: 15672/#/адрес в вашей локальной машине. Если да, создайте нового пользователя по командам ниже и сделайте его администратором:

rabbitmqctl add_user имени пользователя пароль # Это делает пользователя администратором Rabbitmqctl set_user_tags Администратор пользователя # Это устанавливает разрешения для пользователя rabbitmqctl set_permissions -p / имя пользователя ".*" ".*" ".*"

Войдите в систему с недавно созданными учетными данными и импортируйте спецификации очереди, которые уже прикреплены в этом репо, который называется Rabbitmq_conf.JSON в разделе «Определения импорта» в разделе «Обзор».
Это создаст необходимые конфигурации для RabbitMQ и обеспечивает необходимые привилегии.

3.Аппий
Просто запустите Appium Server с настройками по умолчанию. Appium-Default-Capability ” ‘уже встроен в код. TL; DR: на этом шаге нечего делать.

4.Mysql
Установите сообщество издания MySQL, создайте соответствующую учетную запись DB и автоматически установите Service Run, когда запускает ОС.

5.Установить зависимости от питона
Просто запустите установку PIP -R -зависимости.TXT, чтобы разрешить зависимость используемых библиотек.
Вы можете столкнуться с устаревшей версией библиотеки MySQLDB, которая разрешается установкой это и это. Позаботьтесь об установке Python 2.X версия упомянутых библиотек.

6.Создать каталоги для файлов журнала
Создайте каталоги и файлы как это’S упомянуто ниже:

# каталоги C:\ VАР\ lOG [каталог] C:\ VАР\ lОг\ whatsapp_api [каталог] # лог-файлы C:\ VАР\ lОг\ aПи.log c:\ VАР\ lОг\ whatsapp_single_consumer.log c:\ VАР\ lОг\ whatsapp_single_worker.log c:\ VАР\ lОг \

7.Установить йом Кипур’S Файл конфигурации
Перейдите в Yomkippur-Master \ configs \ config.CFG и введите следующее.
(не меняйте ничего, эсл, если вы не знаете, что вы делаете)

[mysql] хост = 127.0.0.1 имя пользователя ='Ваше имя пользователя MySQL' пароль ='Ваш пароль MySQL' База данных = WhatsApp [rabbitmq] ip = 127.0.0.1 ipqueuename = ipaddr.queue username ='Ваше имя пользователя Rabbitmq' пароль ='Ваш пароль RabbitMQ' [queue_name] single_message = whatsapp_singlemessage_queue froadcast_message = whatsapp_broadcastmessage_queue add_contact = whatsapp_newcontact_listener_queue leview_message = whatsapp_messagelistener_queue

Запустить основной.py и add_new_contact_producer.PY в двух отдельных терминалах/CMD среде.
Если вы не видели никакой ошибки, вы готовы идти.

  1. Убедитесь, что MySQL Server работает
  2. Убедитесь, что RabbitMQ Sear Runnig
  3. Запустите Appium с настройками Defualt
  4. Запустите эти сценарии

Python Main.py python add_new_contact_producer.py python single_message_producer.пирог

  1. Запустите почтальон и создайте желательные команды POST из списка ниже:

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

Отправка отдельного сообщения через WhatsApp

Развитие и внести свой вклад?

Хочу внести свой вклад? Большой! Не стесняйтесь сбить меня с толку.fazeli95 [at] gmail [dot] com или просто создайте запрос на тягу.

Все компоненты, используемые в этом проекте

О

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

Введение в Rabbitmq

Здесь мы узнаем, что такое Rabbitmq, использование RabbitMQ и почему нам нужно использовать RabbitMQ в наших приложениях с примерами.

Что такое Rabbitmq?

Rabbitmq является AMQP Брокер обмена сообщениями, и это самый популярный брокер с открытым исходным кодом и кроссплатформенным сообщением.

Rabbitmq также является способом обмена данными между различными платформы, такими как сообщение, отправленное из .Сеть Приложение может быть прочитано Узел.младший приложение или Джава приложение.

RabbitMQ построен на Эрланг Язык программирования общего назначения, а также используется WhatsApp для обмена сообщениями.

Что такое AMQP?

Протокол очереди передового сообщений (AMQP) является протоколом уровня приложений с открытым стандартом для ориентированного на сообщения, а функции AMQP-ориентация сообщений, очередь, маршрутизацию (включая точку-точки и публикацию и подписку), надежность и безопасность.

Он был разработан JPMorgan и Imatix Corporation. AMQP был разработан со следующими основными характеристиками в качестве целей:

  • Безопасность
  • Надежность
  • Совместимость
  • Стандартный
  • Открыть

RabbitMQ легкий и легко развернуть в доступных помещениях, и он поддерживает несколько протоколов обмена сообщениями. RabbitMQ может быть развернут в распределенных и федеративных конфигурациях для удовлетворения высокомасштабных требований к высокой доступности.

Ниже приведено графическое представление о том, как Rabbitmq будет служить посредником между отправителем и потребителем в наших приложениях.

Расходовая диаграмма процесса Rabbitmq

Почему и когда использовать Rabbitmq?

Теперь дни, когда большинство людей выполнят несколько задач в одиночном приложении, таких как отправка электронных писем или SMS, отчеты, и это создаст тяжелую нагрузку на приложение, поэтому, если вы разделяете эти задачи, мы получим больше места (память), чтобы обслуживать больше запросов.

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

Rabbitmq-это брокер с открытым исходным кодом и кроссплатформенным сообщением, так что он’просты в использовании со многими языками, такими как .Сеть, Java, Python, Ruby, Node.Младший.

Rabbitmq поддерживает клиентские библиотеки

Rabbitmq будет поддерживать несколько операционных систем и языков программирования. Rabbitmq предоставил различные клиентские библиотеки для следующих языков программирования.

  • .Сеть
  • Джава
  • Весенняя каркас
  • Рубин
  • Питон
  • PHP
  • Objective-C и Swift
  • JavaScript
  • ИДТИ
  • Перв

Дизайн системы: 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 MILLAY \ TIME 20 \ SPACE Messages = 2 \ Space Million / Day 50 Mi Ll I O N × 20 м ESS A G ES = 2 BI LL I O N / D A Y

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

5 P E R C E N T × 2 B I L L I O N = 200 M I L I O N / D A Y 5 \ Процент пространства \ Times 2 \ Space Million = 200 \ Space Million / Day 5 Perce N T × 2 Bi Ll I O N = 200 миль I O N / D A Y

Что будут запросами в секунду (RPS) для нашей системы? 2 миллиарда запросов в день переводятся на 24 км запросы в секунду в секунду.

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 S / S E C O N D \ FRAC<2 \space billion> <(24 \space hrs \times 3600 \space seconds)>= \ sim 24K \ Пространственные запросы / второй (24 ч RS × 3600 SECO N D S) 2 Bi Ll I O n = ∼ 24 K Re QU ES T S / SECO N D

### Хранение Если мы предполагаем, что каждое сообщение в среднем составляет 100 байтов, нам потребуется около 200 ГБ хранилища базы данных каждый день.

2 b i l l i o n × 100 by t e s = ∼ 200 g b / d a y 2 \ space million \ times 100 \ Space Bytes = \ sim 200 \ Space Gb / Day 2 Bi Ll I O N × 100 B Y T ES = ∼ 200 ГБ / D A Y

Согласно нашим требованиям, мы также знаем, что около 5 процентов наших ежедневных сообщений (100 миллионов) являются медиа -файлами. Если мы предположим, что каждый файл в среднем составляет 50 кб, нам потребуется 10 ТБ хранилища каждый день.

100 м I L L I O N × 100 K B = 10 T B / D A 100 \ Пространство миллион \ раз 100 \ Пространство KB = 10 \ Space TB / Day 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 \ Пространство TB + 0.2 \ Space TB) \ Times 10 \ Space Years \ Times 365 \ Space Days = \ SIM 38 \ Space PB (10 TB + 0.2 ТБ) × 10 YE A RS × 365 D A YS = ∼ 38 PB

### полоса пропускания по мере того, как наша система обрабатывает 10.2 ТБ входа каждый день, нам потребуется минимальная полоса пропускания около 120 МБ в секунду.

10.2 T B (24 H R S × 3600 S E C O N D S) = ∼ 120 м 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 ТБ = ∼ 120 МБ / SECO N D

### Оценка высокого уровня вот наша оценка высокого уровня:

Тип Оценивать
Ежедневные активные пользователи (DAU) 50 миллионов
Запросы в секунду (RPS) 24K/с
Хранение (в день) ~ 10.2 ТБ
Хранение (10 лет) ~ 38 пб
Пропускная способность ~ 120 МБ/с

Конструкция модели данных

WhatsApp-Datamodel

Это общая модель данных, которая отражает наши требования. У нас есть следующие таблицы: пользователи Эта таблица будет содержать информацию пользователя, такую ​​как имя, PhonNembumber и другие детали. Сообщения Как следует из названия, эта таблица будет хранить сообщения со свойствами, такими как тип (текст, изображение, видео и т. Д.), контент и временные метки для доставки сообщений. Сообщение также будет иметь соответствующий ChatiD или GroupID . чаты Эта таблица в основном представляет собой личный чат между двумя пользователями и может содержать несколько сообщений. users_chats Эта таблица отображает пользователей и чаты, так как несколько пользователей могут иметь несколько чатов (N: M: отношения) и наоборот. группа Эта таблица представляет группу между несколькими пользователями. users_groups Эта таблица отображает пользователей и группы, поскольку несколько пользователей могут быть частью нескольких групп (N: M -отношения) и наоборот.

Какая база данных мы должны использовать?

Хотя наша модель данных кажется довольно реляционной, нам не обязательно хранить все в одной базе данных, так как это может ограничить нашу масштабируемость и быстро стать узким местом. Мы разделяем данные между разными службами, каждый из которых имеет право собственности на конкретную таблицу. Затем мы можем использовать реляционную базу данных, такую ​​как PostgreSQL или распределенная база данных NOSQL, такую ​​как Apache Cassandra для нашего варианта использования.

Дизайн API

Давайте сделаем базовый дизайн API для наших услуг:

Получите все чаты или группы

Этот API получит все чаты или группы для данного иида пользователя .

получить все(ID пользователя: Uuid): Чат[] | Группа[] 

Введите полноэкранный режим

Выйдите из полноэкранного режима

Параметры Идентификатор пользователя (uuid): идентификатор текущего пользователя. Возврат Результат (CHAT [] | Group []): все чаты и группы, которые пользователь является частью.

Получите сообщения

Получите все сообщения для пользователя с учетом канала (чат или идентификатор группы).

getMessages(ID пользователя: Uuid, канал: Uuid): Сообщение[] 

Введите полноэкранный режим

Выйдите из полноэкранного режима

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

Отправить сообщение

Отправить сообщение от пользователя на канал (чат или группа).

Отправить сообщение(ID пользователя: Uuid, канал: Uuid, сообщение: Сообщение): логический 

Введите полноэкранный режим

Выйдите из полноэкранного режима

Параметры Идентификатор пользователя (uuid): идентификатор текущего пользователя. Идентификатор канала (UUID): идентификатор канала (чат или группа) хочет отправить сообщение в. Сообщение (сообщение): сообщение (текст, изображение, видео и т. Д.) что пользователь хочет отправить. Возврат Результат (логический): представляет, была ли операция успешной или нет.

Присоединяйтесь или оставьте группу

Отправить сообщение от пользователя на канал (чат или группа).

вступить в группу(ID пользователя: Uuid, канал: Uuid): логический Покинуть группу(ID пользователя: Uuid, канал: Uuid): логический 

Введите полноэкранный режим

Выйдите из полноэкранного режима

Параметры Идентификатор пользователя (uuid): идентификатор текущего пользователя. Идентификатор канала (UUID): идентификатор канала (чат или группу) пользователь хочет присоединиться или уйти. Возврат Результат (логический): представляет, была ли операция успешной или нет.

Высокий дизайн

Теперь давайте сделаем проект на высоком уровне нашей системы.

Архитектура

Мы будем использовать архитектуру микросервисов, так как она облегчит масштаб по горизонтали и отделяет наши услуги. Каждая услуга будет владеть собственной моделью данных. Давайте попробуем разделить нашу систему на некоторые основные услуги. Пользовательский сервис Это услуга на основе HTTP, которая обрабатывает связанные с пользователем проблемы, такие как аутентификация и пользовательская информация. Чат службы Служба чата будет использовать веб-токеты и установить соединения с клиентом для обработки функций, связанных с чатом и групповым сообщением. Мы также можем использовать кэш для отслеживания всех активных соединений, как сеансы, которые помогут нам определить, является ли пользователь в Интернете или нет. Уведомление служба Эта услуга просто отправит push -уведомления пользователям. Это будет подробно обсуждаться отдельно. Присутствие службы Служба присутствия будет отслеживать последний вид статуса всех пользователей. Это будет подробно обсуждаться отдельно. СМИ Сервис Эта служба будет обрабатывать носитель (изображения, видео, файлы и т. Д.) загружает. Это будет подробно обсуждаться отдельно. А как насчет общения и обнаружения услуг? Поскольку наша архитектура основана на микросервисах, услуги также будут общаться друг с другом. Как правило, отдых или HTTP хорошо работают, но мы можем дополнительно улучшить производительность с помощью GRPC, который является более легким и эффективным. Обнаружение услуг – это еще одна вещь, которую нам придется учитывать. Мы также можем использовать сервисную сетку, которая позволяет управлять, наблюдаемой и безопасной связи между отдельными услугами. Примечание. Узнайте больше о отдыхе, GraphQL, GRPC и о том, как они сравниваются друг с другом.

Обмен сообщениями в реальном времени

Как эффективно отправлять и получать сообщения? У нас есть два разных варианта: Потянуть модель Клиент может периодически отправлять HTTP -запрос на серверы, чтобы проверить, есть ли новые сообщения. Это может быть достигнуто через что -то вроде длинного опроса. Push -модель Клиент открывает долгоживущее соединение с сервером, и как только новые данные будут доступны, он будет направлен на клиент. Мы можем использовать веб-билет или серверные события (SSE) для этого. Подход модели тяги не является масштабируемым, так как он создаст ненужные накладные расходы на наши серверы, и большую часть времени ответ будет пустым, что тратит наши ресурсы. Чтобы минимизировать задержку, использование модели Push с WebSockets является лучшим выбором, потому что тогда мы можем доставить данные клиенту, как только она будет доступна без какой -либо задержки, учитывая, что соединение открыто с клиентом. Кроме того, WebSockets обеспечивает полнодуплексную связь, в отличие от серверных событий (SSE), которые являются только однонаправленными. Примечание. Узнайте больше о длинных опросах, веб-питаниях, серверных событиях (SSE).

Последний раз видели

Чтобы реализовать последнюю функциональность, мы можем использовать механизм сердцебиения, где клиент может периодически пинговать серверы, указывающие на его жизнь. Поскольку это должно быть как можно более низким накладным расходом, мы можем сохранить последнюю активную метку времени в кэше следующим образом:

Ключ Ценить
Пользователь а 2022-07-01T14: 32: 50
Пользователь б 2022-07-05T05: 10: 35
Пользователь c 2022-07-10T04: 33: 25

Это даст нам в последний раз, когда пользователь был активным. Эта функция будет обрабатываться службой присутствия в сочетании с Redis или Memcached как наш кэш. Другой способ реализации этого – отслеживать последнее действие пользователя, когда последнее действие пересекает определенный порог, такой как &laquo;Пользователь не выполнил никаких действий за последние 30 секунд&raquo;, Мы можем показать пользователю в автономном режиме и в последний раз видели с последней записанной временной меткой. Это будет скорее ленивый подход обновления и может принести нам пользу из -за сердцебиения в некоторых случаях.

Уведомления

После того, как сообщение отправляется в чате или группе, мы сначала проверим, активен ли получатель, мы можем получить эту информацию, приняв активное соединение пользователя и в последний раз рассматриваемые во внимание. Если получатель не активен, служба чата добавит событие в очередь сообщений с дополнительными метаданными, такими как платформа устройства клиента, которая будет использоваться для маршрутизации уведомления на правильную платформу позже. Служба уведомлений будет затем потреблять событие из очереди сообщений и перенаправить запрос на обмен Messing Messaging (FCM) или служба уведомлений Apple Push (APNS) на основе платформы устройства клиента (Android, iOS, Интернет и т. Д.). Мы также можем добавить поддержку для электронной почты и SMS. Почему мы используем очередь сообщения? Поскольку большинство очередей сообщений обеспечивают наиболее эффективные заказы, что гарантирует, что сообщения обычно доставляются в том же порядке, что и отправлено, и что сообщение доставляется хотя бы один раз, что является важной частью нашей функции обслуживания. Хотя это похоже на классический вариант использования публикации, на самом деле, это не так, как у мобильных устройств и браузеров есть свой собственный способ обработки push-уведомлений. Обычно уведомления обрабатываются извне через обмен сообщением Firebase Cloud (FCM) или Apple Push Service (APNS) в отличие от FAN-OUT, которые мы обычно видим в Backend Services. Мы можем использовать что -то вроде Amazon SQS или RabbitMQ для поддержки этой функции.

Прочитать квитанции

Квитанции о прочтении обработки могут быть сложными, для этого варианта использования мы можем дождаться какого -то подтверждения (ACK) от клиента, чтобы определить, было ли доставлено сообщение, и обновить соответствующее поле доставки. Точно так же мы отметим сообщение &laquo;Сообщение&raquo;, увиденное, как только пользователь откроет чат и обновит соответствующее поле Seeat TimeStam.

Дизайн

WhatsApp-Basic-Design

Теперь, когда мы определили некоторые основные компоненты, давайте сделаем первый проект нашей системы системы.

Детальный дизайн

Пришло время подробно обсудить наши дизайнерские решения.

Разделение данных

  • Разделение на основе хеша
  • Разделение на основе списков
  • Распределение на основе диапазона
  • Составное разделение

Приведенные выше подходы все еще могут вызывать неравномерные данные и распределение нагрузки, мы можем решить это, используя последовательное хэшинг.

Кэширование

В приложении обмена сообщениями мы должны быть осторожны с использованием кэша, поскольку наши пользователи ожидают последних данных, но многие пользователи будут запрашивать те же сообщения, особенно в групповом чате. Таким образом, чтобы предотвратить использование шипов из наших ресурсов, мы можем кэшировать более старые сообщения.

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

Какую политику выселения кеша использовать?

Мы можем использовать такие решения, как Redis или Memcached и кэшировать 20% ежедневного трафика, но какая политика выселения кеша лучше всего соответствовала бы нашим потребностям?

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

Как справиться с кешем?

Всякий раз, когда происходит промаха кеша, наши серверы могут напрямую нажимать на базу данных и обновить кэш с помощью новых записей.

Для получения более подробной информации обратитесь к кэшированию.

Доступ к носителям и хранилище

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

Но где мы можем хранить файлы в масштабе? Ну, хранение объектов – это то, что мы ищем. Объект хранит файлы данных на части, называемые объектами. Затем он хранит эти объекты в одном репозитории, который может быть распределен по нескольким сетевым системам. Мы также можем использовать распределенное хранилище файлов, такие как HDFS или GlusterFS.

Забавный факт: WhatsApp удаляет медиа на своих серверах, как только он будет загружен пользователем.

Мы можем использовать хранилища объектов, такие как Amazon S3, Hazure Blob 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

Давайте определим и разрешаем узкие места, такие как единственные точки отказа в нашем дизайне:

  • “Что если одна из наших услуг сбои?”
  • “Как мы будем распространять наш трафик между нашими компонентами?”
  • “Как мы можем уменьшить нагрузку в нашей базе данных?”
  • “Как улучшить доступность нашего кеша?”
  • “Разве API Gateway не будет единственной точкой отказа?”
  • “Как мы можем сделать нашу систему уведомлений более надежной?”
  • &laquo;Как мы можем снизить затраты на хранение в СМИ&raquo;?
  • “Служба чата имеет слишком большую ответственность?”

Чтобы сделать нашу систему более устойчивой, мы можем сделать следующее:

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

Эта статья является частью моего курса дизайна системы с открытым исходным кодом, доступный на GitHub.

karanpratapsingh / system-design

Узнайте, как разрабатывать системы в масштабе и подготовиться к интервью с проектированием системы

Курс проектирования системы

Эй, добро пожаловать на курс. Я надеюсь, что этот курс обеспечивает отличный опыт обучения.

Этот курс также доступен на моем веб -сайте и в качестве электронной книги на LeanPub. Пожалуйста, оставьте мотивацию, если это было полезно!

Оглавление

  • Начиная
    • Что такое дизайн системы?
    • IP
    • Модель OSI
    • TCP и UDP
    • Система доменных имен (DNS)
    • Балансировка нагрузки
    • Кластеризация
    • Кэширование
    • Сеть доставки контента (CDN)
    • Прокси
    • Доступность
    • Масштабируемость
    • Хранилище
    • Базы данных и СУБД
    • Базы данных SQL
    • Базы данных NOSQL
    • SQL против баз данных NOSQL
    • Репликация базы данных
    • Индексы
    • Нормализация и денармализация
    • Модели кислотной и базовой консистенции
    • Кэп -теорема
    • Теорема PACELC
    • Транзакции
    • Распределенные транзакции
    • Шарь
    • Последовательный хешинг
    • Федерация базы данных
    • N-уровне архитектура
    • Брокеры сообщения
    • Очереди сообщения
    • Publish-Subscribe
    • Энтерправомерный сервисный автобус (ESB)
    • Монолиты и микросервисы
    • Архитектура, управляемая событиями (EDA)
    • Сообщение
    • Командные и запросы Ответственности
    • API Gateway
    • REST, GRAPHQL, GRPC
    • Длинные опросы, веб-питания, серверные события (SSE)