Внешняя компонента основанная на ZeroMQ
Реализованы паттерны:
- Request-Reply - это простой клиент-сервер, представлен объектами
ZeroMQ.Req
иZeroMQ.Rep
. - Publish-Subscribe - публикация сообщений для всех подписчиков, представлен объектами
ZeroMQ.Pub
иZeroMQ.Sub
. Этот паттерн не очень надежен, т.к. нет подтверждения получения, нет информации об подписчиках, сообщения отбрасываются при отсутствии соединения. - Pipeline - это паттерн распределения задач, задачи по очереди получают все подписчики, представлен объектами
ZeroMQ.Push
иZeroMQ.Pull
.
- Для общения между фоновыми заданиями, для эффективной реализации параллельной обработки данных. Предполагается, что задания-воркеры будут получать задания у управляещего задания по мере их выполнения, таким образом реализуется более точное распределение задач между фоновыми заданиями.
- Для общения 1С с другими сервисами, в т.ч. написанных на других языках.
Библиотека не использует защищенное соединение, поэтому работа в общественных сетях опасна. Предполагается, что компонента будет использоваться в основном на одном сервере.
Документация в разработке, см. код тестов:
У всех объектов есть свойство LastError
типа Строка
, в нем будет содержаться ошибка в случае исключения при обращении к компоненте.
Компонента позволяет обмениваться сообщениями. Сообщение - это массив байт, в 1С это тип ДвоичныеДанные
. Также поддерживаются составные (multipart) сообщения, это сообщения, которые состоят из нескольких частей, каждая из которых массив байт.
Для подключения можно использовать следующие виды транспортов (в порядке уменьшения скорости):
внутрипроцессное
- это конечные точки вида"inproc://some_id"
, см. также zmq_inproc. Чтобы убедиться, что это возможно, можно использовать свойствоInstance
объектаZeromMQ.Info
.unix socket
- для взаимодействия между процессами на одном хосте, это конечные точки вида"ipc://path/to/file"
. Поддержка вWindows
есть начиная с определенных версий, ищите эту информацию самостоятельно. См. также описание zmq_ipc.tcp
- для взаимодействия между процессами на одном и разных хостах, также еслиunix socket
не поддерживается. Конечные точки могут выглядеть какtcp://127.0.0.1:1234
, другие примеры смотри в zmq_tcp. В случае использования подключения с разных хостов, рекомендуется обеспечить безопасность такого подключения самостоятельно (vpn/firewall/etc).
Сокет Rep
используется для обработки запросов от клиентов, при получении запроса нужно дать ответ клиенту. Все запросы клиентов выстраиваются в очередь и сервер их обслуживает по очереди.
Методы:
Bind(Endpoint: String)
- привязывает сокет к конечной точке и начинает принимать соединения, вызывается метод zmq_bind.Unbind(Endpoint: String)
- отвязывает ранее привязанную конечную точку. Используется метод zmq_unbind.SetRecvTimeout(timeout: Число)
- задает таймаут получения сообщения, если метод не вызывался, то таймаут равен 60 сек, см. также ZMQ_RCVTIMEO.Send(data: ДвоичныеДанные)
- отправляет ответ клиенту, вызывается метод zmq_msg_send.SendPart(data: ДвоичныеДанные)
- отправляет часть составного сообщения, при этом последняя часть должна быть отправлена с помощью методаSend
.Recv(): ДвоичныеДанные|Неопределено
- получает данные от клиента с ожиданием. Если таймаут вышел, то вернется Неопределено. Используется последовательный вызов методов: zmq_poll и zmq_msg_recv.RecvMultipart(): Число|Неопределено
- получает составное сообщение от клиента. Возвращает количество частей, либо Неопределено, если таймаут вышел. Данные части можно получить с помощью методаGetPart
.GetPart(НомерЧасти: Число): ДвоичныеДанные
- получает выбранную часть составного сообщения.
Сокет Req
используется в качестве клиента, после отправки запроса нужно ожидать получения ответа.
Методы:
Connect(Endpoint: String)
- выполняет подключение к конечной точке, после подключения можно отправлять запросы. Используется метод zmq_connect.Disconnect(Endpoint: String)
- выполняет отключение от конечной точки. Используется метод zmq_disconnect.SetRecvTimeout(timeout: Число)
- задает таймаут получения сообщения, если метод не вызывался, то таймаут равен 60 сек, см. также ZMQ_RCVTIMEO.Send(data: ДвоичныеДанные)
- отправляет запрос серверу, используется метод zmq_msg_send.SendPart(data: ДвоичныеДанные)
- отправляет часть составного сообщения, при этом последняя часть должна быть отправлена с помощью методаSend
.Recv(): ДвоичныеДанные|Неопределено
- получает ответ от сервера с ожиданием. Если таймаут вышел, то вернется Неопределено. Используется последовательный вызов методов: zmq_poll и zmq_msg_recv.RecvMultipart(): Число|Неопределено
- получает составное сообщение от сервера. Возвращает количество частей, либо Неопределено, если таймаут вышел. Данные части можно получить с помощью методаGetPart
.GetPart(НомерЧасти: Число): ДвоичныеДанные
- получает выбранную часть составного сообщения.
Публикует сообщения одному или нескольким ZeroMQ.Sub
.
Методы:
Bind(Endpoint: String)
- описание см. в объектеZeroMQ.Rep
.Unbind(Endpoint: String)
- описание см. в объектеZeroMQ.Rep
.Connect(Endpoint: String)
- описание см. в объектеZeroMQ.Req
.Disconnect(Endpoint: String)
- описание см. в объектеZeroMQ.Req
.Send(data: ДвоичныеДанные)
- описание см. в объектахZeroMQ.Rep
/ZeroMQ.Req
.SendPart(data: ДвоичныеДанные)
- описание см. в объектахZeroMQ.Rep
/ZeroMQ.Req
.
Получает сообщения от ZeroMQ.Pub
.
Методы:
Bind(Endpoint: String)
- описание см. в объектеZeroMQ.Rep
.Unbind(Endpoint: String)
- описание см. в объектеZeroMQ.Rep
.Connect(Endpoint: String)
- описание см. в объектеZeroMQ.Req
.Disconnect(Endpoint: String)
- описание см. в объектеZeroMQ.Req
.Subscribe(topic: ДвоичныеДанные)
- подписывается на определенный топик, для подписки на все топики можно передать пустой ДвоичныеДанные, см. также ZMQ_SUBSCRIBE.SetRecvTimeout(timeout: Число)
- описание см. в объектеZeroMQ.Req
.Recv(): ДвоичныеДанные|Неопределено
- описание см. в объектахZeroMQ.Rep
/ZeroMQ.Req
.RecvMultipart(): Число|Неопределено
- описание см. в объектахZeroMQ.Rep
/ZeroMQ.Req
.GetPart(НомерЧасти: Число): ДвоичныеДанные
- описание см. в объектахZeroMQ.Rep
/ZeroMQ.Req
.
Публикует сообщения одному или нескольким ZeroMQ.Pull
.
Методы:
Bind(Endpoint: String)
- описание см. в объектеZeroMQ.Rep
.Unbind(Endpoint: String)
- описание см. в объектеZeroMQ.Rep
.Connect(Endpoint: String)
- описание см. в объектеZeroMQ.Req
.Disconnect(Endpoint: String)
- описание см. в объектеZeroMQ.Req
.SetSendTimeout(timeout: Число)
- задает таймаут отправки сообщения, если метод не вызывался, то таймаут равен 60 сек, см. также ZMQ_SNDTIMEO.Send(data: ДвоичныеДанные): Булево
- отправляет сообщение в блокирующем режиме, при успешной отправке возвращаетИстина
, если таймаут вышел -Ложь
, вызывается метод zmq_msg_send.SendPart(data: ДвоичныеДанные)
- описание см. в объектахZeroMQ.Rep
/ZeroMQ.Req
.
Получает сообщения от ZeroMQ.Push
.
Методы:
Bind(Endpoint: String)
- описание см. в объектеZeroMQ.Rep
.Unbind(Endpoint: String)
- описание см. в объектеZeroMQ.Rep
.Connect(Endpoint: String)
- описание см. в объектеZeroMQ.Req
.Disconnect(Endpoint: String)
- описание см. в объектеZeroMQ.Req
.SetRecvTimeout(timeout: Число)
- описание см. в объектеZeroMQ.Req
.Recv(): ДвоичныеДанные|Неопределено
- описание см. в объектахZeroMQ.Rep
/ZeroMQ.Req
.RecvMultipart(): Число|Неопределено
- описание см. в объектахZeroMQ.Rep
/ZeroMQ.Req
.GetPart(НомерЧасти: Число): ДвоичныеДанные
- описание см. в объектахZeroMQ.Rep
/ZeroMQ.Req
.
Информация о компоненте
Свойства:
Instance: Строка
- содержит идентификатор конкретного экземпляра в видеguid
. Идентификатор генерируется при каждой загрузке динамической библиотеки. Если в двух разных сеансах он совпадает, то между этими сеансами можно использовать внутрипроцессное взаимодействие.VersionZeroMQ: Строка
- содержит версию ZeroMQ.VersionAddin: Строка
- содержит версию компоненты (содержится в полеpackage.version
в файле Cargo.toml).
См. https://github.com/medigor/rust-build-scripts, но собрать на Linux
для Windows
не получится, т.к. исходная библиотека libzmq это не позволяет.