Incall Massages

Incall Massages



💣 👉🏻👉🏻👉🏻 ALL INFORMATION CLICK HERE 👈🏻👈🏻👈🏻

































Нажмите alt и / одновременно, чтобы открыть это меню
Создать Страницу знаменитости, музыкальной группы или компании.

Удаленная работа для IT-специалистов
Продолжение перевода небольшой книги:
«Understanding Message Brokers»,
автор: Jakub Korab, издательство: O'Reilly Media, Inc., дата издания: June 2017, ISBN: 9781492049296.

Перевод выполнен

Предыдущая часть: Понимание брокеров сообщений. Изучение механики обмена сообщениями посредством ActiveMQ и Kafka. Глава 1. Введение


ГЛАВА 2


ActiveMQ

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

ActiveMQ была разработана как реализация спецификации Java Message Service (JMS). Это решение было принято, чтобы удовлетворить требования к реализации JMS-совместимого обмена сообщениями в проекте Apache Geronimo — сервере приложений J2EE с открытым исходным кодом.
Система обмена сообщениями (или промежуточное ПО, ориентированное на сообщения, как ее иногда называют), реализующая спецификацию JMS, состоит из следующих компонентов:

Брокер

Центральная часть промежуточного программного обеспечения, распределяющая сообщения.

Клиент

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


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

Клиент и брокер общаются друг с другом через протокол прикладного уровня, также известный, как протокол взаимодействия (Figure. 2-1). Спецификация JMS оставила детали этого протокола конкретным реализациям.


Figure 2-1. Обзор JMS

JMS использует термин провайдер для описания реализации вендором системы обмена сообщениями, лежащей в основе API JMS, которая включает брокер, а также ее клиентские библиотеки.

Выбор в пользу внедрения JMS имел далеко идущие последствия для имплементационных решений, принятых авторами ActiveMQ. В самой спецификации изложены четкие указания по обязанностям клиента системы обмена сообщениями и брокера, с которым он общается, отдавая предпочтение обязательству брокера распределять и доставлять сообщения. Основная обязанность клиента — взаимодействовать с адресатом (очередью или топиком) отправляемых им сообщений. Сама спецификация направлена на то, чтобы сделать взаимодействие API с брокером относительно простым.

Это направление, как мы увидим позже, сильно повлияло на производительность ActiveMQ. В дополнение к сложностям брокера, пакет совместимости для спецификации, предоставленной Sun Microsystems, имел множество нюансов, с их собственным влиянием на производительность. Данные нюансы должны были все быть учтены, чтобы ActiveMQ считалась совместимой с JMS.


Связь

Хотя API и ожидаемое поведение были хорошо определены в спецификации JMS, фактический протокол связи между клиентом и брокером был намеренно исключен из спецификации, чтобы существующие брокеры могли быть сделаны JMS-совместимыми. Таким образом, ActiveMQ был свободен в определении своего собственного протокола взаимодействия — OpenWire. OpenWire используется реализацией клиентской библиотеки ActiveMQ JMS, а также ее аналогами в .Net и C++: NMS и CMS, которые являются подпроектами ActiveMQ, размещенными в Apache Software Foundation.

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

AMQP 1.0

Расширенный протокол очереди сообщений (Advanced Message Queuing Protocol) (ISO / IEC 19464:2014) не следует путать с его предшественником 0.X, который реализован в других системах обмена сообщениями, в частности в RabbitMQ, использующий 0.9.1. AMQP 1.0 является двоичным протоколом общего назначения для обмена сообщениями между двумя узлами. Он не имеет понятия клиентов или брокеров и включает в себя такие функции, как управление потоками, транзакции и различные QoS (не более одного раза, не менее одного раза и точно один раз).

STOMP

Простой / потоковый текстовый протокол обмена сообщениями (Simple/Streaming Text Oriented Messaging Protocol), простой в реализации протокол, который имеет десятки клиентских реализаций на разных языках.

XMPP

Расширяемый протокол обмена сообщениями и присутствия. (Extensible Messaging and Presence Protocol). Ранее называемый Jabber, этот протокол, основанный на XML, был первоначально разработан для систем чатов, но был расширен за пределы его первоначальных сценариев использования для включения обмена сообщениями типа «публикация-подписка».

MQTT

Легковесный протокол «публикация-подписка» (ISO / IEC 20922:2016), используемый для приложений «Машина-Машина» (M2M) и «Интернет вещей» (IoT).

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

Учитывая это, сейчас, когда мы говорим об ActiveMQ, мы больше не ссылаемся исключительно на стек взаимодействия, основанный на библиотеках JMS / NMS / CMS и протоколе OpenWire. Становится все более популярным сочетание и подбор языков, платформ и внешних библиотек, которые лучше всего подходят для данного приложения. Например, возможно, чтобы приложение JavaScript выполнялось в браузере с использованием MQTT библиотеки Eclipse Paho для отправки сообщений в ActiveMQ через веб-сокеты и эти сообщения читались серверным процессом C++, который использует AMQP посредством библиотеки Apache Qpid Proton. С этой точки зрения ландшафт обмена сообщениями становится все более разнообразным.

Заглядывая в будущее, AMQP, в частности, будет иметь гораздо больше возможностей, чем сейчас, поскольку компоненты, которые не являются ни клиентами, ни брокерами, становятся более знакомой частью ландшафта системы обмена сообщениями. Например, Apache Qpid Dispatch Router выступает в роли маршрутизатора сообщений, к которому клиенты подключаются напрямую, позволяя различным адресатам обрабатывать разные адреса, а также предоставляя возможность шардинга (разделения).

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


Компромисс между производительностью и надежностью

Прежде чем мы углубимся в детали того, как работает обмен сообщениями «точка-точка» в ActiveMQ, нам нужно немного поговорить о том, с чем сталкиваются все системы с интенсивной обработкой данных: компромисс между производительностью и надежностью.

Любая система, принимающая данные, будь то брокер сообщений или база данных, должна быть проинструктирована о том, как следует обрабатывать эти данные в случае сбоев. Сбой может принимать различные формы, но для простоты мы сузим его до ситуации, когда система теряет питание и немедленно отключается. В такой ситуации нам нужно порассуждать о том, что случится с данными, которые были в системе. Если данные (в данном случае сообщения) находились в памяти или в энергозависимой части железа, например в кэше, то эти данные будут потеряны. Однако, если данные были отправлены в энергонезависимое хранилище, например на диск, они снова будут доступны, когда система вернется в работу.

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

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

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

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


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

ActiveMQ поставляется с рядом подключаемых стратегий сохранения сообщений. Они идут в форме адаптеров персистентности (сохраняемости), которые можно рассматривать, как движки сохранения сообщений. К ним относятся решения, основанные на записи на диск, такие как KahaDB и LevelDB, а также на возможности использования базы данных через JDBC. Поскольку первые наиболее часто используются, мы сосредоточим наше обсуждение на них.

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

Дисковые адаптеры персистентности поддерживают индексные файлы, которые отслеживают, где в журнале расположены следующие пересылаемые сообщения. Когда все сообщения из файла журнала будут прочитаны, они будут либо удалены, либо заархивированы фоновым рабочим потоком ActiveMQ. Если этот журнал поврежден во время сбоя брокера, ActiveMQ перестроит его на основе информации в файлах журнала.

Сообщения из всех очередей записываются в одни и те же файлы журнала, что означает, что, если одно сообщение не прочитано, то весь файл (обычно по умолчанию 32 МБ или 100 МБ, в зависимости от адаптера персистентности) не может быть очищен. Это может со временем вызвать проблемы с нехваткой дискового пространства.

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


Факторы производительности диска

Существует ряд факторов, определяющих скорость, с которой может работать диск. Чтобы понять это, рассмотрим способ записи на диск через упрощенную мысленную модель трубы (pipe) (Figure 2-2).


Figure 2-2. Модель трубы производительности диска

У трубы есть три измерения:

Длина

Соответствует задержке (latency), ожидаемой для завершения одной операции. Для большинства локальных дисков она довольно неплоха, но может стать основным ограничивающим фактором в облачных средах, где локальный диск фактически находится в сети. Например, на момент написания статьи (апрель 2017 г.) Amazon гарантирует, что запись в их EBS хранилище будет выполняться «менее чем за 2 мс». Если мы выполняем запись последовательно, то это дает максимальную пропускную способность 500 записей в секунду.

Ширина

Определяет пропускную способность (carrying capacity or bandwidth) одиночной операции. Кэши файловой системы используют это свойство, объединяя множество небольших записей в меньший набор более крупных операций записи, выполняемых на диске.

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

Идея представляется в виде ряда событий, которые могут находиться в трубе одновременно, выражается метрикой, называемой IOPS (количество операций ввода-вывода в секунду). IOPS обычно используется производителями хранилищ и облачными провайдерами для измерения производительности. Жесткий диск будет иметь разные значения IOPS в разных контекстах: состоит ли рабочая нагрузка в основном из операций чтения, записи или их комбинации и являются ли эти операции последовательными, произвольными или смешанными. Измерения IOPS, которые наиболее интересны с точки зрения брокера, являются последовательными операциями чтения и записи, поскольку они соответствуют чтению и записи логов журнала.

Максимальная пропускная способность брокера сообщений определяется достижением первого из этих ограничений и настройка брокера во многом зависит от способа взаимодействия с дисками. Это не только фактор того, как, к примеру, настроен брокер, но также зависит от того, как продьюсеры взаимодействуют с брокером. Как и во всем, что связано с производительностью, необходимо протестировать брокер на репрезентативной рабочей нагрузке (т. е. как можно ближе к реальным сообщениям) и на фактической настройке хранилища, которая будет использоваться в ПРОМе. Это сделано для того, чтобы понять, как система будет вести себя в реальности.


JMS API

Прежде чем мы перейдем к деталям того, как ActiveMQ обменивается сообщениями с клиентами, нам сначала нужно изучить API JMS. API определяет набор программных интерфейсов, используемых клиентским кодом:

ConnectionFactory

Это интерфейс верхнего уровня, используемый для установления соединений с брокером. В типичном приложении обмена сообщениями существует единственный экземпляр этого интерфейса. В ActiveMQ — это ActiveMQConnectionFactory. На верхнем уровне эта конструкция сообщает местонахождение брокера сообщений, вместе с низкоуровневыми деталями того, как следует взаимодействовать с ним. Как следует из названия, ConnectionFactory — это механизм, с помощью которого создаются объекты Connection.

Connection

Это долгоживущий объект, который грубо похож на TCP-соединение — после создания он обычно существует в течение всего жизненного цикла приложения до его закрытия. Connection — потокобезопасный и может работать с несколькими потоками одновременно. Объекты Connection позволяют создавать объекты Session.

Session

Это дескриптор потока при взаимодействии с брокером. Объекты Session не являются потокобезопасными, что означает, что они не могут быть доступны нескольким потокам одновременно. Session — это основной транзакционный дескриптор, с помощью которого программист может закоммитить и откатить (rollback) операции обмена сообщениями, если он работает в транзакционном режиме. Используя этот объект, вы создаете объекты Message, MessageConsumer и MessageProducer, а также получаете указатели (дескрипторы) на объекты Topic и Queue.

MessageProducer

Этот интерфейс позволяет отправлять сообщение адресату.

MessageConsumer

Этот интерфейс позволяет разработчику получать сообщения. Существует два механизма извлечения сообщения:


Регистрация MessageListener. Это реализованный вами интерфейс обработчика сообщений, который будет последовательно обрабатывать любые сообщения, выдаваемые брокером, используя один поток.
Опрос (polling) на наличие сообщений с помощью метода receive ().

Message

Это, вероятно, самая важная структура, поскольку она переносит ваши данные. Сообщения в JMS состоят из двух аспектов:


Метаданные сообщения. Сообщение содержит заголовки и свойства. И то, и то может рассматриваться, как элементы мапы. Заголовки — это хорошо известные элементы, определенные спецификацией JMS и доступные напрямую через API, такие как JMSDestination и JMSTimestamp. Свойства — это произвольные фрагменты информации о сообщении, которые задаются для упрощения обработки или маршрутизации сообщений без необходимости считывания самого пейлоада сообщения. Вы можете, например, задать заголовок AccountID или OrderType.
Тело сообщения. Из Session может быть создано несколько различных типов сообщений в зависимости от типа содержимого, которое будет отправлено в теле, наиболее распространенными из которых являются TextMessage для строк и BytesMessage для двоичных данных.


Как работают очереди: история о двух мозгах

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


Отправка сообщений в очередь

Давайте рассмотрим взаимодействие, которое происходит при отправке сообщения. Figure 2-3 показывает нам упрощенную модель процесса, с помощью которого сообщения принимаются брокером. Он не полностью соответствует поведению в каждом случае, но вполне подходит, чтобы получить базовое понимание.


Figure 2-3. Отправка сообщений в JMS

В клиентском приложении поток получает указатель на MessageProducer. Он создает Message с предполагаемым пейлоадом сообщения и вызывает MessageProducer.send («orders», message), при этом конечным адресатом сообщения является очередь. Поскольку программист не хочет потерять сообщение, если бы сломался брокер, то заголовок сообщенияJMSDeliveryMode был установлен в значение PERSISTENT (поведение по умолчанию).

На этом этапе (1) отправляющий поток вызывает клиентскую библиотеку и маршализирует сообщение в формат OpenWire. Затем сообщение отправляется брокеру.

В брокере, принимающий поток снимает сообщение с линии и анмаршаллит его во внутренний объект. Затем объект-сообщение передается персистенс-адаптеру, который маршализирует сообщение, используя формат Google Protocol Buffers, и записывает его в хранилище (2).
После записи сообщения в хранилище персистенс-адаптер должен получить подтверждение того, что сообщение действительно было записано (3). Это, как правило, самая медленная часть всего взаимодействия; подробнее об этом позже.

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

Это ожидание подтверждения персистентных сообщений является базой гарантии, предоставляемой JMS API — если вы хотите, чтобы сообщение было сохранено, для вас, вероятно, также важно, было ли сообщение принято брокером в первую очередь. Существует ряд причин, по которым это может оказаться невозможным, например, достигнут предел памяти или диска. Вместо сбоя, брокер либо приостанавливает операцию отправки, заставляя продюсер ждать, пока не появится достаточно системных ресурсов для обработки сообщения (процесс называется Producer Flow Control), либо он отправит негативное подтверждение продюсеру, бросая исключение. Точное поведение настраивается для каждого брокера.

В этой простой операции происходит значительное количество взаимодействий ввода-вывода: две сетевые операции между продюсером и брокером, одна операция сохранения и шаг подтверждения. Операция сохранения может быть про
Wickr me - приватный мессенджер (описание и настройка) | Яндекс Дзен
Facebook - Log In or Sign Up
Понимание брокеров сообщений. Изучение механики обмена... / Хабр
[INC ] Message Stocks | Dev-CS.ru
Salesforce Developers
Washingtondc Backpage Com
Backpage Western Il
Erotic Massage Palm Springs
Incall Massages
1)/imessage-effects-ios10-5985f33c03f4020010497389.jpg" width="550" alt="Incall Massages" title="Incall Massages">

Report Page