Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Централизованная система управления настройками в ЦИАН

Централизованная система управления настройками в ЦИАН

Дмитрий Жильцов (ЦИАН) @ Moscow Python Meetup 56

"В этом докладе я расскажу о том, как у нас в ЦИАН устроена централизованная система динамического конфигурирования приложений, в том числе и на Python, как она используется в различных окружениях и для разного рода задач (от сугубо технических до продуктовых). Основной упор будет делаться на реализацию этого механизма в Python".

Видео: http://www.moscowpython.ru/meetup/56/cian-options-management/

Moscow Python Meetup
PRO

May 22, 2018
Tweet

More Decks by Moscow Python Meetup

Other Decks in Programming

Transcript

  1. Централизованная система
    управления настройками в
    ЦИАН
    1

    View Slide

  2. О себе
    - Tech Lead в ЦИАН
    - В разработке 10 лет
    2

    View Slide

  3. О ЦИАН
    - 11 млн покупателей и
    арендаторов в месяц
    - Ресурс федерального уровня
    - 10x разработка за 2014-2017
    3

    View Slide

  4. Централизованная система
    управления настройками в ЦИАН
    4

    View Slide

  5. • Не требует перезапуска или перераскатки
    приложения
    • Централизованное хранение
    • Поддержка разных ЯП
    Зачем?
    5

    View Slide

  6. Общая схема
    6

    View Slide

  7. Хранение настроек в Cassandra
    7
    CREATE TABLE cian.runtime_settings (
    runtime text,
    key text,
    priority int,
    filter map,
    value text,
    PRIMARY KEY (runtime, key, priority)
    ) WITH CLUSTERING ORDER BY (key ASC, priority
    ASC)

    View Slide

  8. Хранение настроек в Cassandra
    8

    View Slide

  9. Старт приложения
    9

    View Slide

  10. @gen.coroutine
    def refresh_settings(self, timeout=2, repo=CassandraSettingsRepository()):
    # type: (float, BaseSettingsRepository) -> None
    settings = yield repo.get_all_settings(timeout=timeout)
    settings_dict = defaultdict(list)
    for setting in settings:
    settings_dict[setting.key].append(SettingService(setting))
    for k, settings in settings_dict.items():
    settings_dict[k] = sorted(settings, key=attrgetter('priority'), reverse=True)
    old_settings = self._settings
    self._settings = settings_dict
    yield self.call_watchers(old_settings)
    Обновление настроек
    10

    View Slide

  11. • application
    • server
    • url-path
    • environment
    • email
    Фильтры.
    11

    View Slide

  12. Алгоритм фильтрации
    12

    View Slide

  13. class BasePatternFilterService(BaseFilterService):
    _context_attr = None
    def __init__(self, value):
    # type: (str) -> None
    super(BasePatternFilterService, self).__init__(value)
    self._re = re.compile('^%s$' % value, re.IGNORECASE)
    def check(self, context):
    # type: (Context) -> bool
    context_value = getattr(context, self._context_attr)
    if context_value is None:
    return False
    return bool(self._re.search(context_value))
    Фильтры
    13

    View Slide

  14. response = api_request(
    method='GET',
    url=urljoin(getattr(runtime_settings,
    'REALTY_BILLING_INTEGRATION_API_URL’),
    '/v1/billing/operations-list/'),
    params=params,
    timeout=getattr(runtime_settings,
    'BILLING_OPERATIONS_LIST_TIMEOUT', 1.0),
    )
    Использование в коде
    14

    View Slide

  15. Примеры использования фильтров
    15
    python | HTTP_TIMEOUT | 0 | null | 0.2
    python | HTTP_TIMEOUT | 1 | {“application”: “app1”} | 0.5
    python | HTTP_TIMEOUT | 2 | {“application”: “app1”, “url-path”: “api/v1/lvery_slow_method”} | 1
    Для технических нужд
    python | ALLOW_EXP1 | 0 | null | False
    python | ALLOW_EXP1 | 1 | {“email”: “[email protected]”} | True
    Для продуктовых нужд

    View Slide

  16. • Не требует перезапуска или перераскатки приложения
    • Централизованное хранение
    • Поддержка разных ЯП
    Что в итоге получили?
    16
    • Быстро и с гарантиями хранения
    • Возможность навесить свои callback на изменение настроек
    • Встроенные фильтры
    • Интеграция с инструментами CI/CD
    • Работает в микросервисах и монолитах
    И как бонус...

    View Slide

  17. ?
    email: [email protected]
    facebook: https://www.facebook.com/zaabjuda
    github: https://github.com/zaabjuda

    View Slide