понедельник, 3 ноября 2014 г.

16. ZeroMQ: API высокого уровня. Библиотека CZMQ.

(Начало - здесь).

Наши примеры становятся все сложнее, код становится все более громозким и все менее располагает к пониманию.Вспомним, к примеру, последний вариант боркера с распределенной нагрузкой.

Громоздко, да. И это мы еще использовали наши вспомогательные процедуры вроде 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.* добавлены:
  • Класс zsock, который работает вообще без контекста и с конструкторами, совмещающими операции создания и коннекта/биндинга.
  • Класс zactor для multithreaded - разработки.
  • Класс zgossip для исследования конфигурации сети.
  • Класс zrex для регулярок.
  • Функций управления процессами - zsys.
Теперь снова построим брокер с балансировкой нагрузки. С помощью CZMQ: (Продолжение).

Комментариев нет :

Отправить комментарий