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

May 22, 2018
Tweet

More Decks by Moscow Python Meetup

Other Decks in Programming

Transcript

  1. О ЦИАН - 11 млн покупателей и арендаторов в месяц

    - Ресурс федерального уровня - 10x разработка за 2014-2017 3
  2. Хранение настроек в Cassandra 7 CREATE TABLE cian.runtime_settings ( runtime

    text, key text, priority int, filter map<text, text>, value text, PRIMARY KEY (runtime, key, priority) ) WITH CLUSTERING ORDER BY (key ASC, priority ASC)
  3. @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
  4. 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
  5. Примеры использования фильтров 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 Для продуктовых нужд
  6. • Не требует перезапуска или перераскатки приложения • Централизованное хранение

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