Рассмотрим установку RabbitMQ (программный брокер сообщений) на Windows.
Установка Erlang
Перед установкой RabbitMQ, убедитесь, что на вашем компьютере установлены Erlang и .NET Framework (обычно они уже установлены, но лучше проверить наличие обновлений).
Erlang. Загрузите установщик Erlang с официального сайта. Запустите установщик и следуйте инструкциям установки, установка очень простая – просто соглашайтесь со всеми пунктами. После установки проверьте, что Erlang правильно установлен, открыв командную строку и введите команду erl. Если Erlang успешно установлен, откроется интерактивная оболочка Erlang. Также разрешаем правила firewall Windows defender, которые срабатывают при запуске компонента.
Установка и запуск RabbitMQ
Теперь можно приступить к установке RabbitMQ. Загрузите установщик RabbitMQ с официального сайта. Запустите установщик RabbitMQ. Установка также простая, соглашаемся со всеми пунктами. Во время установки укажите путь для установки RabbitMQ и другие настройки, если требуется.
После завершения установки, можно запустить RabbitMQ и проверить его работу. Перейдите в папку, где установлен RabbitMQ, и найдите папку “sbin”. Запустите командную строку от имени администратора и перейдите в директорию. Например: C:Program FilesRabbitMQ Serverrabbitmq_server-3.12.2sbin
Выполняем команду для установки Web-плагина:
rabbitmq-plugins.bat enable rabbitmq_management
Далее запускаем последовательно команды:
rabbitmq-service.bat stop rabbitmq-service.bat install rabbitmq-service.bat start
Теперь можно заходить через веб-интерфейс, который по умолчанию работает на порту 15672. Для доступа к веб-интерфейсу откройте веб-браузер и перейдите по адресу http://localhost:15672/. Введите логин и пароль (по умолчанию “guest”/”guest”).
Теперь RabbitMQ установлен и готов к использованию.
Нужна помощь? Обслуживание и настройку RabbitMQ мы осуществляем в рамках услуги DevOps аутсорсинг.
Брокеры сообщений — это приложения-посредники, используемые в различных видах архитектуры программного обеспечения, например, в микросервисах. Брокеры пересылают информацию в виде сообщений от сервиса к сервису.
С брокерами сообщений тесно связан паттерн «publisher-subscriber», суть которого заключается в передаче некоторых событий от так называемых «издателей» (Producers) к потребителям (Consumers).
Чаще всего в реализации этого паттерна участвует промежуточное звено — тот самый брокер сообщений.
Для простоты можно провести аналогию. Представим YouTube: там есть каналы, у которых можно подписаться на уведомления. Далее происходит событие — публикация нового видео. Мы подписаны на это событие и получаем уведомление о том, что видео вышло.
cloud
Как работают приложения с брокерами сообщений?
Тут нас будут интересовать три главных термина: Exchange, Queue, Binding.
Exchange
Сюда попадают сообщения-события. Exchange решает, в какую очередь какие события попадут. Это происходит на основе связей — байндингов, о которых будет сказано далее. На схеме отметим Exchange вот таким способом:
Queue
Или просто очередь. Структура данных, получение которых построено по принципу «первый вошёл — первый вышел», или FIFO. Данные хранятся на диске или в ОЗУ и представляют непосредственно сообщения. Очередь отдает копии этих данных потребителям (consumers). Схематично изобразим:
Binding
Переводится как «привязка». Это набор правил, которые указывают Exchange, в какую из очередей должны попадать сообщения. Между Exchange и Queue может быть несколько привязок с разными параметрами.
Принцип работы
Producer — это какой-то сервис, который генерирует сообщения и посылает их брокеру. Consumer — это другой сервис, который при получении сообщения начинает его обработку. В случае той же аналогии с Ютубом, «издатель» — это сам YouTube, а «потребитель» — это ваш телефон, получающий пуш-уведомления
-
Producer отправляет сообщение, и оно попадает в Exchange.
-
Очередь хранит это сообщение — например, на диске.
-
Когда consumer готов принять сообщение (закончил обработку предыдущего или просто приложение-обработчик событий запустилось) — сервер посылает в него скопированные данные из очереди.
-
Consumer получает сообщение, затем как-то обрабатывает его и передаёт брокеру подтверждение (ACK).
-
После получения брокером подтверждения сообщение удаляется.
Это популярный open-source брокер сообщений. Он базируется на основе протокола AMQP (Advanced Message Queuing Protocol) — это открытый протокол для передачи сообщений-событий через специальный брокер. Сам протокол имеет очень много возможностей, и помимо RabbitMQ его реализует, например, Apache Qpid.
Сам «кролик» разработан на языке программирования Erlang, а его основные преимущества — пропускная способность и максимальная гибкость маршрутизации. Для «кролика» существует множество вариантов настройки правил того, какие сообщения и куда будут попадать на обработку.
Подключаемся к Рэббиту мы по протоколу TCP: клиент инициализирует подключение по адресу хоста и сохраняет соединение до тех пор, пока ему необходимо взаимодействовать с RabbitMQ. Он также поддерживает аутентификацию, например, по логину и паролю
Установка на разные ОС
RabbitMQ состоит из двух частей: сервер и WebUI (админка). В UI можно смотреть, что, собственно, происходит в нашем брокере: живы ли узлы в кластере, сколько сообщений в процессе обработки и т.д. Давайте разберёмся, как это всё устанавливать на разные ОС.
Ubuntu / Debian
Для установки Rabbit на Ubuntu или Debian есть готовая инструкция на официальном сайте. Можно просто выполнить следующий скрипт в командной строке. Разберём его подробнее:
-
Установка стандартных зависимостей
sudo apt-get update -y
sudo apt-get install curl gnupg -y
sudo apt-get install apt-transport-https
-
Добавляем ключи репозиториев
curl -1sLf "https://keys.openpgp.org/vks/v1/by-fingerprint/0A9AF2115F4687BD29803A206B73A36E6026DFCA" | sudo gpg --dearmor | sudo tee /usr/share/keyrings/com.rabbitmq.team.gpg > /dev/null
curl -1sLf https://github.com/rabbitmq/signing-keys/releases/download/3.0/cloudsmith.rabbitmq-erlang.E495BB49CC4BBE5B.key | sudo gpg --dearmor | sudo tee /usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg > /dev/null
curl -1sLf https://github.com/rabbitmq/signing-keys/releases/download/3.0/cloudsmith.rabbitmq-server.9F4587F226208342.key | sudo gpg --dearmor | sudo tee /usr/share/keyrings/rabbitmq.9F4587F226208342.gpg > /dev/null
deb [signed-by=/usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg] https://ppa1.novemberain.com/rabbitmq/rabbitmq-erlang/deb/ubuntu $distribution main
deb-src [signed-by=/usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg] https://ppa1.novemberain.com/rabbitmq/rabbitmq-erlang/deb/ubuntu $distribution main
deb [signed-by=/usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg] https://ppa2.novemberain.com/rabbitmq/rabbitmq-erlang/deb/ubuntu $distribution main
deb-src [signed-by=/usr/share/keyrings/rabbitmq.E495BB49CC4BBE5B.gpg] https://ppa2.novemberain.com/rabbitmq/rabbitmq-erlang/deb/ubuntu $distribution main
deb [signed-by=/usr/share/keyrings/rabbitmq.9F4587F226208342.gpg] https://ppa1.novemberain.com/rabbitmq/rabbitmq-server/deb/ubuntu $distribution main
deb-src [signed-by=/usr/share/keyrings/rabbitmq.9F4587F226208342.gpg] https://ppa1.novemberain.com/rabbitmq/rabbitmq-server/deb/ubuntu $distribution main
deb [signed-by=/usr/share/keyrings/rabbitmq.9F4587F226208342.gpg] https://ppa2.novemberain.com/rabbitmq/rabbitmq-server/deb/ubuntu $distribution main
deb-src [signed-by=/usr/share/keyrings/rabbitmq.9F4587F226208342.gpg] https://ppa2.novemberain.com/rabbitmq/rabbitmq-server/deb/ubuntu $distribution main
- После выполнения скрипта нам необходимо включить UI. Выполним следующие команды:
sudo rabbitmq-plugins enable rabbitmq_management
-
Добавим пользователя, под которым мы будем заходить:
sudo rabbitmqctl add_user rabbitmqadmin ваш_пароль
-
И выдадим ему все права:
sudo rabbitmqctl set_user_tags rabbitmqadmin administrator
sudo rabbitmqctl set_permissions -p / rabbitmqadmin ".*" ".*" ".*"
Теперь мы можем зайти на адрес <ваш-IP>:15672
, ввести логин и пароль и увидеть админку.
Windows
Для установки RabbitMQ на Windows также есть официальная инструкция, в которой описан процесс установки. Можно использовать Chocolatey или простой установщик. Установка этого брокера сообщений на Windows может быть полезна, например, для локальной отладки приложений. Но сначала нам необходимо установить Erlang/OTP с официального сайта Erlang.
Запустите скачанный файл и пройдите процесс установки.
После установки Erlang ставим сам Rabbit, например, через файл установки с официального сайта:
Далее включим UI:
cd 'C:\Program Files\RabbitMQ Server\rabbitmq_server-3.13.0\sbin'
./rabbitmq-plugins.bat enable rabbitmq_management
По адресу localhost:15672
и с данными для входа guest
:guest
мы можем попасть в Web UI.
Astra Linux
Astra Linux — сертифицированный российский дистрибутив Linux, основанный на Debian. Разберём, как установить RabbitMQ на эту ОС. Мы будем использовать Astra Linux CE 2.12, доступный для установки в Timeweb Cloud.
В менеджер пакетов APT уже добавлены нужные нам ключи и источники ПО, поэтому RabbitMQ можно просто поставить командой:
sudo apt install -y rabbitmq-server
Включаем плагин для Web UI:
sudo rabbitmq-plugins enable rabbitmq_management
Добавляем пользователя admin
по аналогии с Ubuntu:
sudo rabbitmqctl add_user rabbitmqadmin ваш_пароль
sudo rabbitmqctl set_user_tags rabbitmqadmin administrator
sudo rabbitmqctl set_permissions -p / rabbitmqadmin ".*" ".*" ".*"
По адресу ваш_ip:15672
будет доступна панель администратора.
Docker
Вероятно, самый простой и удобный вариант установки RabbitMQ. Мы можем поставить RabbitMQ, используя команду docker run
:
docker run --rm -p 15672:15672 rabbitmq:3.13.0-management
На порту 15672 будет доступна админка, в которой можно авторизоваться с помощью данных для входа guest
:guest
.
Однако такой вариант запуска не подходит для production-среды — докер назначает имя сервера для контейнера, а брокер сообщений хранит своё состояние в папке с этим названием. При каждой новой сборке контейнера Рэббит будет терять информацию о стейте.
С использованием docker-compose
мы сможем удобно описать все необходимые характеристики сервиса: сменить стандартные логин и пароль, примонтировать папку с состоянием и т.д. Добавим файл docker-compose.yml
(это можно сделать на вашем сервере, где установлен Docker, или на вашем ПК). Вот какое может быть содержимое у этого файла:
version: "3.3"
services:
rabbit:
image: rabbitmq:3.13.0-management
environment:
- RABBITMQ_DEFAULT_USER=admin #укажите имя пользователя
- RABBITMQ_DEFAULT_PASS=password #укажите сложный пароль
volumes:
- ./rabbit:/var/lib/rabbitmq #монтируем папку с состоянием
ports:
- 15672:15672 #открываем порт для админки
Запускаем с помощью команды:
docker compose up -d
И нам снова доступна админка.
Обзор RabbitMQ Management
Разберём основные возможности RabbitMQ и его панели администрирования. На главной странице можно посмотреть общую информацию: узлы, их состояние, общее количество сообщений и т.д.
Connections — это список подключений к кластеру:
Channels — список каналов. В рамках одного подключения можно создавать несколько каналов, через которые отправляются сообщения. Это сделано для того, чтобы не создавать множество TCP-соединений.
Exchanges
Обменники рассмотрим подробнее.
Они имеют бывают разных видов, которые отличаются механизмом правил фильтрации сообщений — на основе этих правил события попадают в конкретные очереди.
- Direct Exchange
У каждого сообщения есть некоторый ключ — так называемый ключ маршрутизации (Routing Key). Эти сообщения попадут в те очереди, где в привязке к Exchange указан такой же ключ.
Пример настройки:
Указываем RoutingKey при создании обменника:
В созданном обменнике отправляем сообщение, указав такой же RoutingKey.
- Topic Exchange
Маршрутизация по некоторому ключу-шаблону. При создании шаблона могут использоваться 0 или более слов (латинские буквы в разных регистрах и цифры), с разделителем в виде точки (например, «key.event»), а также символы #
и *
.
- Fanout Exchange
Правила отсутствуют. Каждое отправленное сообщение попадает во все очереди.
- Headers Exchange
Использует заголовки байндинга и сообщения, сравнивает пары «ключ-значение» из этих заголовков.
Очереди
В отображении конкретной очереди можно увидеть график, где отображается, сколько сообщений находится в ней, статистика по времени доставки и принятия этих сообщений. Сообщения могут быть в двух статусах: Ready — ждут обработки, Unacked — в процессе обработки консьюмером.
Реализуем Publisher-Subscriber на Python
Разберём, как использовать RabbitMQ для реализации Pub-Sub на Python. У вас должен быть установлен Python. При написании этой статьи была использована версия 3.11.5.
Мы будем использовать библиотеку Pika. Есть и другие библиотеки, например, rabbitpy или amqp-lib, но они очень давно не обновлялись.
Выберите или создайте папку, в которой будет находиться код приложения, например:
mkdir rabbitmq-article
Откройте эту папку в вашей IDE. Я использую Visual Studio Code, также можно использовать PyCharm или другие среды разработки.
Установим библиотеку Pika с помощью команды в терминале:
pip install pika
Добавим два файла: sender.py
и receiver.py
:
В файле sender.py
опишем код для Producer, который будет отправлять сообщения. Для этого нужно:
-
Создать подключение к брокеру
-
Создать новый канал с помощью этого подключения
-
Создать новый обменник
-
Создать очередь
-
Привязать очередь к обменнику
-
Выполнить функцию публикации сообщения в созданную очередь
Код sender.py
:
from pika import BlockingConnection, ConnectionParameters
from pika.exchange_type import ExchangeType
# создаём подключение, указав параметры в объекте ConnectionParameters
connection = BlockingConnection(ConnectionParameters(host='localhost'))
# создаём канал
channel = connection.channel()
# создаём обменник
channel.exchange_declare('new_exchange', ExchangeType.direct)
# определяем очередь
queue = channel.queue_declare(queue='new_queue')
# привязываем очередь к обменнику
channel.queue_bind(exchange='new_exchange', queue='new_queue', routing_key='key')
# публикуем сообщение
channel.basic_publish(exchange='new_exchange', routing_key='key', body='Hello World!')
print("Сообщение 'Hello World!' отправлено")
connection.close()
Теперь реализуем получение сообщения:
-
Добавим подключение и канал
-
Определим обменник и очередь с тем же названием, что и в файле
sender.py
-
Привяжем очередь к обменнику
-
Опишем функцию, которая будет вызываться при получении нового сообщения
-
Вызовем метод
start_consuming
для того, чтобы запустить ожидание сообщений
Код receiver.py
:
from pika import BlockingConnection, ConnectionParameters
from pika.exchange_type import ExchangeType
import sys, os
def main():
# создаём подключение
connection = BlockingConnection(ConnectionParameters(host='localhost'))
# создаём канал
channel = connection.channel()
# создаём обменник
channel.exchange_declare('new_exchange', ExchangeType.direct)
# определяем очередь
queue = channel.queue_declare(queue='new_queue')
# привязываем очередь к обменнику
channel.queue_bind(exchange='new_exchange', queue='new_queue', routing_key='key')
# функция, которая вызывается при получении сообщения
def handle(ch, method, properties, body):
print(f"Получено сообщение: {body}")
# привязываем callback-функцию и очередь
channel.basic_consume(queue='new_queue', on_message_callback=callback, auto_ack=True)
print('Ожидание сообщения. Чтобы завершить работу приложения, нажмите ctrl+c')
channel.start_consuming()
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt:
try:
sys.exit(0)
except SystemExit:
os._exit(0)
Сначала запустим receiver
:
Далее запускаем sender
:
И в терминале, где запущен receiver
, мы видим сообщение:
В RabbitMQ Management мы можем зайти в созданный обменник и увидеть привязку к очереди по Routing key:
Заключение
В этой статье мы рассмотрели, что такое брокеры сообщений, как приложения работают с ними, а также научились устанавливать и использовать брокер сообщений RabbitMQ.
RabbitMQ is a great queuing tool that can run on a variety of platforms. If you are planning on doing any distributed, asynchronous processing and you need a system to queue and process items in the background, then you should seriously consider RabbitMQ. The online documentation is great and there are plenty of tutorials that can take you through the basics of creating and consuming queues in your application. However, before you start typing any code, you first you need to get RabbitMQ up and running somewhere (local system, server etc). In this post, we will go through the installation steps and see what’s needed to get us to that point.
1. Erlang Installation####
RabbitMQ runs on the Erlang virtual runtime. Don’t ask me why, but it does, so we need to install Erlang first as without it we can’t get RabbitMQ to work. You can get the latest Windows installer here. Make sure you choose the 32 or 64bit version depending on the system you plan to run it. Download and install it. There is no restart required, so this first step is easy. Before we continue, ensure that the appropriate environment variable (ERLANG_HOME) has been created during the installation. If, for any reason, the environment variable is missing, you will need to create it manually as per the image below:
2. RabbitMQ Service Installation####
Grab the latest installer for Windows from the RabbitMQ website here Download and install. Again, nothing funcy here.
3. RabbitMQ Web Management Plugin installation####
RabbitMQ runs, by default, as a Windows Service and technically you shouldn’t need to do anything else to start interacting with it. However, any interaction with the service needs to happen over the command-line. If you are not a die-hard command-line, then there is an solution for you. RabbitMQ comes with a handy and, nice if I may say, web-based management plugin which is part of the installation files. To install the web plugin you just need follow the steps below:
- Open an elevated command line (Run as Administrator)
- Navigate to the sbin directory of the RabbitMQ Server installation directory. In my case the path is
C:\Program Files (x86)\RabbitMQ Server\rabbitmq_server-3.3.4\sbin
- Run the following command to enable the plugin
rabbitmq-plugins.bat enable rabbitmq_management
- Then, re-install the RabbitMQ service using the commands below:
rabbitmq-service.bat stop
rabbitmq-service.bat install
rabbitmq-service.bat start
To check if everything worked as expected, navigate to http://localhost:15672/mgmt. You will be prompted for username and password. The default credentials are:
Username: guest
Password: guest
You should now be presented with the following page:
4. Install Handle.exe for RabbitMQ’s file descriptors####
When you first log in to the RabbitMQ web dashboard, under the «Overview» tab you will notice that in the «File descriptors» field there is a question mark about the missing Handle.exe. Handle.exe enables RabbitMQ to monitor the local file system. It will still work without it but I think that it’s better to make it available, so let’s go and get it. The dashboard provides a handy link to the Handle download page, but you can also use this link to go to that same page directly. As a side-note, this tool is written by no one else but Mark Russinovich himself. This guy is a genius!
Download the zip file and unzip it anywhere you want. I decided to extract mine in “C:\Program Files\Handle”. It is important that you keep a note of the extracted path as we will need to add it to PATH environment variable so it is available to RabbitMQ.
- Open the Environment Variables Windows,
- Scroll down to the System Variables -> Path variable and click on Edit.
- At the end of the Variable Value, add the path to the Handle.exe:
- Click OK twice to close all windows down
Finally, we need to restart the RabbitMQ service so that our changes can be picked up. Use the steps below to restart the service:
- Open up an elevated command line
- Type the following commands
rabbitmq-service.bat stop
rabbitmq-service.bat start
Go back to the web dashboard and check the Overview page. The warning about the missing Handle.exe should now be gone.
Next time we will look into how we can use the queuing platform and integrate it with our .NET code.
Happy coding…
RabbitMQ is also known as message queueing technology or message broker. It’s an open source message broker. Simply stated: it is program that determines queues and which applications connect to send messages or messages. Any kind of information can be
given in a message. The RabbitMQ server is written in the Erlang programming language and is built on the Open Telecom Platform framework for clustering and failover.
RabbitMQ Tutorial :
Install RabbitMQ on Windows- Spring Boot RabbitMQ Example
- Spring Boot + RabbitMQ + Error Handling
Example -
Spring Cloud Stream + RabbitMQ Example
- Spring Boot + Pivotal Cloud Foundry (PCF) + RabbitMQ Example
- RabbitMQ Interview Questions
Steps to install Rabbitmq
First, goto Erlang and click on Windows Binary File as given below:
Now double click on downloaded otp_win64_22.1.exe.
Click on Next
Click on Install
Erlang installation is now completed, click on Close.
Now will download and install rabbitmq server as per below steps.
Goto RabbitMQ Home Page, click on Windows Installer as shown in screenshot.
Download rabbitmq server .exe as shown in screenshot.
Double click on downloaded rabbitmq-server-3.8.1.exe and click on Next.
Click on Install
Click on Next.
Click on Finish and installation will complete.
Now will start Rabbitmq server from command prompt, goto rabbitmq server sbin
path where it gets installed. In my case it’s in C:\Program Files\RabbitMQ Server\rabbitmq_server-3.8.1\sbin
rabbitmq-server start
Note: The above message is received if RabbitMQ Server is already running.
Next we will set up the RabbitMQ plugin by using below command, to use the RabbitMQ Management Console from Web Browser.
rabbitmq-plugins.bat enable rabbitmq_management
Goto http://localhost:15672, you see login page, use guest as username and password.
Now you can see RabbitMQ Consol Management.
After setting the RabbitMQ at local, you can try RabbitMQ Example and Spring Cloud Stream with
RabbitMQ Example.
Kafka или RabbitMQ
Для начала установки необходимо скачать с сайта и установить Docker на Windows 10. Сложностей с этим возникнуть не должно, после установки необходимо установить или обновить ядро Linux по инструкции.
После того, как Docker установлен, запустим его.
Запустим консоль Windows и введем команду:
docker pull rabbitmq:3.10-management
Данная команда загрузит образ RabbitMQ c DockerHub.
После того, как образ загружен локально можно запустить контейнер на основе загруженного образа командой:
docker run --rm -it -p 15672:15672 -p 5672:5672 rabbitmq:3.10-management
После запуска контейнера, можно проверить работу перейдя по адресу: http://localhost:15672, командой мы указали, что для клиентских подключений используем порт 5672, а страница управления разместится на порту 15672.
Для входа в панель управления можно использовать логин и пароль по умолчанию: guest
Запуск RabbitMQ с помощью Docker-compose
Чтобы развернуть RabbitMQ с помощью Docker Compose, нам сначала нужно создать файл Docker Compose. Файл Docker Compose – это файл YAML, который определяет службы, сети и тома, составляющие наше приложение.
Вот пример файла Docker Compose, который развертывает экземпляр RabbitMQ:
version: '3' services: rabbitmq: image: rabbitmq:management container_name: rabbitmq environment: - RABBITMQ_DEFAULT_USER=guest - RABBITMQ_DEFAULT_PASS=guest ports: - "5672:5672" - "15672:15672" networks: default: driver: bridge
В командной строке перейдите в директорию, где находится ваш файл docker-compose.yml, и выполните следующую команду:
Давайте пройдемся по каждому разделу этого файла, чтобы понять, что он делает:
- version: ‘3’: Здесь указывается версия формата файла Docker Compose, который мы используем.
- services: В этом разделе определяется служба RabbitMQ, которую мы хотим развернуть. В данном случае мы используем официальный образ RabbitMQ Docker с включенным плагином управления.
- image: rabbitmq:management: Здесь указывается образ докера RabbitMQ, который мы хотим использовать.
- container_name: rabbitmq При этом RabbitMQ контейнеру присваивается имя.
- environment: В этом разделе задаются переменные среды для контейнера RabbitMQ. В этом примере мы устанавливаем имя пользователя и пароль по умолчанию на “guest”. Обратите внимание, что это не рекомендуется для производственных сред.
- ports: В этом разделе порты, используемые RabbitMQ, сопоставляются с соответствующими портами на главном компьютере. В этом случае мы сопоставляем порт 5672 для связи AMQP и порт 15672 для интерфейса управления RabbitMQ.
- networks: В этом разделе задаются сетевые настройки для контейнера RabbitMQ. В этом примере мы используем сеть Docker bridge по умолчанию.
Консультирую по разным конфигурациям 1С, дорабатываю, разрабатываю расширения, отчеты и обработки, администрирую базы 1С на linux.