YandexMQ: простые очереди сообщений в облаке

17.11.25

Интеграция - WEB-интеграция

Очереди сообщений – это инструмент обмена данными между системами. На примере Yandex Message Queue разбираем, как брокер от Яндекс.Облака помогает решать практические задачи. Даем бесплатную библиотеку для 1С, которая упрощает работу с YandexMQ и другими SQS-сервисами.

 

Перфокарты и патчи

 

 

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

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

Теперь представьте, что вы написали какую-то программу на этом кусочке картона и вдруг ошиблись. Что же вам делать?

Если для исправления ошибки нужно пробить дырку там, где ее нет, это было просто – вы ее пробивали. А что делать, если уже пробитую дырку нужно исправить? Конечно, можно было взять новую карточку и все заново на ней набить, но была вероятность допустить ошибку снова. Как быть?

Лейкопластырь! Чтобы быстро все исправить, там, где дырка была не нужна, ее просто заклеивали лейкопластырем.

 

 

Это фотография, на которой на реальной перфоленте дырки были заклеены лейкопластырем. Вот таким нехитрым образом в прошлом вносились быстрые исправления в программы.

На английском слово «заплатка» или «пластырь» называется patch (патч). Слова «патч», «патчить», «поставить заплатку» в значении «вносить исправление в программу» произошли как раз вот отсюда, от заклеенных дырок на перфокартах.

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

Вы наверняка не хотите читать про какие-то древние технологии, а хотите узнать что-то более современное. Моя задача – простыми словами, без сложных технических терминов объяснить идею брокеров сообщений, заинтересовать вас попробовать один из них и дать все необходимые для этого материалы. Эта статья готовилась для новичков: в ней сначала будет немного теории, потом чуть-чуть про брокер от Яндекса – как его попробовать и почему им может быть так же просто пользоваться, как заклеивать дырки на перфокартах.

 

Что такое брокер сообщений?

 

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

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

 

 

Брокер сообщений – это программа-посредник, которую мы можем поставить между двумя системами. Обмениваться сообщениями они начнут не друг с другом напрямую, а через этого посредника.

 

 

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

 

Аналогия с мессенджерами и асинхронной коммуникацией

 

 

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

 

 

Как вы думаете, почему многие люди сегодня действительно предпочитают вместо звонков сообщения? Если у них спросить, почему, обычно они отвечают, что звонки требуют достаточно много сил, времени и внимания. И требуют они его прямо сейчас.

 

 

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

 

 

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

Если мне будут звонить целый день, я все свои другие дела не смогу сделать – я буду просто трепаться целый день.

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

 

 

Чтобы решить эти задачи, мы поставим между нами мессенджер – посредника, брокера. Например, WhatsApp или Telegram. Вместо звонка вы будете мне просто туда писать. Мессенджер будет доступен всегда. Сообщение для меня не потеряется. Даже если я сейчас сплю, я прочитаю его тогда, когда проснусь. Вам не нужно меня ждать, а мне не нужно реагировать на ваше сообщение немедленно.

 

 

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

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

 

Применение брокера сообщений в интеграции систем

 

 

 

Допустим, у нас есть какая-то база 1С и какой-то другой сервер, например, сайт с заказами. Сайт шлет заказы в 1С – все просто и понятно.

Но что, если 1С вдруг отключится – например, уйдет на обновление на пару часов? Очень типовой сценарий, так часто бывает. В этом случае сайт будет либо падать с ошибками, либо будет занят постоянными попытками отправить заказы в 1С. Он будет тратить свои ресурсы на эти попытки отправки, либо администраторы сайта будут недовольны тем, что сыплются ошибки, либо они просто отключат повторные отправки – и тогда заказы для 1С потеряются.

 

 

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

 

 

Теперь представьте, что бизнес у нас вырос, и количество заказов увеличилось кратно. Сайт начинает «долбить» нашу 1С заказами. Заказов становится настолько много, что 1С просто перестает с ними справляться. Ее ресурсов и пропускной способности не хватает на такой объем. Скорее всего, она начнет тормозить, что затронет работу других пользователей в ней. В ней же работают еще финансисты, бухгалтеры, менеджеры, она осуществляет не только прием заказов. То есть большой объем обработки информации от сайта может начать тормозить остальные части системы.

 

 

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

 

 

Снова поставим между 1С и информационной системой посредника. Описанные выше проблемы будут решены: все системы будут ходить в посредника, а 1С будет забирать оттуда данные в том темпе, в котором ей удобно.

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

О брокерах можно думать, как о некоем to do list – списке дел, который можно сделать потом. Лично мне больше нравится пример раковины с посудой. Вы можете в эту раковину положить грязную посуду, а помыть ее когда-нибудь попозже, а не сразу, и не всю.

 

Обзор существующих брокеров сообщений

 

Идея брокеров сообщений не нова, их достаточно много на рынке: Kafka, RabbitMQ, Redis, Amazon SQS, ActiveMQ и другие. Каждый из них хорош в чем-то своем, каждый делает какие-то вещи лучше, какие-то хуже.

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

Какие-то брокеры используют сложные форматы и протоколы обмена, стремясь оптимизировать скорость сетевых обменов; какие-то обмениваются по очень простым и понятным протоколам, например, по HTTP.

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

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

 

Yandex Message Queue (YMQ)

 

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

На российском рынке есть такой провайдер облачных услуг – Яндекс.Облако или Yandex Cloud. В этом облаке есть свой брокер сообщений, он называется Yandex Message Queue, покороче – YandexMQ, или совсем коротко – YMQ.

Если дистрибутивы других брокеров, вроде RabbitMQ и Kafka, вы можете скачать и установить самостоятельно на свой компьютер, то с YandexMQ так не получится. YandexMQ работает только на серверах Яндекса.

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

В этом есть и плюс. Вам не нужно заниматься установкой и обслуживанием этого брокера. Достаточно зарегистрироваться в Яндекс.Облаке – и брокером уже можно пользоваться. Сразу после регистрации вы сможете управлять вашими очередями в веб-интерфейсе.

 

 

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

Графический интерфейс – это удобно. Обычно управлять всякими сложными консольными командами бывает не так приятно.

 

 

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

 

Особенности Yandex MQ

 

Во-первых, сообщение может быть любой строкой. Только вам, как разработчику, решать – будет это JSON, XML, YAML или обычный текст. Это зависит только от вас.

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

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

Важная особенность, на мой взгляд, – это работа по протоколу HTTP. Если, допустим, для работы с RabbitMQ вам необходимы внешние компоненты для 1С, то Yandex MQ будет работать по знакомому всем разработчикам простому и понятному протоколу HTTP.

Yandex MQ не изобретал собственный протокол – он использует стандарт веб-сервисов компании Amazon: Amazon SQS (Simple Queue Service). Это означает, что если у вас есть инструменты для работы с Amazon SQS, вы можете использовать их и для Yandex MQ.

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

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

Второй тип очередей – упорядоченные, они называются FIFO и подходят в том случае, когда необходимо организовать обработку сообщений строго последовательно, друг за другом. Пока одно сообщение не будет обработано, следующее в обработку отдаваться не будет.

У очередей есть три базовые операции, на них приходится 80% работы:

  • отправка сообщения в брокер. Здесь все просто и понятно – как если бы вы написали кому-то в мессенджер. Мессенджер просто сохраняет это сообщение.

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

  • удаление сообщения. Мы говорим брокеру: «Мы обработали это сообщение, оно больше не нужно – пожалуйста, удали его и никому больше не отдавай».

 

 

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

 

Преимущества и недостатки облачного решения

 

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

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

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

Третий недостаток – я бы отметил относительно медленную передачу данных. Data-центры облачных провайдеров обычно находятся далеко от ваших серверов. И сетевой обмен, да еще и по протоколу HTTP, может быть медленнее, чем если бы брокер стоял в контуре вашей компании. Если скорость сетевых обменов и передача сообщений для вас критически важна, облачное решение с этим брокером вам, скорее всего, не подойдет.

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

 

 

Когда мы рассматривали схему обмена, мог возникнуть вполне закономерный вопрос: «А если сам брокер упадет? Что делать?» Естественно, в этом случае у нас вся система обмена ломалась напрочь.

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

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

Третье преимущество – этот брокер интегрируется с другими сервисами Yandex Cloud.

Платформа 1С, как вы знаете, называется «платформой», потому что это набор строительных элементов, кубиков, по-разному складывая которые, мы можем делать решения для наших задач. Yandex Cloud – это такая же платформа, в ней тоже есть набор разных сервисов. YandexMQ только один из них. И все они умеют дружить друг с другом. Один из примеров – мониторинги, про которые я упоминал выше. Есть еще подписки на события, сервис уведомлений, который можно настроить на работу с очередями и так далее.

 

Практические примеры использования Yandex MQ

 

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

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

Еще у нас есть множество микросервисов, написанных на C++ и Python. Они очень активно общаются между собой именно с помощью очередей.

 

Как начать использовать YandexMQ

 

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

YandexMQ – это программа, которую вы можете взять в аренду у Яндекс.Облака. Аренда обычно платная, но здесь есть приятные новости. У Яндекс.Облака есть так называемый Free Tier. Каждый месяц первые 100 000 запросов в очереди и первые 100 гигабайт исходящего трафика будут бесплатными. Это означает, что можно использовать этот брокер для небольших проектов или для каких-то экспериментов совершенно бесплатно.

Как из 1С можно работать с этим брокером? Это пример использования библиотеки:

// для работы с ЯндексMQ обязательно требуются AccessKey и SecretKey.
// Это своеобразные логин и пароль для доступа к сервису.
// как их получить описано на https://yandex.cloud/ru/docs/iam/operations/sa/create-access-key

// создаем клиент для обращения к сервису
ПараметрыКлиента = Новый Структура;
ПараметрыКлиента.Вставить( "AccessKey", "YC2Gyh6..." );
ПараметрыКлиента.Вставить( "SecretKey", "YC2Jnb2..." );
ЯндексMQ  = Обработки.ЯндексMQ2.НовыйКлиент( ПараметрыКлиента );

// создадим новую очередь
Запрос = Новый Структура;
Запрос.Вставить( "QueueName", "my-tasks" );
UrlОчереди = ЯндексMQ.СоздатьОчередь( Запрос );

// отправим сообщение в очередь
Запрос = Новый Структура;
Запрос.Вставить( "QueueUrl", UrlОчереди );
Запрос.Вставить( "MessageBody", "Hello, world!" );
ЯндексMQ.ОтправитьСообщение( Запрос );

// получим сообщения из очереди
Запрос = Новый Структура;
Запрос.Вставить( "QueueUrl", UrlОчереди );
Сообщения = ЯндексMQ.ПолучитьСообщение( Запрос );

// обработаем все полученные сообщения
Для Каждого ДанныеСообщения Из Сообщения Цикл
    // КакТоОбработать( ДанныеСообщения.Body );
    // успешно обработанные - удалим из очереди
    Запрос = Новый Структура;
    Запрос.Вставить( "QueueUrl", UrlОчереди );
    Запрос.Вставить( "ReceiptHandle", ДанныеСообщения.ReceiptHandle );
    ЯндексMQ.УдалитьСообщение( Запрос );
КонецЦикла;

 

Библиотека доступна на GitHub, она бесплатная, с открытым кодом – вы можете брать ее и пользоваться. Ее задача – упростить вам работу с брокером, чтобы вы сами не писали интеграцию, а сразу начали решать прикладные задачи.

 

 

Заключение

 

Надеюсь, вы узнали для себя что-то полезное про работу брокеров сообщений. Обычно их начинают использовать тогда, когда нагрузка на системы кратно вырастает. Если вам интересно попробовать, оставляю ссылку на библиотеку для работы с YandexMQ из 1С:

https://github.com/leemuar/yandexmq-sdk-1c

Компания Amazon, когда делала свой брокер сообщений SQS, назвала его Simple Queue Service – «простой сервис очередей». И слово «простой» здесь ключевое. Идея простоты лежит и в основе брокера YandexMQ. Вам не нужно тратить время на установку и обслуживание этого брокера, не нужно разбираться в сложных сервисах, трансформации, модификации сообщений. Протокол HTTP нам, разработчикам 1С, знаком и понятен.

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

 

*************

Статья написана по итогам доклада (видео), прочитанного на конференции INFOSTART TECH EVENT.

Вступайте в нашу телеграмм-группу Инфостарт

YandexMQ YMQ ЯндексMQ Message Queue

См. также

Сайты и интернет-магазины WEB-интеграция Системный администратор Программист Пользователь 1С:Предприятие 8 1C:Бухгалтерия 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM / LOGICSTARS. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM / LOGICSTAR разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    22425    32    24    

26

SALE! 15%

WEB-интеграция Программист Бизнес-аналитик 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Оптовая торговля, дистрибуция, логистика ИТ-компания Платные (руб)

Модуль "Экспортер" — это расширение для 1С, предназначенное для автоматизации процессов выгрузки данных. Оно позволяет эффективно извлекать, преобразовывать и передавать данные из систем 1С в интеграционную платформу Spot2D. Подсистема упрощает настройку, снижает количество ручных операций и обеспечивает удобный контроль данных.

17280 14688 руб.

20.12.2024    4610    22    4    

23

WEB-интеграция Программист Руководитель проекта 1С:Предприятие 8 1C:Бухгалтерия 1С:Франчайзи, автоматизация бизнеса Платные (руб)

Расширение значительно упрощает написание API на 1С. Веб программисты получают простой и понятный доступ к 1С. Описание API создаётся автоматически и представляется в виде удобном как для человека, так и для программной обработки. Основные преимущества: 1. Документация API создаётся автоматически. Удобна для программной обработки. 2. Изменить API столь же просто как настроить отчёт. Можно опубликовать существующий вариант отчёта. 3. Отчёты в API поддерживают параметры (Период, ДатаНачала и др.) 4. При создании простых методов не требуется изменять конфигурацию. 5. Поддерживается работа с планами обмена.<br/> 6. Возможно настроить отправку из 1С данных корреспондирующей системе, для случаев когда 1С сама "знает" какие данные нужно отправить. 7. После записи в 1С Ле Мурр может возвращать соответствие полученных идентификаторов созданным в 1С объектам данных.

36000 руб.

27.09.2024    10709    7    5    

11

WEB-интеграция Программист 1С:Предприятие 8 1С:Бухгалтерия 3.0 Бытовые услуги, сервис Платные (руб)

Внешняя обработка разработана для автоматизации передачи данных между сервисом Vetmanager с 1С: Бухгалтерия 3.0. Решение позволяет загружать документы и справочники из Ветменеджер в 1С:Бухгалтерию, сокращая время на ручной ввод данных и минимизируя ошибки.

12000 руб.

02.02.2021    21162    61    52    

39

WEB-интеграция Анализ продаж Системный администратор Программист Пользователь 1С:Предприятие 8 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Управленческий учет Платные (руб)

Модуль "Подсистема интеграции AmoCRM с 1С" позволяет обеспечить единое информационное пространство, в котором пользователи могут эффективно управлять клиентской базой, следить за статусами сделок и поддерживать актуальность данных как в AmoCRM, так и в 1С.

60000 руб.

07.05.2019    39898    74    45    

31
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. akR00b 25 18.11.25 08:50 Сейчас в теме
Спасибо за статью и инструменты, приятно было освежить знания по брокеру и получить конкретный пример использования и назначения. Однозначно + .
2. akR00b 25 18.11.25 10:15 Сейчас в теме
дополню, возможно сообщения в очереди не будут отдаваться, так как создается очередь my-tasks и у нее по умолчанию Время ожидания при получении сообщений будет стоять 0.
3. leemuar 50 18.11.25 11:55 Сейчас в теме
(2) да, это особенность распределенной архитектуры. Вы с этим столкнетесь если у вас очень мало сообщений в очереди (меньше 1000). Это действительно может сбивать с толку поначалу: мы точно знаем что положили сообщение в очередь, а оно нам его не отдает почему-то. Тут просто нужно понимать как и почему оно так работает.

Такие сервисы очередей - и Amazon SQS и ЯндексMQ - они распределенные. Это значит, что они работают не на одном сервере, а на нескольких (десятках, сотнях, тысячах) серверов, которые еще и географически распределены - стоят в разных городах и дата-центрах. Когда вы отправляете сообщение - оно сохраняется не на одном, а на нескольких серверах. Все это делается для надежности - если какой-то сервер или дата-центр выйдет из строя - вы не потеряете свои данные, копии хранятся на других серверах.

Раз данные хранятся на разных серверах (шардах) и в разных дата-центрах, чтобы ТОЧНО получить сообщения - нужно опросить ВСЕ эти места. "Эй, сервер в Калуге, у тебя есть сообщения? Неа. Эй, шард в Делавере, у тебя есть? Неа. Эй, Мянтясяла, есть? Есть, вот". Вот этот вот опрос ВСЕХ серверов в терминах SQS называется LONG POLLING, и он вообще долгий по времени (относительно). Поэтому по-умолчанию применяется специальная оптимизация - SHORT POLLING.

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

SHORT POLLING работает когда параметр WaitTimeSeconds равен 0. LONG POLLING - когда этот параметр больше 0. WaitTimeSeconds можно устанавливать как в настройках самой очереди, так и передавать в запросах RecieveMessage

Подробнее про это можно почитать в документации Amazon SQS, SQS Developer's Guide и документации ЯндексMQ

У Long Polling есть еще одно применение - оптимизация количества запросов для маленьких очередей, где часто возможна пустая очередь. Например, у вас есть какой-то обработчик сообщений очереди. Он запускается периодически, забирает сообщения, обрабатывает их. Short Polling может давать ложно-пустые ответы, поэтому запрос нужно будет в след раз повторить. А за каждый запрос в сервис мы вообще платим. Чтобы не получать ложно-пустые ответы и уменьшить количество запросов к сервису (чтобы не платить за них), можно использовать Long Polling для такого сценария:

"Эй, очередь, дай мне сообщения. Если сообщений сейчас нет - подожди хотя бы 30 секунд пока они не появятся. Только если за эти 30 секунд не появилось сообщений - только тогда отдай мне пустой ответ"
Прикрепленные файлы:
MaiorovYury; akR00b; +2 Ответить
5. akR00b 25 18.11.25 13:39 Сейчас в теме
(3) спасибо за ликбез, очень полезно.

Посмотрел и по тестировал методы ЯндексMQ.ОтправитьСообщение и ЯндексMQ.ОтправитьНесколькоСообщений
все отлично, а для получения сразу нескольких сообщений? Точнее всех в одной очереди или порционно?
7. leemuar 50 18.11.25 15:00 Сейчас в теме
(5) в методе RecieveMessage/ПолучитьСообщение передайте параметр MaxNumberOfMessages, возможные значения - от 1 до 10. Значение по-умолчанию - 1. Больше 10 за один запрос вернуть нельзя.
14. akR00b 25 19.11.25 08:03 Сейчас в теме
(7)
RecieveMessage

спасибо, внимательно изучил описание к методу. Почему-то по 2 только возвращает.

&НаСервере
Процедура ПолучитьСообщениеНаСервере() 
	ЯндексMQ = ПолучитьКлиентаМК(); 
	URLОчереди = Объект.URLочереди;
	// получим сообщения из очереди
	Запрос = Новый Структура;
	Запрос.Вставить( "QueueUrl", UrlОчереди );   
	Запрос.Вставить( "MaxNumberOfMessages",5);

	Сообщения = ЯндексMQ.ПолучитьСообщение( Запрос );
	
	// обработаем все полученные сообщения    
	
	Для Каждого ДанныеСообщения Из Сообщения Цикл
		Сообщить(ДанныеСообщения.Body);
		Запрос = Новый Структура;
		Запрос.Вставить( "QueueUrl", UrlОчереди );
		Запрос.Вставить( "ReceiptHandle", ДанныеСообщения.ReceiptHandle );   
		ЯндексMQ.УдалитьСообщение( Запрос );
	КонецЦикла;       
КонецПроцедуры
Показать
15. leemuar 50 19.11.25 10:36 Сейчас в теме
(14) long polling задействуйте, мы выше его обсуждали. Передайте параметр WaitTimeSeconds в методе ПолучитьСообщение

Запрос = Новый Структура;
Запрос.Вставить( "QueueUrl", UrlОчереди );   
Запрос.Вставить( "MaxNumberOfMessages", 5);
// включаем long polling, сервеу разрешено собирать сообщения со всех шардов ДО 20 секунд
Запрос.Вставить( "WaitTimeSeconds", 20);

Сообщения = ЯндексMQ.ПолучитьСообщение( Запрос );
Показать
17. akR00b 25 20.11.25 08:53 Сейчас в теме
4. baracuda 2 18.11.25 12:42 Сейчас в теме
Одна только просьба, уважаемый яндекс пеерсмотрите свои тарифы в сторону удешевления.
Предлагаю взять зарубежные аналоги, сконвертировать валюту в рубли и выставить аналогичный ценник.
Сейчас же ваши ценники на 30-40% дороже аналогов.
Внимание а за что оверпрайс? За то что вы в России?
Ну так RabbitMQ можно и на своем сервере поднять и будет дешевле.
6. leemuar 50 18.11.25 14:57 Сейчас в теме
(4) стоимость облачных сервисов - предмет давнего холивара.

Тут нужно считать что вам выгоднее, универсального ответа нет. Для маленьких проектов Free Tier обычно хватает. Если выходите за лимиты free tier - надо считать что вам нужно и что выгоднее. В каких-то сценариях облака и правда могут быть не выгодны, выгоднее держать свои сервера и их обслуживать самостоятельно. НО в каких-то - обычно при огромной нагрузке - арендовать сервисы облаков бывает проще и дешевле, чем нанимать команду под это. Часто в облака приходят когда нагрузка становится такая и риски вырастают настолько, что обслуживать их собственными силами бывает не выгодно. Нужно считать в каждом конкретном случае

Брокеров действительно много разных. Кстати, YMQ построен на базе YDB - а это бесплатная база данных с открытым кодом. Можете ее взять и сделать свою распределенную базу данных
MaiorovYury; baracuda; +2 Ответить
8. baracuda 2 18.11.25 15:06 Сейчас в теме
(6) спасибо что подробно пояснили) теперь есть понимание когда нужны облака.
9. leemuar 50 18.11.25 16:14 Сейчас в теме
(8) Облака - это просто аренда, аренда вычислительных ресурсов (и обслуживающих их людей)

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

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

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

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

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

Еще раз напоминаю про Free Tier. Это такая штука в облаках, которая позволяет использовать бесплатно сервисы облаков до определенного объема. Для ЯндексMQ это 100000 запросов в месяц. У Amazon вроде 1 000 000 в месяц. Я считаю что для небольших проектов этого более чем достаточно. И это удобно - не надо ничего устанавливать, все сделали за тебя, бери и пользуйся.

А вот когда проект вырастает, становятся важны "надежность" и "доступность", риски всяких поломок начинают стоить бизнесу очень дорого - там да, надо думать как быть дальше: арендовать дальше за денежку или делать своими силами. Но и то и то - затраты, просто нужно посчитать что выгоднее для вашего случая
MaiorovYury; +1 Ответить
10. baracuda 2 18.11.25 16:30 Сейчас в теме
(9) Это не отменяет того факта что при прочих равных сервисы Яндекса не должны стоять дороже аналогов.
Говорю это не из вредности, а потому что не понимаю, как тогда они собираются выигрывать в конкурентной борьбе.
MaiorovYury; +1 Ответить
11. starik-2005 3200 18.11.25 17:12 Сейчас в теме
(9)
Облака - это просто аренда
А я думал, что облака - это не просто аренда, а это масштабирование. Три юзера - арендуешь на три копья, триста юзеров - на тыщу, мульон - на соточку тыщ...
12. leemuar 50 18.11.25 18:25 Сейчас в теме
(11) конечно, и это тоже! Аналогия про такси обычно помогает тем, кто еще не очень хорошо представляет что за облака такие и с какой стороны к ним подходить. Вы явно не из таких, вы уже мыслите другими стратегиями :)
13. starik-2005 3200 18.11.25 18:49 Сейчас в теме
(12)
мыслите другими стратегиями
Стратегиями обычно не мыслят - их вырабатывают, а потом придерживаются. Мыслят категориями. Но может кто и стратегиями мыслят - мне это непонятно. Ну или может быть имелось ввиду "мыслить стратегически". Наверное это как-то может охарактеризовать желание "оперировать костами" в рамках нагрузки.
16. webester 26 20.11.25 05:29 Сейчас в теме
(8)
Прикрепленные файлы:
18. leemuar 50 21.11.25 14:39 Сейчас в теме
(16)
Прикрепленные файлы:
19. akR00b 25 02.12.25 08:17 Сейчас в теме
Вопрос, тогда как грамотно организовать чтение очереди? допустим у нас 100 сообщений, их необходимо прочитать с разных устройств, порция принимает только 10 сообщений, получать количество сообщений для обработки? заранее спасибо за рекомендации.
20. leemuar 50 02.12.25 12:15 Сейчас в теме
(19) смотря что вы подразумеваете под "грамотно". Все зависит от вашей задачи. Для стандартных очередей (где порядок не важен, сообщения независимы друг от друга) - получайте в цикле по 10 сообщений до тех пор пока сообщения не закончатся или не достигнете лимита количества циклов

Если бизнес-логика допускает параллельную обработку очереди (например, не будет блокировок в СУБД) - запускайте в несколько потоков обработку


// сколько максимум циклов получения и обработки сообщения разрешено за запуск обработки
ОграничениеЦиклов = 100;
// сколько всего циклов получения сообщений прошло
СчетчикЦиклов = 0;

Пока СчетчикЦиклов <= ОграничениеЦиклов Цикл

    СчетчикЦиклов = СчетчикЦиклов + 1; 

    // получаем сообщения для обработки
    Сообщения = Клиент.ПолучитьСообщение();

    // если больше сообщений нет - прервем обработку
    Если НЕ ЗначениеЗаполнено( Сообщения ) Тогда
        Прервать;
    КонецЕсли;

    // обработаем сообщения и получим те, которые обработаны успешно
    Успешные = ОбработатьСообщения( Сообщения );

    // сообщим очереди какие мы обработали успешно
    Клиент.УдалитьНесколькоСообщений( НовыеПараметрыУдаления( Успешные ) );

КонецЦикла;

Показать
21. akR00b 25 02.12.25 13:35 Сейчас в теме
22. akR00b 25 03.12.25 08:57 Сейчас в теме
А у Вас бывает такое что когда Запрос.Вставить( "MaxNumberOfMessages",10); он все равно по 2 или 1 забирает сообщению? Просто как то раз на раз, один день нормально по 10, на другой день 1-2 сообщения за один подход.
23. leemuar 50 03.12.25 10:09 Сейчас в теме
(22) покажите ваш код, как часто он запускается и сколько сообщений в очереди бывает? Long Polling используете?
24. akR00b 25 03.12.25 10:45 Сейчас в теме
(23)
&НаСервере
Процедура ПолучитьСообщениеНаСервере()   
	
	ЯндексMQ = ПолучитьКлиентаМК(); 
	URLОчереди = Объект.URLочереди;
	// получим сообщения из очереди
	Запрос = Новый Структура;
	Запрос.Вставить( "QueueUrl", UrlОчереди );   
	Запрос.Вставить( "MaxNumberOfMessages",10);

	Сообщения = ЯндексMQ.ПолучитьСообщение( Запрос );
	
	// обработаем все полученные сообщения    
	
	Для Каждого ДанныеСообщения Из Сообщения Цикл
		ТекЗнач = ЗначениеИзСтрокиВнутр(ДанныеСообщения.Body);
		Сообщить(ДанныеСообщения.MessageId);
	КонецЦикла;       
	
КонецПроцедуры
Показать


Как часто? Ну пока по кнопке нажимаю, может 2-3 раза подряд порции читаю, бывает 1 сообщение придет бывает 2, а всего в очереди 4.
Прикрепленные файлы:
25. leemuar 50 03.12.25 10:53 Сейчас в теме
(24) в этом коде не используется Long Polling, мы его выше с вами обсуждали. Добавьте параметр WaitTimeSeconds к запросу:

&НаСервере
Процедура ПолучитьСообщениеНаСервере()   
    
    ЯндексMQ = ПолучитьКлиентаМК(); 
    URLОчереди = Объект.URLочереди;
    // получим сообщения из очереди
    Запрос = Новый Структура;
    Запрос.Вставить( "QueueUrl", UrlОчереди );   
    Запрос.Вставить( "MaxNumberOfMessages",10);
    // включаем long polling, серверу разрешено собирать сообщения со всех шардов ДО 20 секунд
    Запрос.Вставить( "WaitTimeSeconds", 20);

    Сообщения = ЯндексMQ.ПолучитьСообщение( Запрос );
    
    // обработаем все полученные сообщения    
    
    Для Каждого ДанныеСообщения Из Сообщения Цикл
        ТекЗнач = ЗначениеИзСтрокиВнутр(ДанныеСообщения.Body);
        Сообщить(ДанныеСообщения.MessageId);
    КонецЦикла;       
    
КонецПроцедуры
Показать
26. akR00b 25 03.12.25 11:00 Сейчас в теме
(25)
Запрос.Вставить( "WaitTimeSeconds", 20);
я пробовал с ним, возвращает неопределено. через ЯндексMQ.ПолучитьСообщениеОтвет( Запрос ); кодсостония = 400. Пытаюсь осознать что не так)
27. leemuar 50 03.12.25 11:45 Сейчас в теме
(26) Попробуйте так, в переменной ТекстОшибки будет тело http ответа от сервиса

Ответ = ЯндексMQ.ПолучитьСообщениеОтвет( Запрос );
ТекстОшибки = ЯндексMQ.КакТекст(Ответ);


Пришлите сюда тест ошибки
28. akR00b 25 03.12.25 12:58 Сейчас в теме
(27)
Ответ = ЯндексMQ.ПолучитьСообщениеОтвет( Запрос );
ТекстОшибки = ЯндексMQ.КакТекст(Ответ);


{"__type":"InvalidArgumentException","message":"[json.exception.type_error.302] type must be number, but is string"}
29. leemuar 50 03.12.25 13:02 Сейчас в теме
(28) ага, понятно, это баг библиотеки. Значение параметра WaitTimeSeconds преобразуется в строку, а надо передавать число. Выпущу исправление в ближайшие дни
30. akR00b 25 03.12.25 13:15 Сейчас в теме
(29) буду ждать, спасибо
31. leemuar 50 07.12.25 21:12 Сейчас в теме
(30) выпустил обновление, попробуйте версию 2.0.1, WaitTimeSeconds теперь должен работать
32. akR00b 25 08.12.25 10:22 Сейчас в теме
(31) спасибо за обновление,

		ЯндексMQ = ПолучитьКлиентаМК(); 
	URLОчереди = Объект.URLочереди;
	// получим сообщения из очереди
	Запрос = Новый Структура;
	Запрос.Вставить( "QueueUrl", UrlОчереди );   
	Запрос.Вставить( "MaxNumberOfMessages",10);
	Запрос.Вставить( "WaitTimeSeconds",20);
	Сообщения = ЯндексMQ.ПолучитьСообщение( Запрос );    
	// обработаем все полученные сообщения    
	
	Для Каждого ДанныеСообщения Из Сообщения Цикл
		ТекЗнач = ЗначениеИзСтрокиВнутр(ДанныеСообщения.Body);
		Сообщить(ДанныеСообщения.MessageId);
		Запрос = Новый Структура;
	КонецЦикла;     
Показать
все работает, но только по 2 сообщения получает)))
33. leemuar 50 08.12.25 14:14 Сейчас в теме
(32) а сколько вы ожидаете получить? Сколько у вас в очереди сообщений? Сколько из них заблокировано (in flight)?
34. akR00b 25 08.12.25 15:33 Сейчас в теме
(33) в очереди 6, в обработке 2.
Для отправки сообщения требуется регистрация/авторизация