(Начало - здесь).
Наши примеры становятся все сложнее, код становится все более громозким и все менее располагает к пониманию.Вспомним, к примеру, последний вариант боркера с распределенной нагрузкой.
Громоздко, да. И это мы еще использовали наши вспомогательные процедуры вроде s_recv()/s_send(), а без них бы пришлось пересылать сообщения ZMQ и заниматься упаковкой-распоковкой данных.
В общем, если использовать низкуровневое API в сложных задачах, то и кодировать долго, и потом разбираться непросто.
Нужно переходить к более высоким уровням абстракции.
Например, для Delphi есть замечательная объектная библиотека: https://github.com/bvarga/delphizmq
Модуль zmqapi.pas предоставляет объектный интерфейс высокого уровня в соответствии видением прекрасного с создателя библиотеки и, надо полагать, в соответствии с задачами, которые стояли перед ним в момент написания.
К сожалению, больше года библиотека почти не обновляется, и зависла на поддержке ZeroMQ версий 2.* и 3.*.
~~~~~~~~~~~~
К счастью, выход есть: iMatrix (контора, которая и разрабатывает ZeroMQ) создала и развивает библиотеку API высокого уровня: http://czmq.zeromq.org/
Вот так на Delphi будет выглядеть "Hello, Worrld!"
Здесь пара сокетов: PUSH и PULL, взаимодействующих между собой по inproc - протоколу.
В сокет push посылается строка 'Hello, World!', которая принимается из сокета pull.
Как видим, строка здесь - "Сишная", то есть наш привычный PChar:
Так сделано из-за того, что и эта библиотека (как и libzmq.dll) реализована в виде "сишной" dll. Более того, чтобы избежать возможных проблем с менеджером памяти, освобождение памяти, выделенной для строки, также выполняется специальным методом:
Ибо строки в разных языках программирования, в разных компиляторах и даже в разных библиотеках часто реализованы по-разному.
Т.обр, при использовании CZMQ не требуется создавать/освобождать контекст, отдельно настраивать сокеты, отдельно выполнять биндинги и коннекты и возиться с упаковкой/распаковкой строк.
Сама czmq.dll и файл czmq_h.pas доступны для скачивания здесь.
Для использования CZMQ следует подключить файл czmq_h.pas, приложенный к сообщению.
При импорте .h файлов я старался избегать использования устаревших (deprecated) элементов, однако впоследствии, в процессе изучения ZMQ по не очень новым руководствам, пришлось кое-что добавить.
Возможно, позднее файл биндинга будет изменен.
Наши примеры становятся все сложнее, код становится все более громозким и все менее располагает к пониманию.Вспомним, к примеру, последний вариант боркера с распределенной нагрузкой.
Громоздко, да. И это мы еще использовали наши вспомогательные процедуры вроде s_recv()/s_send(), а без них бы пришлось пересылать сообщения ZMQ и заниматься упаковкой-распоковкой данных.
В общем, если использовать низкуровневое API в сложных задачах, то и кодировать долго, и потом разбираться непросто.
Нужно переходить к более высоким уровням абстракции.
Например, для Delphi есть замечательная объектная библиотека: https://github.com/bvarga/delphizmq
Модуль zmqapi.pas предоставляет объектный интерфейс высокого уровня в соответствии видением прекрасного с создателя библиотеки и, надо полагать, в соответствии с задачами, которые стояли перед ним в момент написания.
К сожалению, больше года библиотека почти не обновляется, и зависла на поддержке ZeroMQ версий 2.* и 3.*.
~~~~~~~~~~~~
К счастью, выход есть: iMatrix (контора, которая и разрабатывает ZeroMQ) создала и развивает библиотеку API высокого уровня: http://czmq.zeromq.org/
Вот так на Delphi будет выглядеть "Hello, Worrld!"
program hl_HelloWorld; {$APPTYPE CONSOLE} uses SysUtils, czmq_h; var push: p_zsock_t; pull: p_zsock_t; fpStr: PChar; begin push := zsock_new_push('inproc://example'); pull := zsock_new_pull('inproc://example'); zstr_send(push, 'Hello, World!'); fpStr := zstr_recv(pull); Writeln(fpStr); zstr_free(fpStr); zsock_destroy(pull); zsock_destroy(push); Readln; end.
Здесь пара сокетов: PUSH и PULL, взаимодействующих между собой по inproc - протоколу.
В сокет push посылается строка 'Hello, World!', которая принимается из сокета pull.
Как видим, строка здесь - "Сишная", то есть наш привычный PChar:
var
...
fpStr: PChar;
Так сделано из-за того, что и эта библиотека (как и libzmq.dll) реализована в виде "сишной" dll. Более того, чтобы избежать возможных проблем с менеджером памяти, освобождение памяти, выделенной для строки, также выполняется специальным методом:
zstr_free(fpStr);
Ибо строки в разных языках программирования, в разных компиляторах и даже в разных библиотеках часто реализованы по-разному.
Т.обр, при использовании CZMQ не требуется создавать/освобождать контекст, отдельно настраивать сокеты, отдельно выполнять биндинги и коннекты и возиться с упаковкой/распаковкой строк.
Использование CZMQ.
Сама czmq.dll и файл czmq_h.pas доступны для скачивания здесь.
Для использования CZMQ следует подключить файл czmq_h.pas, приложенный к сообщению.
При импорте .h файлов я старался избегать использования устаревших (deprecated) элементов, однако впоследствии, в процессе изучения ZMQ по не очень новым руководствам, пришлось кое-что добавить.
Возможно, позднее файл биндинга будет изменен.
Особенности High-level API CZMQ:
- Автоматизация обслуживания сокетов. К примеру, при закрытии контекста все его сокеты автоматически будут также закрываться. При этом в некоторых случаях для сокетов можно назначить таймаут.
- Кроссплатформенное управление нитями.
- Передача потоков сообщений от родительских нитей к дочерним. (При этом автоматически будут использоваться сокеты PAIR по протоколу inproc).
- Кроссплатформенный доступ к системным часам.
- Специальный реактор для замены zmq_poll(). Цикл опроса прост, но громоздок. Каждый раз приходится писать один и тот же код: обсчет таймеров и вызов процедур обработки (ридеров) по мере готовности сокетов. Простой реактор с ридерами сокетов и таймерами позволит сократить время написания цикла обработки.
Правильная обработка нажатия Ctrl-C для консольных приложений.
...
Кроме того, в CZMQ версии 3.* добавлены:
...
Кроме того, в CZMQ версии 3.* добавлены:
- Класс zsock, который работает вообще без контекста и с конструкторами, совмещающими операции создания и коннекта/биндинга.
- Класс zactor для multithreaded - разработки.
- Класс zgossip для исследования конфигурации сети.
- Класс zrex для регулярок.
- Функций управления процессами - zsys.
Теперь снова построим брокер с балансировкой нагрузки. С помощью CZMQ: (Продолжение).
Комментариев нет :
Отправить комментарий