История с компрессией сообщений


#1

смотрите что получается

Вводная раз

сообщения через RMQ - это строки
протоколом описываются 2 свойства - ТипКонтента, КодировкаКонтента

Тип контента: XML, JSON
Кодировка: UTF-8, CP1251

НО - согласно протоколу, в принципе в сообщении может быть бинарные данные (base64)

Вводная два

RabbitMQ очень любит маленькие сообщения, хотя он еще любит разные другие параметры (no-ack) и т.д.

https://www.rabbitmq.com/blog/2012/04/25/rabbitmq-performance-measurements-part-2/

Вводная три

Большинство 1С специалистов не любят события, а любят большие объекты, и желательно со ссылками на другие объекты - то есть большие XML


У питонистов есть библиотека Kombu (https://kombu.readthedocs.io/en/latest/userguide/producers.html#reference)

Она имеет хитрый параметр при отправке compression - то есть сжимать ли сообщение

Как он работает - он добавляет пользовательский (не протокольный заголовок)

headers: compression: application/x-gzip

Чтобы потом самому его обработать… То есть это клиентская логика, а не логика протокола AMQP

Мы можем реализовать подобное же поведение - то есть

ОтправитьСообщение(..., Сжимать = Истина)

Тогда метод ПолучитьСообщение() будет анализировать такой заголовок и разжимать сообщение на стороне компоненты

Плюсы

  • сократиться объем трафика - RMQ будет передавать быстрей сообщения
  • мы сможем из коробки работать с python и Django с учетом их особенностей

Минусы

  • если Ваши получатели написаны на PHP. C#, ruby, etc им придется чуть дописать логику своего подписчика чтобы поддерживать указанный заголовок

P.S. 1С-2-1С допиливать не придется… Подумываю даже добавить метод Клиент.ВключитьСжатиеДляВсехСообщений(Истина);

желающие обсудить - прошу в коменты


#2

Можно по умолчанию сделать Ложь :slight_smile: Тогда старое не отвалится, а там, где нужно/можно - можно будет включать на уровне прикладной логики


#3

Дело хорошее, по умолчанию конечно лучше чтобы было выключено


#4

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


#5

В качестве идеи на подумать: на уровне YRMQ можно предусмотреть параметр сжатия на уровне Exchange и Consumer. И тогда публикация и чтение автоматически жмутся и разжимаются. Этакий концепт “Сжатый канал”.