Фичу мне запили, или Как мы решаем вопрос кастомизации клиентского BILLmanager через плагины

Потребности бизнеса постоянно меняются, и коробочные решения далеко не всегда могут их покрыть. Каждому хочется иметь уникальный инструмент, который закроет именно его потребности с учетом «фишки» бизнеса. Но кастомизировать решение под каждого клиента — слишком трудоемкий и дорогостоящий процесс. По сути, это путь к некоему универсальному комбайну, который появится нескоро, а когда все же выйдет на рынок, то вряд ли его завоюет, так как будет слишком дорог для большинства компаний.

Альтернатива этому пути — создание гибкого ПО, которое за счет подключаемых функций подойдет компаниям разного масштаба. Тут возможны разные подходы, но мы со своим BILLmanager воспользовались идеей плагинов.

В этой статье расскажем, как все это работает.

4bd69e4dcd2ff87099ae8874f2e51745.png

Что такое BILLmanager

Прежде чем говорить о плагинах — в двух словах объясним, что они расширяют.

BILLmanager — платформа автоматизации услуг хостинга, которая поставляется по принципу on-premise. Продукт позволяет настраивать кабинет самообслуживания, чтобы конечный клиент мог за 15–30 минут получить нужный ему сервис — от виртуальных машин определенной конфигурации до доменных имен. А владелец инфраструктуры или хостинга имеет возможность управлять этой историей, а также получать отчетность и анализировать доступные ресурсы, чтобы развивать бизнес.

BILLmanager начинался как биллинговая платформа, но давно вышел за ее рамки. Параллельно с основной функцией он часто решает задачи и для маркетинга, и для автоматизации продаж, и для организации поддержки клиентов.

В основе BILLmanager (как и многих других наших продуктов) COREmanager — фреймворк собственной разработки, который помогает проще обрабатывать базовые вещи. 

3b881be22af2434c0a6491a0cf4ea623.png

COREmanager позволяет решать основные задачи разработчика клиент-серверных приложений, начиная от низкоуровневого взаимодействия с БД, шифрования и т. п. — заканчивая довольно высокоуровневым формированием ответов на запросы пользователей, отрисовкой графического интерфейса и т. п. То есть фактически мы сначала создали фреймворк, а потом уже с его помощью создаем BILLmanager. При работе с COREmanager мы рекомендуем использовать C++ как наиболее функциональный и нативный для платформы язык, но писать можно и на других языках: PHP, Perl, Python или даже bash.

В BILLmanager много инструментов для кастомизации — от настройки интерфейса до брендирования. Но этого оказалось недостаточно для адаптации под любые задачи бизнеса. Фреймворк COREmanager позволяет создавать что угодно, вплоть до собственных продуктов, но это масштабная и трудоемкая задача. Нужен был более простой механизм, который позволил бы немного модифицировать поведение уже имеющихся инструментов BILLmanager в более широких пределах, нежели это позволяет меню настройки. Для этих целей в BILLmanager есть механизм плагинов.

Как организованы плагины

Плагин — небольшой функциональный компонент, который позволяет расширить возможности системы. В BILLmanager поддерживается три вида плагинов:

  • Расширяющие функциональность, то есть позволяющие добавить в продукт, допустим, кастомную таблицу или форму, необходимую для решения бизнес-задачи. Этим же путем можно обеспечить интеграцию с CRM.

  • Изменяющие поведение — плагины, позволяющие перехватить внутреннее событие и модифицировать его. Например, на карточку клиента (сущность из коробки) можно добавить свои поля и заполнить их какими-то значениями. 

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

Плагины удобны, потому что позволяют расширять функциональность платформы, не привлекая нашу команду разработки BILLmanager. У этой команды есть свой роадмап, добавить в который свою кастомную задачу довольно сложно. С плагином это можно обойти: почитать документацию и реализовать то, что нужно, собственными силами. Более того, можно обходиться без команды фронта, потому что у нас есть инструмент для сборки интерфейса из простейших блоков — достаточно описать задумку в XML и на выходе получится готовый интерфейс.

При этом система плагинов не сломает продакшен: критичные интерфейсы она не затрагивает. У системы плагинов есть всего несколько ограничений:

  • Плагины не могут модифицировать базу данных, особенно бизнес-сущности BILLmanager. Связано это с тем, что между приложением и БД в BILLmanager предусмотрена кэширующая прослойка. Если из плагина сделать какие-то изменения напрямую в базе, из-за рассинхронизации с этой прослойкой могут возникать неприятные артефакты.

  • Изменяющие поведение плагины выполняются вместе с запросом и могут существенно увеличивать время ответа. Если запрос сам по себе выполняется десятые доли секунды, а плагин — десять секунд, пользователю в итоге придется ждать отрисовки интерфейса более 10 секунд. Это стоит учитывать.

  • Готовый SDK для плагинов есть только на Python. На любом другом языке создание плагинов придется начать с разработки самого SDK.

Платформа BILLmanager позволяет гибко расширять функциональные возможности как с помощью плагинов, так и с помощью модулей интеграции со сторонними системами. Однако следует различать эти два понятия. В то время как плагин является более узкоспециализированной сущностью и встраивается внутрь BILLmanager, модуль может содержать плагины и на их основе добавлять новый функционал.

На базе плагинов в платформе реализованы следующие интеграции:

  • Модуль AmoCRM — перехватывает некоторые события на платформе и транслирует эти данные в CRM, с которой удобнее работать маркетологам. Аналогично работает интеграция с Омнидеск.

  • Модуль СОРМ (построен на соответствующем плагине) — агрегирует и помогает выгрузить необходимые данные для реализации требований законодательства в части предоставления информации о потребителях виртуальных услуг по запросу ФСБ.

  • Модули авторизации через Госуслуги или VK (аналогично построены на соответствующих плагинах) — позволяют клиентам авторизоваться через свои аккаунты в других сервисах.

  • Revolut — автоматизирует проведение платежных операций в европейской финансовой системе.

Плагины изнутри

Каждый плагин состоит из двух частей:

  • XML-описания, где есть сервисная информация, указан исполняемый файл, а также некоторый набор узлов, которые отвечают за генерацию интерфейса.

  • Исполняемого файла с бизнес-логикой. Он может быть написан на любом языке программирования, который поддерживает четыре основные парадигмы: читает из environment системы, читает из stdin, пишет в stdout и работает с XML.

2cf85dcf648f53f4815aa08830412890.png

Как это выглядит на практике. 

Предположим, нам нужно добавить в интерфейс новый раздел меню. В этом примере мы:

  1. Генерируем новый раздел меню.

  2. Локализуем элементы интерфейса, чтобы пользователь мог их прочитать на том языке, с которым работает.

  3. Генерируем форму, которая откроется при клике на этот пункт меню.

414d580c44f5d8423b61de39927cd438.png

Вторая часть плагина — исполняемый файл с бизнес-логикой. Пусть для примера это будет текстовое поле с одной формулировкой: «Значение, полученное по сети».

Когда пользователь нажмет на добавленный раздел меню, плагин подгрузит статическую схему формы, а затем уже динамически добавит в соответствующие поля эти значения. 

8a27a09bb7e0ab20f0722e7cfa9a44f8.png

Пример можно было бы дополнить обработкой нажатия на кнопку (чтобы при нажатии на кнопку запускалась дополнительная логика).

Вместо выводов

Система плагинов делает BILLmanager более гибким. Платформу можно легко расширять.

Некоторое количество плагинов уже существует — мы и сами реализуем часть функций в виде плагинов. Часть уже разработанных плагинов выложены на GitHub. 

Если же готового решения для требуемой функции нет, клиенты могут разрабатывать плагины сами или отдавать этот процесс на аутсорсинг: для их создания не нужно глубокого погружения в продукт. Так кастомизация решения происходит быстро и безболезненно — не придется ждать, пока до их фичи дойдут руки нашей команды разработки.

© Habrahabr.ru