Как спроектировать внутреннюю архитектуру центра конфигурации

Архитектура

Как спроектировать внутреннюю архитектуру центра конфигурации

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

Декомпозиция требования «центра конфигурации» заключается в том, чтобы отправить конфигурацию клиенту как можно быстрее. Итак, давайте сначала представим простейший сценарий:

Клиент и сервер поддерживают длинную цепочку.Когда конфигурация работает в фоновом режиме, конфигурация будет сохранена в виде K/V, а затем уведомлена обработчику.После того, как последний получит K/V, он будет будет передан клиенту, и весь процесс будет завершен. Это самая примитивная форма, и она будет развиваться на этой основе.

Что делать, если клиент находится в автономном режиме во время обновления конфигурации?

Длинная цепочка может только гарантировать (насколько это возможно), что клиент может получить значение центра конфигурации в первый раз, когда он подключен к сети, и ничего не может сделать, когда он не в сети (например, если приложение не открыто). ), поэтому необходимо найти способ получить его, когда пользователь откроет приложение в следующий раз. До последнего значения этот простой процесс заключается в сохранении дополнительного поля флага при сохранении K/V, чтобы указать, является ли K/V был успешно отправлен клиенту.

Работа с несколькими конфигурациями

Обычно существует более одной пары K/V, поэтому какие изменения будут вызваны несколькими конфигурациями, то есть несколькими парами K/V.

В настоящее время нам необходимо рассмотреть три вопроса: хранение, трафик и стратегии синхронизации.

место хранения

Пара К/В устройства обычно не превышает 100 элементов, а размер каждой пары не превышает 1К, то есть верхний предел размера, соответствующего устройству, составляет около 100К.Если количество устройств равно 1 миллионов, требуется 100G дискового пространства. Эта сумма все еще немного велика и может быть оптимизирована. Учитывая, что некоторые элементы конфигурации будут сосуществовать на нескольких устройствах, вы можете хранить эти конфигурации отдельно, а затем использовать хеш-значение в качестве значения. Предполагая, что размер ключа составляет 30 байт, а значение — 10 байт, требуется всего 40 МБ дискового пространства K/V. Поэтому из-за ограничений по хранению наш дизайн также нуждается в корректировке:

Но есть еще проблема, комбинаций Value будет много:

Например, исходное значение K1 — V1, а после обновления оно становится V2, поэтому вам нужно создать новый набор значений, а затем изменить V1 на V2, потому что я не знаю, есть ли другие устройства в предыдущий набор значений.Он будет постепенно накапливаться.Чтобы уменьшить это накопление, необходимо разработать алгоритм очистки, и сложность будет увеличиваться.

Давайте взглянем на дизайн Slice в языке Go.Slice использует массив внутри, но вы можете указать, какую часть массива использовать, которая на самом деле является индексом.

Таким образом, если ключ имеет новое значение, просто добавьте его после соответствующего ключа. В это время необходимо синхронно обновить индекс устройства. Это может занять некоторое время. Если все данные находятся в памяти, на самом деле все в порядке (поскольку хранится только индекс, поэтому объем данных может храниться в памяти). памяти), а сохраняемость может выполняться асинхронно.

поток

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

Данные сжаты

Это относительно простой и эффективный метод, и здесь следует учитывать несколько моментов: степень сжатия, скорость сжатия/распаковки и потребление ресурсов. Ссылаться наэта статья, его можно найтиlz4Это очень выгодно по времени сжатия/распаковки, и в то же время потребление ресурсов очень мало, то есть степень сжатия не слишком высока. иlzmaОн имеет более высокую степень сжатия, поэтому вы можете выбрать подходящую схему сжатия применительно к различным сценариям.

Так же будет проблема.Если каждый запрос сжимать, то эффективность слишком низкая, поэтому его нужно кешировать.Кэшированный Ключ на самом деле является хэшем Индексов Конфига(hash('1,2;2,0')). Таким образом, необходимо сохранить хэш-значение для всех индексов конфигурации, а затем найти соответствующий сжатый файл в соответствии с этим хэш-значением.

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

Другим распространенным решением для сокращения трафика является использование Diff.

использовать разницу

Один из способов справиться с Diff — поместить индекс K/V на клиенте, затем сравнить Diff двух индексов, а затем отправить клиенту реальное значение Diff для слияния. В этом случае возникнет проблема. Клиенту необходимо сообщить значение индекса своего текущего центра конфигурации, что включает в себя синхронизацию отчетов. Есть два способа:

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

Для второго случая, по сравнению с direct push, будет на один раунд коммуникации больше, и в то же время это несколько увеличит сложность (обработку Diff) для обоих концов, но преимущество в том, что можно сэкономить передачу данных на наибольшая степень.

несколько устройств

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

многомерный

Размер также является характеристикой устройства. Устройство будет иметь несколько функций, таких какiOS 11,v9.3.6Подождите, та же размер также будет содержать несколько устройств.

Целесообразнее использовать Set для проектирования размеров, т. к. порядок не имеет значения, а после изменения размера устройства в дальнейшем поиск будет очень быстрым (например, при обновлении устройства необходимо изменить размер устройства со старой версии на размер новой версии. ). Следовательно, необходимо проверить, нужно ли обновлять размерность устройства в подходящее время, и в то же время проверить, нужно ли отправлять конфигурацию, более целесообразно выполнять асинхронное выполнение после установления соединения.

обновление измерения

Если устройство обновляется с «размера 1» на «размер 2», как узнать, какие K/V необходимо обновить? Чтобы решить эту проблему, вы также можете создать таблицу для измерения, чтобы сохранить информацию о конфигурации, ключ — это имя измерения, а значение — индекс конфигурации.

резюме

Окончательный процесс и дизайн выглядят следующим образом:

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

Наконец, пожалуйста, ограничьте качество фотографий, блогеры постарались...


--EOF--

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