You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 4 Next »

В этом разделе рассказано, как устроен и работает NETAMS 4.
Сразу скажем, что к версии 3.4 новая версия никакого отношения не имеет. Ни единой строчки общего кода (кроме алгоритмов кеширования информации по потокам во внешнем агенте pcap, написанном на С). Хотя бы потому, что NETAMS 4 полностью написан на Java

Вопрос: Ну зачем так? Жава, плохой и медленный язык. Какое убожество! Писали бы на ПХП или Руби.
Ответ: На ПХП пускай пишут студенты. Java - очень гибкий язык, по сравнению с С/С++ содержит гораздо больше встроенных средств (работа с сетью, коллекциями и прочее), что в противном случае пришлось бы реализовывать самим (забудем про STL). Нет проблем с утечкой памяти и нулевыми указателями. О скорости - современные java runtime оптимизированы очень хорошо, а в процессорах мощи более чем достаточно. Проблемы с производительностью были 5-7 лет назад, сейчас их нет. Да, придется скачать и поставить JRE от Oracle - но это необходимые издержки, в сравнении с необходмостью самостоятельно собирать бинарный комплект из исходников.

Структурно NETAMS 4 состоит из следующих компонентов:

  • процесс биллинга (включает в себя сбор сырых данных, обработку тарифными планами, и их сброс в хранилище)
  • интерфейсная часть (сервер), выполняющаяся сервером приложений jetty
  • интерфейсная часть администратор (клиент), выполняющаяся в веб-браузере
  • интерфейсная часть пользователя (клиент), выполняющаяся в веб-браузере
  • процесс генерации отчетов (реализованы встроенный в биллинг, и внешний модуль)
  • процесс сбора данных на удаленном хосте (libpcap) с возможностью блокировки (FreeBSD/pf)

Вопрос: Под какой операционкой это работает?
Ответ: Поскольку все написано на Java, код одинаково хорошо работает и под Windows, и под Linux, и под FreeBSD (кроме мелочей), сокрее всего без проблем заработает под *BSD, Solaris и MacOS. Лишь бы в системе был установлен JRE.

Опишем работу каждого из компонентов в деталях.

Процесс биллинга

Запускается как standalone java приложение, и является "ядром" системы NETAMS4. Если он не работает - не работает ничего.

Биллинг обеспечивает получение данных от источников данных. Это могут быть внешние источники, которые написаны на С и общаются с операционной системой (ipq/ipfw/netflow/radius/pam/libpcap), или внутренние источники данных, реализованные на Java. На настоящий момент внешний источник реализован для FreeBSD (RemoteAgent), а из внутренних источников написано два - коллектор Cisco Netflow, и обработчик пакетов с локального сетевого интерфейса, посредством библиотеки PCAP. 
Netflow позволяет собирать данные о проходящем трафике с устройства, выдающего поток статистики. Это может быть стоящий рядом маршрутизатор Cisco, или любой Windows/Linux/FreeBSD сервер с соответствующим программным обеспечением (например ipfw2netflow из комплекта NeTAMS 3.4).
Pcap позволяет "смотреть" на проходящие мимо (или через) локального интерфейса Ethernet пакеты даных. Подходит, если сервер, на котором работает NETAMS, является ещё и маршрутизатором локальной сети, или же имеет дополнительну сетевую карту, на которую настроен вывод трафика SPAN-порта.

Биллинг обеспечивает хранение (загрузку, обновление и сохранение обратно) конфигурационной информации, а также данных о статистике по трафику. Конфигурация хранится в формате XML (используется библиотека XStream), а "тяжелая" статистика - в MySQL (используется JDBC через Mysql Connector/J). Для работы необходимо иметь настроенный сервер MySQL версии 5 или выше. Подержка других СУБД реализуема легко (обращайтесь на support@netams.com).

Биллинг обеспечивает связь с серверной частью веб-интерфейса (RPC, библиотека CAJO)

И наконец, биллинг обеспечивает преобразование входящей статистики обработчиком тарифного плана, в деньги. Остановимся на этом механизме подробнее. Для начала, необходимо уяснить взаимосвязь всех объектов в системе.

Каждый объект имеет уникальный номер (id), по которому происходит взаимосвязь объектов. Также общими являются некоторые служебные метаданные, например время создания или последней модификации объекта.

Контракт (contract) описывает клиента биллинга - физическое или юридическое лицо. К нему привязаны свойства вроде контактных телефонов, почтового адреса и прочее.

Группа контрактов (contract group) дает возможность объединять записи о контрактах в группы (для удобства).

Лицевой счет (account) описывает валюту и баланс счета.

Валюта (currency) описывает код, человеческое имя и принятое сокращение валюты, используемой для некоего счета. В настоящей реализации заблокирована возможность создавать несколько валют. Если вам мешает это ограничение - обращайтесь на support@netams.com.

Учетный элемент (acctunit) является аналогом unit из NeTAMS 3.4 и описывает объект, по которому ведется непосредственный учет (биллинг). В текущем случае - это IP адрес (подсеть)некоего устройства (абонента, клиента). Потенциально один клиент может иметь несколько закрепленных за ним учетных объектов, в том числе не-IP объекты (а, например, домены или почтовые ящики, за которые надо брать периодическую абонентскую плату).

Тариф (tariff), описывает тарифный план, которым производится учет. Содержит в себе такие параметры, как сроки действия, тип плана (периодический или однократно применяемый), ссылку на предыдущий тарифный план, а главное - на тип обработчика (classname) тарифного плана. В зависимости от типа обработчика, имеет ряд дополнительных параметров (размер абонентской платы, количество включенного трафика, ограничение по скорости и прочее).

Важно: обработчик тарифного плана сделан по шаблону (в терминах Java - реализует некий стандартный интерфейс), и позволяет один раз закодировать, и потом многократно использовать одну и ту же логику работы для нескольких схожих тарифных планов. Например, можно иметь линейку тарифных планов, которые имеют общий обработчик, но отличаются величиной абонентской платы и стоимостью превышения объема включенного в нее трафика.

В настоящий момент реализованы три обработчика "FlatRate2", который обсчитывает трафик линейно (тариф за килобайт отдельно на вход и выход), "PolicyBasedEngine", который позволяет создавать гибкие политики учета на базе настраиваемых критериев (при аналогичном линейном обсчете), и "PeriodicFeeIncludedVolume", который позволяет назначать фиксированную абонентскую плату за период, объем включенного в неё трафика, стоимость перерасхода. 

Важно-важно: обработчик тарифного плана можно будет:

  • добавлять-удалять на лету, без остановки программы
  • редактировать или писать самостоятельно (обладая соответствующими знаниями)
  • заказывать для разработки авторам NETAMS
  • организовывать любую, *абсолютно* любую фантазию в логике его работы

Сервис (service), описывает экземпляр услуги. Является финальной связкой, которая объединяет:

  • контракт (кому принадлежит услуга)
  • тарифный план (каким способом обрабатывать трафик по услуге)
  • лицевой счет (откуда снимать деньги за услугу)
  • учетный объект (по какому объекту (IP-адресу) идентифицировать услугу) - один или несколько

Изначальная, поставляемая с программой конфигурация имеет по одному объекту каждого типа. Её достаточно, чтобы проверить учет трафика, и денег, по одному IP-адресу.

Интерфейсная часть (сервер)

Запускается как standalone java приложение, при этом стартует встроенный web/application сервер Jetty. Отвечает на запросы web-клиента (ниже), перенаправляя их в сторону сервиса биллинга. Реализация такова, что вебсервер, сервис биллинга могут исполняться на разных серверах, хотя обычно всё запускают на одном. "Слушает" Jetty на порту 8080 (настраивается в netams.properties). Серверная часть интерфейса фактически занимается проброской данных между "толстым клиентом" веб-интерфейса, и процессом биллинга.

Важно: биллинг прекрасно работает, даже если серверная интерфейсная часть не запущена. Перезагрузка (останов-запуск) серверной части интерфейса, и процесса биллинга, друг на друга не влияют.

Интерфейсная часть администратора (клиент)

Запускается из веб-браузера при обращении к серверу http://localhost:8080/
Написана с использованием библиотеки Google Web Toolkit, то есть является тяжеловесным AJAX/JavaScript приложением.
Интерфейс интуитивно понятен, обеспечивает в настоящий момент следующие функции:

  • настройку параметров источников данных (откуда принимать netflow-поток, на каком интерфейсе слушает pcap)
  • бэкап/восстановление/просмотр конфигурации биллинга
  • редактирование элементов конфигурации биллинга
  • работу с абонентом
  • "мастера" для удобного пополнения лицевого счета, создания нового абонента и т.д.
  • просмотр простейшей статистики (Quick Reporting)
  • создание, редактирование и запуск отчетов через Сервер Отчетов

Интерфейсная часть пользователя

Предоставляет пользователям (абонентам, клиентам) системы биллинга доступ в свой "рабочий кабинет". Написана как простой сервлет (исполняется там же, где и серверная часть интерфейса  администратора). Использует HTML-шаблоны, то есть допускает настройку внешнего вида кабинета (контактная информация, логотипы, расположение блоков). Обеспечивает работу с объектами (лицевыми счетами, услугами, статистикой) данного абонента, дает возможность выписать квитанцию для оплаты и т.д.

Процесс генерации отчетов

Standalone Java приложение, которое общается с веб-интерфейсом администратора, и процессом биллинга, и служит для генерации "тяжеловесных" отчетов, в основном посредством SQL-запросов к базе данных. Вынесен в отдельный процесс для возможного выноса на другой физический сервер, чтобы не нагружать сервер биллинга.

  • No labels