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

Compare with Current View Page History

Version 1 Next »

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

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

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

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

Вопрос: подождите-подождите, а под какой операционкой это работает?
Ответ: поскольку все написано на Java, оно одинаково хорошо работает и под Windows, и под Linux, и думаю без проблем заведётся под FreeBSD, Solaris и MacOS. Лишь бы в системе было установлена JRE.

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

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

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

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

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

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

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

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

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

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

Валюта (currency) описывает код, человеческое имя и принятое сокращение валюты, используемой для некоего счета.

Связка контракта и счета (contract_account) пока не используется. В перспективе один контракт (клиент) может иметь несколько лицевых счетов, плюс логику того, что за что с какого счета снимается.

Группировка контрактов (contract_cgroup и cgroup) пока не используется, но позволит например группировать клиентов-частников в доме, или юрлица в бизнес-центре.

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

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

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

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

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

  • добавлять-удалять на лету, без остановки программы
  • редактировать или писать самостоятельно (обладая соответствующими знаниями)
  • заказывать для разработки авторам 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)

Подробнее о работе интерфейса смотри в разделе эксплуатация.

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

  • No labels