Внешняя компонента основанная на 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 это не позволяет.