Забытая разработка прошлого века
Бывают иногда проекты, которые вроде как многообещающие, но по непредсказуемому стечению обстоятельств не выстреливающие. Вот пример такого проекта 25-летней давности. Разработка была проделана как надо, но внимание заказчика ушло в сторону, и код бесследно канул в лету. Случайно обнаружил пару писем в старом архиве.
Subject: Проект сетевого модуля Date: Fri, 31 Mar 95 23:27:55 +0400 From: vak@cronyx.ru To: tul@prbank.msk.su Cc: info@cronyx.ru, pvu@prbank.msk.su Добрый день! Сие есть некоторый документ, цель которого - навести порядок в мыслях на тему сетевого модуля АФИНы. (Неплохо бы как-нибудь выяснить, что же такое эта самая афина). :-) Я старался не упустить ничего важного, не переусложняя. Если описанная схема устраивает, можно начать дискуссию на тему формата таблиц (типы данных и прочее). После этого я делаю некоторую заготовку на Си, которая как минимум транслируется, и можно уже будет выходить на живую базу. С уважением, Сергей Вакуленко
Проект сетевого модуля системы АФИНА ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Copyright (C) 1995 Кроникс Автор: Сергей Вакуленко, <vak@cronyx.msk.su> Fri Mar 31 20:39:36 MSD 1995 Сетевой модуль представляет собой подсистему банковской системы АФИНА. Назначением модуля является организация передачи данных между удаленными базами данных системы, с использованием цифровых каналов передачи данных. В качестве каналов связи могут применяться выделенные линии с установленным соответствующим оборудованием, либо глобальные сети передачи данных. В качестве семейства протоволов передачи данных выбран TCP/IP. Основу системы АФИНА составляют серверы баз данных на платформе Unix (HP/UX и SCO Unix) с применением СУБД Oracle. Сетевой модуль реализован в виде двух программ-утилит NETSEND и NETRECV, функционирующих в режиме "демонов" ОС Unix. Обе утилиты все необходимые данные и параметры утилиты получают непосредственно из базы данных Oracle. Это обеспечивает надежность хранения данных и восстановления после сбоев (средствами самой СУБД), а также позволяет управлять сетевым модулем, используя общий интерфейс система АФИНА. ------------------------ ------------------------ | СУБД 1 | | СУБД 2 | | --------- ---------- | | ---------- | | |таблица| | очередь| | | | очередь| | | |каналов| | на | | | |принятых| | | --------- |передачу| | | | заявок | | | ---------- | | ---------- | ------------------ | --- ---- ^ ----------------- V | NETSEND--------->NETRECV Общая схема функционирования механизма передачи данных ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1. Система АФИНА помещает заявки на передачу в таблицу send_msg, заполняя обязательные поля to, from, id, body и, возможно, поля head, pri, timo, life. Периодически система проверяет статус передаваемых заявок, проверяя поле status. После завершения обработки заявки (status > 0) система АФИНА удаляет заявку из таблицы send_msg. 2. Утилита NETSEND сетевого модуля периодически (например, каждые 5 секунд) проверяет наличие новых заявок в таблице send_msg. При наличии заявок, ждущих обработки, выбирается самая приоритетная из них. Выбранная заявка передается по каналу связи авдресату, причем физический сетевой адрес назначения определяется по таблице chan_route. 3. Утилита NETRECV принимает заявку по сети передачи данных, и заносит ее в таблицу recv_msg, добавляя поле rtime. В этом же сеансе связи передается обратное сообщение об успешной доставке. 4. Передающая утилита NETSEND, приняв сообщение о доставке, устанавливает статус завершения заявки. 4. Система АФИНА периодически (например, каждые 5 секунд) проверяет наличие принятых заявок в таблице recv_msg (с условием body NOT EMPTY). После обработки принятой заявки ее поле body обнуляется, но удаление самой заявки из таблицы откладывается на некоторое время (например, на сутки) для отсечения дублей заявок (благодаря уникальности поля id). Таблица заявок на передачу (выходная очередь): send_msg ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ CREATE TABLE send_msg ( to CHAR(32) NOT NULL, from CHAR(32) NOT NULL, id CHAR(128) UNIQUE, pri NUMBER(2), head RAW(255), body LONG RAW(65535) NOT NULL, timo NUMBER, life NUMBER, btime NUMBER(12), status NUMBER, diag CHAR(128), ftime NUMBER(12), fcnt NUMBER); to CHAR(32) NOT NULL - Лог.адрес получателя, текстовая строка без пробелов. Определяет пункт назначения заявки. Физ. адрес получателя определяется из таблицы логических каналов chan_route. Если оказывается, что в таблице chan_route такого адреса нет, то заявка завершается со статусом 3. from CHAR(32) NOT NULL - Лог.адрес отправителя, текстовая строка без пробелов. Передается без изменений, поступает в поле to таблицы recv_msg получателя. id CHAR(128) UNIQUE - Уникальный идентификатор заявки, заполняется системой АФИНА при занесении новой заявки. Содержит заведомо уникальную текстовую строку, например, состоящую из лог.адреса отправителя, времени запуска системы и порядкового номера сообщения. Может использоваться приемной стороной системы АФИНА для отсечения дублей заявок. pri NUMBER(2) - Приоритет заявки, число в диапазоне -99..99. Заявки с большим значением приоритета могут прерывать передачу менее приоритетных заявок. head RAW(255) - Паспорт заявки, может быть пустым. Представляет собой небольшой фрагмент тела заявки, вынесенный для удобства обработки в отдельное поле. body LONG RAW(65535) NOT NULL - Тело заявки. Сетевой модуль не решает задачу аутентификации и обеспечения секретности информации, передаваемой по каналу связи. Предполагается, что поле body содержит уже зашифрованный и включающий электронную подпись массив данных. timo NUMBER - Период повторения попыток передачи заявки в секундах. Чрезмерное уменьшение этого параметра вызывает увеличение нагрузки на канал связи, а уменьшение приводит к росту среднего времени доставки сообщений. По умолчанию 60 секунд. life NUMBER - Длительность жизни заявки в секундах. По истечении указанного времени заявка завершается со статусом 2. По умолчанию 100000 секунд. btime NUMBER(12) + Время возникновения заявки, заполняется утилитой NETSEND в момент анализа новой заявки. status NUMBER + Код состояния заявки: >0 - заявка выполнена: 1 - заявка успешно выполнена 2 - передача не удалась, истекло время жизни заявки 3 - неверная заявка - лог.адрес получателя отсутствует в таблице маршрутов 0 - исходное состояние, заявка еще не обрабатывалась <0 - заявка находится в процессе обработки -1 - идет передача заявки -2 - попытка передачи не удалась, заявка отложена diag CHAR(128) + Текстовое пояснение состояния заявки для оператора. ftime NUMBER(12) + Время последней неудачной попытки передачи заявки. fcnt NUMBER + Количество неудачных попыток передачи. Таблица принятых заявок (входная очередь): recv_msg ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ CREATE TABLE recv_msg ( to CHAR(32) NOT NULL, from CHAR(32) NOT NULL, id CHAR(128) UNIQUE, pri NUMBER, head RAW(255), body LONG RAW(65535) NOT NULL, btime NUMBER(12) NOT NULL, rtime NUMBER(12) NOT NULL); to CHAR(32) NOT NULL * Лог.адрес получателя. from CHAR(32) NOT NULL * Лог.адрес отправителя. id CHAR(128) UNIQUE * Уникальный идентификатор заявки. pri NUMBER * Приоритет. head RAW(255) * Паспорт заявки. body LONG RAW(65535) NOT NULL * Тело заявки. btime NUMBER(12) NOT NULL * Время возникновения заявки. rtime NUMBER(12) NOT NULL + Время приема заявки. Заполняется утилитой NETRECV в момент занесения принятой заявки в таблицу recv_msg. Таблица логических каналов: chan_route ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ CREATE TABLE chan_route ( to CHAR(32) UNIQUE, addr CHAR(128) NOT NULL, fcnt NUMBER, btime NUMBER(12), ltime NUMBER(12), ftime NUMBER(12)); to CHAR(32) UNIQUE - Лог.адрес получателя. addr CHAR(128) NOT NULL - Физ.адрес получателя. Заносится оператором системы АФИНА при настройке конфигурации сети передачи данных. fcnt NUMBER + Общее количество неудачных попыток передачи. btime NUMBER(12) + Время начала отсчета статистики по данному лог.каналу. ltime NUMBER(12) + Время последней успешной передачи заявки. ftime NUMBER(12) + Время последней неудачной попытки передачи заявки. Примечание 1. Поля, помеченные знаком '-', заполняются системой АФИНА. Поля, помеченные знаком '+', заполняются локальной компонентой сетевого модуля. Поля, помеченные знаком '*', заполняются удаленной компонентой сетевого модуля. Примечание 2. Поля, имеющие смысл астрономического времени (а именно send_msg.btime, send_msg.ftime, recv_msg.btime, recv_msg.rtime, chan_route.btime, chan_route.ltime, chan_route.ftime), хранят в виде целого числа количество секунд от 00:00 1 января 1970 года (т.н. формат даты ОС Unix).