Распределенные системы

В распределённых системах интернационализация перестаёт быть локальной задачей одного приложения и превращается в координацию множества сервисов, слоёв доставки и сред исполнения. Форматирование дат, чисел, валют, сообщений и правил множественного числа должно оставаться согласованным между backend-сервисами, frontend-клиентами, edge-узлами и пакетными процессами.

Библиотека Globalize используется как слой унифицированной локализации поверх данных Unicode CLDR, обеспечивая предсказуемое форматирование в средах, где вычисления распределены и неоднородны.


Проблема согласованности локали в распределённой архитектуре

В монолитных приложениях локализация обычно зависит от одной версии библиотек и одного набора данных. В распределённых системах возникает несколько источников рассинхронизации:

  • разные версии CLDR-данных в сервисах
  • различия в Node.js и браузерных реализациях Intl
  • несогласованные настройки таймзон и локалей
  • кеширование на CDN с разной глубиной обновления
  • асинхронное обновление микросервисов

Даже одинаковая операция форматирования может давать разные результаты:

  • дата в API возвращается как ISO-строка
  • фронтенд форматирует её в локаль пользователя
  • edge-слой предварительно рендерит текст в другой локали

Globalize вводит слой детерминированного форматирования, основанный на явных данных CLDR, а не на скрытых возможностях окружения.


CLDR как распределённый источник истины

Globalize не содержит локализационных правил внутри ядра. Все правила извлекаются из Unicode CLDR:

  • форматы чисел
  • правила множественных форм
  • шаблоны дат и времени
  • валютные обозначения
  • символы и разделители

В распределённой системе CLDR превращается в версионируемый артефакт, который должен быть одинаковым для всех узлов.

Типичная проблема

Если сервис A использует CLDR 42, а сервис B — CLDR 44, возникают различия:

  • округление дробей
  • правила pluralization
  • форматирование длинных дат

Подход Globalize

Globalize предполагает явную загрузку CLDR-данных:

  • данные загружаются как JSON-ресурсы
  • версия фиксируется на уровне деплоя
  • отсутствует скрытое обновление логики форматирования

Таким образом достигается детерминированность между сервисами.


Распространение CLDR-данных в микросервисной архитектуре

В распределённых системах CLDR обычно доставляется одним из способов:

1. Пакетная сборка

CLDR включается в артефакт сервиса:

  • Docker image содержит локализационные JSON
  • каждый сервис самодостаточен
  • обновление требует пересборки

Преимущество — строгая воспроизводимость.


2. Общий CDN слой

CLDR хранится на CDN и загружается динамически:

  • уменьшение размера билдов
  • централизованное обновление
  • риск рассинхронизации кешей

3. Конфигурационный сервис

Отдельный localization service предоставляет:

  • версию CLDR по запросу
  • набор локалей для региона
  • фолбэк цепочки локалей

Кеширование и его влияние на локализацию

В распределённой среде кеширование становится источником несогласованности локализации.

Типичные уровни кеша

  • CDN кеш HTML/SSR
  • HTTP кеш API-ответов
  • in-memory кеш на уровне Node.js
  • service worker в браузере

Если форматирование выполняется до кеширования, возникает проблема:

  • один и тот же ресурс может содержать разные локализованные строки

Использование Globalize

Globalize снижает риск рассинхронизации за счёт:

  • детерминированного форматирования входных данных
  • отсутствия зависимости от runtime Intl кешей
  • явной загрузки правил

Детерминированность форматирования как контракт между сервисами

В распределённой системе форматирование часто становится частью API-контракта.

Пример проблемного подхода

Backend возвращает:

{
  "price": 1234.5
}

Frontend сам форматирует:

  • зависит от локали пользователя
  • зависит от версии браузера
  • зависит от Intl API

Контрактный подход

Backend и frontend используют одинаковую модель форматирования:

  • числовые правила берутся из CLDR
  • форматирование выполняется через единый слой

Globalize обеспечивает одинаковое поведение на всех уровнях, если CLDR синхронизирован.


Микросервисы и разделение ответственности локализации

В распределённой архитектуре локализация часто распределяется следующим образом:

  • billing-service: валюты и округления
  • order-service: даты и таймзоны
  • notification-service: текстовые шаблоны
  • frontend: финальное отображение

Без единого слоя возникают конфликты:

  • разные правила pluralization
  • разные форматы валют
  • несовпадение дат

Globalize выступает как библиотека-стандарт для JS-слоя, выравнивая поведение клиентских и серверных сервисов.


Таймзоны как источник распределённых ошибок

Форматирование времени — один из наиболее нестабильных элементов распределённых систем.

Проблемы:

  • сервер работает в UTC
  • клиент использует локальную таймзону
  • edge узел применяет региональную конфигурацию
  • API возвращает строки вместо timestamp

Globalize работает с датами через CLDR-шаблоны, но ключевой принцип в распределённой системе:

  • хранение времени в UTC
  • локализация только на границе представления

Message formatting и plural rules в распределённой среде

CLDR содержит сложные правила множественных форм, которые критичны для:

  • уведомлений
  • e-commerce интерфейсов
  • логистических систем
  • аналитических панелей

В распределённой системе важно, чтобы правило pluralization не зависело от среды исполнения.

Globalize использует CLDR plural rules, которые:

  • одинаковы на сервере и клиенте
  • не зависят от версии браузера
  • не используют встроенные эвристики JavaScript Intl

Edge computing и локализация ближе к пользователю

Edge-архитектуры усиливают проблему рассинхронизации локализации:

  • часть контента рендерится на edge
  • часть — в backend
  • часть — на клиенте

Результат без унификации:

  • разные форматы дат в одном интерфейсе
  • различие валютных символов
  • неодинаковые правила сокращений

Globalize позволяет переносить одинаковую логику форматирования на edge-узлы при условии синхронизации CLDR-данных.


Сериализация локализованных данных между сервисами

В распределённых системах критично различать:

  • сырые данные (raw)
  • локализованные представления (localized view)

Ошибка архитектуры:

  • передача уже отформатированных строк между сервисами

Правильный подход:

  • передача структурированных данных (числа, даты, коды валют)
  • локализация только на уровне presentation layer

Globalize усиливает этот подход, так как его API ориентирован на входные значения, а не готовые строки.


Версионирование локализации как часть CI/CD

В распределённых системах CLDR становится частью pipeline:

  • фиксируется версия CLDR
  • проходит тестирование snapshot-форматов
  • сравниваются эталонные локализованные строки

Типичный набор проверок:

  • формат валют
  • формат даты/времени
  • plural rules
  • отображение длинных чисел

Несовпадение версий CLDR между сервисами рассматривается как breaking change.


Типичные ошибки архитектуры локализации в распределённых системах

  • использование Intl без контроля версий окружения
  • смешивание локализованных и нелокализованных данных в API
  • кеширование HTML с уже применённой локализацией
  • отсутствие централизованного CLDR артефакта
  • различие форматов между backend и frontend

Стабильность пользовательского представления как результат системной синхронизации

В распределённой архитектуре локализация перестаёт быть задачей форматирования и становится задачей синхронизации данных, версий и правил между независимыми узлами.

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