i2Rpc
i2Rpc - инструмент удаленного вызова программ на платформе IBMi. Позволяет вызывать программы в отдельном задании, как локально, так и на удаленном сервере IBMi.
Contents
Архитектура
Сервер i2Prc
Расположенный на сервере IBMi экземпляр сервера i2Rpc - это многопоточный сервер, выполняющий прием и обработку запросов на выполение удаленных вызовов программ от Клиентов i2Rpc. Сервер взаимодействует с клиентами i2Rpc по частному протоколу, построенному поверх протокола TCP/IP. Сервер обрабатывает запросы клиентов на подключение, и обеспечивает соединение клиентов с сессиями, выполняющими обслуживание удаленных вызовов программ.
Для обслуживания клиентов сервера i2Rpc, сервер поднимает листенер входящих TCP/IP или UNIX соединений. Номер порта или адрес unix сокета входящих запросов определяется в параметрах конфигурации сервера. Если используется TCP/IP порт, то сервер может принимать запросы, поступающие от клиентов, расположенных на других серверах IBMi, имеющих доступ к данному серверу. Использование UNIX соедиений позволяет ограничить область видимости экземпляра сервера i2Rpc только данным сервером IBMi.
Для подключения сессий, сервер i2Rpc открывает листенер UNIX соединений на локальном unix сокете. Сервер запускает сессии командой SBMJOB, при этом задание сессии уведомляется об адресе, который слушает листенер сервера для обработки соедиений с сессиями. После старта, сессия подключается к серверу и переходит в состояние ожидания заданий на обработку клиентских RPC запросов.
Клиенты i2Rpc
Клиентом i2Rpc может являться любая программа для IBMi, которой требуется удаленное выполнение другой программы на сервере IBMi, на котором запущен экземпляр сервера i2Rpc. Для взаимодействия с сервером i2Rpc, клиенту предоставляется специальное API, реализуемое программой i2RpcAPI. i2RpcAPI имеет несколько вариантов использования, которые определяются в первом параметре программы i2RpcAPI. Основные варианты использования:
- I2RC000001 - подключение к серверу i2Rpc и получение хэндлера соединения
- I2RC000002 - удаленный вызов программы в рамках данного соединения
- I2RC000004 - закрытие соединения с сервером i2Rpc, освобождение хэндлера
В зависимости от варианта использования, клиентская программа должна передать в i2RpcAPI соответствующие структуры данных, содержащие параметры того или иного действия. Параметры действия I2RC000002 спроектированы таким образом, чтобы минимизировать доработки программ при переходе от локального вызова к удаленному. Фактически, вместо передачи списка параметров при локальном вызове, в RPC нужно передать такой же список параметров, и сопроводить его формальным описанием этого списка - указать количество параметров и их размерность
Пул сессий i2Rpc
Непосредственное выполнение удаленных вызовов программ происходит в Сессиях i2Rpc. Сессия - это отдельное однопоточное задание, которое подключается к Серверу i2Rpc и получает от сервера соединение с клиентом, от которого поступил запрос на RPC вызов.
Сессии отслеживают состояние сервера. Если задание сервера будет остановлено тем или иным способом, то все подключенные к даннному серверу сессии также завершат свою работу. В процессе работы, сессии информируют сервер о результатах обработки клиентских RPC запросов.
Существуют два вида сессий i2Rpc:
- statefull сессия (SF сессия) - задание, в рамках которого выполняются запросы только одного клиента. В задании сохраняются неизменными все свойства окружения вызова, сформированные клиентом - library list, activation groups, блокировки объектов и записей, объекты в QTEMP и т.д. При подключении клиента к i2Rpc серверу в SF режиме, сервер запускает отдельное задание, в котором выполняются все RPC вызовы от данного клиента. При первом вызове RPC, сервер передает в задание сессии дескриптор клиентского соединения, и дальшейшее взаимодействие клиента с i2Rpc происходит непосредственно между клиентом и сессией, без привлечения сервера i2Rpc. Сервер отслеживает активность клиентского соединения и сессии. В случае отключения клиентского соединения, SF сессия будет автоматически остановлена. И наоборот - если задание сессии будет прекращено тем или иным способом, сервер закроет соедиение с клиентом
- stateless сессия (SL сессия) - задание, которое может обслуживать RPC вызовы нескольких клиентов. Сервер i2Rpc не гарантирует, что обращения определенного клиента к SL сессии будут выполняться в рамках одного и того же задания. Таким образом, клиент SL соединения не может рассчитывать на сохранение окружения в последовательных вызовах RPC. При обращении клиента к SL сессии, сервер определяет свободное задание из пула запущенных SL заданий, при необходимости стартует новое задание SL сессии, и передает ему дескриптор клиентского соедиения. SL сессия, после завершения обработки RPC запроса (запросов) данного клиента, возвращается в пул доступных SL сессий, и может быть использована в дальнейшем для обработки запросов от других клиентов. В параметрах настройки сервера i2Rpc может быть определен размер пула SL сессий - минимальное и максимальное количество заданий. Сервер автоматически поддерживает указанную ширину пула, контролируя завершение заданий и запуская новые задания по мере необходимости.
Логирование и трассировка
В контектсе данного проекта, разделяются понятия Логирование и Трассировка. Логированием называется протоколирование событий, возникающих в процессе работы сервера и сессий. Для регистрации таких событий может быть использован job log задания, его spool файл QPRINT, или сервер syslog, запущенный на локальном сервере IBMi или на удаленной машине. Трассировка - это протоколирование параметров RPC вызовов, которое выполняется отдельной user exit программой. Данная user exit программа может быть вызвана до и/или после непосредственного вызова сессией программы, обрабатывающей RPC запрос. По сути трассировка - это прикладное протоколирование вызовов RPC процедур, выполняемое пользовательским user exit. Параметры логирования настраиваются в файле конфигурации сервера i2Rpc, либо могут передаваться серверу в командной строке запуска сервера Для выполнения трассировки требуется создание специальной user exit программы трассировки, и настройки соответствующих параметров трассировке в конфигурации сервера Непосредственный вызов user exit трассировки может выполняться как в рамках самого задания сервера i2Rpc, так и в рамках отдельного задания. За способ вызова user exit трассировки отвечает соответствующий параметр конфигурации сервера