Синхронное и асинхронное сообщение

Обновлено: 30.06.2024

При проектировании микросервисов часто возникает вопрос: какой способ связи между ними выбрать.

Многие отдают предпочтение RESTful API. Однако этот подход не всегда эффективен, так как в отдельных случаях чреват долгим ожиданием на клиентской стороне и потерей информации в случае сбоев.

Sync vs Async: синхронное и асинхронное взаимодействие




Однако сами очереди также необходимо масштабировать, и это может создать дополнительные сложности.

Правда, при этом очередь сама приобретает статус SPoF (Single Point Of Failure), поэтому необходимо заранее предусмотреть действия на случай ее аварийного отключения.

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

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

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

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

Это обработка финансовых транзакций, бронирование авиабилетов, обновление записей о пациентах в сфере здравоохранения и так далее.

В каких случаях очереди неэффективны

Конечно, очереди не являются универсальным средством для любых приложений. Рассмотрим варианты, когда очереди не будут самым эффективным решением:

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

Объясните максимально доходчиво, простыми словами, как это работает. синхронные- это обычные без очереди вроде бы ясно, а асинхронные не могу понять, "пощупать". как они приходят непосредственно окну. Это всё равно, что растолкать очередь людей за хлебом??

Асинхронные сокеты , ф-я WSAAsyncSelect и ее применение
Доброго времени суток , возникла проблема с асинхронностью сокетов , а именно функцией.


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

Литература. Синхронные и асинхронные автоматы
Поделитесь пожалуйста литературой. Необходимо написать программу работы синхронного автомата, и еще.

Lorem ipsum dolor

Синхронное представление в быту

  • доделать дела на работе;

  • подготовить вечерний наряд;

  • сделать прическу, маникюр и накрасит ь ся;

  • попросить маму накрыть на стол.

Асинхронная передача данных в программировании

Терминология асинхронности

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

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

  3. Многопоточность. Данный термин обозначает наличие нескольких потоков выполнения программы.

  4. Асинхронность. Данный термин означает, что начало и конец одной функции мо гут происходить в разных частях кода. Чтобы такая функция завершилась , должно пройти немного времени, но сколько точно — сказать невозможно.

Заключение

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

Нельзя утверждать, что асинхронная передача данных — это единственно правильный подход. Это совсем не так, потому что синхронный подход тоже до сих пор очень популярен и часто используется.

Мы будем очень благодарны

если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.


В данной статье собраны базовые принципы и эволюция межсервисного взаимодействия с использованием специализированного ПО — Message oriented middleware (МОМ), в частности RabbitMQ.

  • Развитие двухзвенных систем и их проблемы.
  • Развитие трехзвенных, N-звенных систем и их проблемы.
  • Проблемы синхронного взаимодействия сервис-сервис.
  • Описание асинхронного взаимодействия как альтернативы.
  • Горизонтальное масштабирование асинхронных систем, использующих MOM.

Для того чтобы понять плюсы и минусы MOM, произведем сравнение некоторых подходов в построении ПО:

  • Наиболее простая и в то же время очень тяжёлая для развития двухзвенная архитектура.
  • Более сложная и более распространённая трехзвенная или N-звенная архитектура.
  • Использование Message oriented middleware для связи сервисов.

Двухзвенная архитектура

Некоторые свойства двухзвенной архитектуры:

  • Первоначальная простота разработки.
  • Хорошо подходит для малой нагрузки.
  • Ограниченная масштабируемость.
  • Смена API сервера нарушает работу клиента.
  • Синхронность вызовов.


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

При необходимости изменения работы серверной логики потребуется изменять работу клиента.
Например:

  1. Клиент напрямую отправлял запросы о создании записи лишь в одной таблице.
  2. После доработок сервера появилась необходимость записывать также еще одну запись в другую таблицу с foreign key (внешний ключ). Следовательно, клиент обязан знать об изменениях на сервере.

Трехзвенная архитектура

Некоторые свойства трехзвенной архитектуры:

  • Увеличение первоначальной сложности разработки.
  • Лучшая масштабируемость.
  • Необходимость разбиения больших модулей (сервисов) с логикой.
  • Сложность интеграции N модулей.
  • Синхронность вызовов.



Решить некоторые проблемы двухзвенных приложений помогает переход на трёх- и выше звеньевую систему.
В трехзвенной архитектуре высокоуровневая логика вынесена в отдельный уровень и находится на сервере приложений. Клиент работает либо опосредованно с БД через серверы приложений, либо можно абстрагироваться от БД и просто заявить, что разная логика находится в разных приложениях и не должна пересекаться.

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

Рано или поздно монолитное приложение начинает обрастать столь сложным функционалом, что его нужно делить на более мелкие логические модули/сервисы, облегчая тем самым поддержку и разработку этих мелких модулей/сервисов. К тому же длительность работы разной логики, находящейся на разных серверах, может отличаться на несколько порядков (10, 100 и выше раз). Это связано с логикой, которая находится в этих вызовах.

После разбиения на модули либо же добавления модулей/сервисов возникает вопрос о простой интеграции этих модулей в одну сеть, не отказываясь от плюсов N звенной системы. При этом нужно соблюсти единый подход в построении API.

Message oriented middleware (MOM)

Некоторые свойства Message oriented middleware (MOM):


Message oriented middleware — это ПО, предназначенное для объединения различных модулей/сервисов в единую сеть.

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

Последующие изменения в инфраструктуре и/или сети никак не влекут изменений в приложениях. Пожалуй, придется поменять лишь сетевой адрес сервера Middleware (если он, конечно, переедет).

Middleware обеспечивает очень прозрачный, открытый доступ к сетевому сервису.

Middleware не зависит от других сетевых сервисов. Middleware архитектура очень легко поддается масштабированию — достаточно поднять клон необходимого сервиса.

Данная архитектура является асинхронной, т. е. в сравнении с трехзвенным приложениями, здесь отсутствуют блокировки при запросах от сервиса к сервису.

На нашем проекте используется именно такая схема общения сервисов между собой по нескольким причинам:

Особенности общения по протоколу AMQP:


Работу Message Broker, представителем которого является RabbitMQ, можно представить как работу почтового отделения.

Масштабирование

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


Синхронное и асинхронное взаимодействие


Синхронное взаимодействие:

Асинхронное взаимодействие:

Заключение

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

Читайте также: