Точки расширения¶
Подсистема задумана как неизменяемое ядро: обновление должно накатываться поверх, не затрагивая прикладные доработки. Поэтому всё, что зависит от конкретного внедрения, вынесено в две точки — обработку обмена и общий модуль КафкаПереопределяемый.
Это не условность: в конфигурации поставщика КафкаПереопределяемый — один из двух объектов, открытых для изменения, и единственный, через который меняется общее поведение ядра. Остальные модули закрыты правилами поддержки.
Переопределять функции можно двумя способами, оба официальные:
- правкой самого модуля — объект открыт, снимать конфигурацию с поддержки не нужно;
- расширением конфигурации — когда доработки удобнее держать отдельно от основной конфигурации.
Второй способ обычно предпочтительнее: обновление подсистемы вообще не затрагивает расширение, и при слиянии не приходится разбирать изменения в модуле.
КафкаПереопределяемый¶
| Функция | Поведение по умолчанию | Зачем переопределять |
|---|---|---|
ЭтоБэкап() |
Ложь |
отличить копию рабочей базы от рабочей |
РазрешенОбменБэкапов() |
Истина |
запретить обмен в копиях |
ПолучитьОбработку(Шина) |
Обработки[Шина.Обработка].Создать() |
брать обработчик из расширения или подменять его |
ГруппаПолучателей() |
идентификатор информационной базы | задать своё имя группы получателей |
ПользовательПоУмолчанию() |
идентификатор информационной базы | другое имя пользователя SASL по умолчанию |
ИдентификаторИнфобазы() |
имя_базы@имя_кластера из строки соединения |
своя схема идентификации базы |
ИмяИнфобазы() |
имя базы из строки соединения | то же для случаев, где кластер не нужен |
Идентификатор информационной базы используется как client.id, как имя группы получателей и как имя пользователя SASL по умолчанию. Определяется он одинаково в клиентских и фоновых сеансах.
Результаты кэшируются на время сеанса
Признак бэкапа и имя группы получателей читаются через модуль повторного использования и кэшируются до конца сеанса. Если переопределение зависит от данных, которые меняются на ходу, изменение подхватится не сразу.
Контур бэкапа¶
Копия рабочей базы, развёрнутая для тестов, сохраняет все настройки обмена — включая адреса брокеров и рабочие темы. Без защиты она начнёт отправлять данные в рабочий контур и вычитывать сообщения, предназначенные рабочей базе.
Защита включается переопределением ЭтоБэкап(). Обычно признак вычисляют, сравнивая текущую строку соединения с сохранённой в базе или проверяя имя кластера серверов.
Когда ЭтоБэкап() вернул Истина, поведение зависит от РазрешенОбменБэкапов():
РазрешенОбменБэкапов() |
Что происходит |
|---|---|
Ложь |
регламентный обмен не запускается: в журнал регистрации пишется предупреждение, пользователю выводится сообщение |
Истина |
обмен работает, но все имена тем получают префикс test- |
Подмена имени темы выполняется функцией КафкаСервер.Тема, поэтому она распространяется и на автоматический обмен, и на прикладной код, который эту функцию вызывает.
// В расширении конфигурации
Функция ЭтоБэкап() Экспорт
Возврат КафкаПереопределяемый.ИдентификаторИнфобазы() <> Константы.РабочийИдентификаторИБ.Получить();
КонецФункции
Тестовые темы должны существовать
Префикс test- не создаёт темы сам по себе. Их либо создают заранее в рабочем месте администратора, либо разрешают автосоздание тем на стороне брокеров.
Подмена обработчика¶
ПолучитьОбработку(Шина) определяет, как по реквизиту шины «Обработка» получить экземпляр обработчика. Переопределение нужно, например, чтобы включить возможность использования внешних обработок, или когда обработка выбирается по дополнительным условиям — например, разный для рабочего и тестового контуров.
Функция получает ШинаИнфо — структуру с настройками шины, и должна вернуть готовый объект обработки. Контракт возвращаемого объекта описан в разделе Обработчик обмена.