Рубрики
Uncategorized

Яма таймера Кронтаба в swift

Автор оригинала: David Wong.

В эти два дня босс потребовал синхронизировать горячие данные торгового центра с кешем redis. Наш проект использует фреймворк swift, поэтому я думаю об использовании таймера Crontab фреймворка. Но во время теста было обнаружено, что переполнение памяти было обнаружено, когда размер таблицы был установлен на 1024 (фактически, он был установлен на тот же размер, с объяснением Свула).

Популяризация таблицы (из документов swool): Нижний слой таблицы представляет собой структуру данных хэш-таблицы, основанную на общей памяти. Максимальное количество строк для $size определяет общее количество строк для хэш-таблицы. Поскольку таблица находится в общей памяти, она не может быть динамически расширена. Этот размер $должен быть установлен до его создания. Параметр $size указывает максимальное количество строк в таблице. Если размер $не равен N-й степени 2, например 1024, 8192, 65536 и т.д., Нижний уровень автоматически настроится на близкое число. Если оно меньше 1024, то по умолчанию оно равно 1024, то есть 1024-минимальное значение.

Прежде всего, взгляните на процесс выполнения рамочных задач:

  1. Во-первых, когда платформа запускается в течение одной секунды, таймер запуска обновляется для выполнения задачи один раз в секунду. Перед обновлением задачи важно очистить заполненные данные очереди в таблице памяти очереди.
  2. Затем получаются очереди во всех задачах (которые можно понимать как методы во всех классах задач), и ключевые значения каждой очереди задач шифруются правилами задач, классом задач, минутами и метками времени в режиме MD5 и сохраняются в таблице времени выполнения. (Исходная таблица и структура таблицы времени выполнения)

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

Если посмотреть на процесс выполнения задачи, то выполнение задачи очень простое.

  1. Сначала все квалифицированные задачи очереди помещаются в массив с помощью get Exec Tasks, а затем значение статуса выполнения изменяется на self:: НАЧНИТЕ с обхода данных.
  2. Затем выполняются все задачи очереди состояния выполнения со значением self:: START
  3. Измените значение состояния выполнения задачи очереди после выполнения на self:: ГОТОВО
  4. Наконец, значение статуса выполнения изменяется на self:: ЗАВЕРШЕНИЕ устранения.

Перестройте свою логику, Когда мы создаем новую задачу, система возвращается каждую секунду, чтобы обновить количество очередей в каждой задаче. Код выглядит следующим образом:

Из кода мы видим, что каждую минуту он добавляет 60 очередей задач в таблицу времени выполнения Но когда мы получаем задачи Getexect для выполнения целевой группы, мы отмечаем статус в соответствии с тем, равно ли текущее время времени выполнения или нет. Итак, теперь возникла проблема. Когда текущее время добавляет данные в очередь задач, он снова добавляет предыдущую очередь задач в таблицу времени выполнения. Возьмите каштан: Предположим, у меня есть асинхронная синхронизация задач, в которой есть задача cron метода, которая выполняется один раз в секунду. Сейчас время 2019-03-22 10:01:20. Теперь при обновлении таблицы времени выполнения он добавит в нее 60 ключей очереди задач. Они будут MD5(” “.’Rsync’.’Задача cron’.’01’.’00’) MD5(” “.’Rsync’.’Задача cron’.’01’.’01’) MD5(” “.’Rsync’.’Задача cron’.’01’.’02’) MD5(” “.’Rsync’.’Задача cron’.’01’.’03’) MD5(” “.’Синхронизация’.’кронТаск’.’01’.’04’) … MD5(”

Когда время перейдет к следующей секунде (2019-03-22 10:01:21), ключевое значение данных таблицы времени выполнения все равно будет обновлено. MD5(” “.’Rsync’.’Задача cron’.’01’.’00’) MD5(” “.’Rsync’.’Задача cron’.’01’.’01’) MD5(” “.’Rsync’.’Задача cron’.’01’.’02’) MD5(” “.’Rsync’.’Задача cron’.’01’.’03’) MD5(” “.’Rsync’.’Задача cron’.’01’.’04’) … MD5(” “.’Синхронизация”.”Задача cron’.’01’.’59’)

Таким образом, мы ясно видим, что данные до 2019-03-22 10:01:21 секунды бесполезны. Эти данные никогда не будут использованы или удалены. Таким образом, через некоторое время произойдет переполнение памяти. Таким образом, решение состоит в том, чтобы очистить данные с истекшим сроком действия, одновременно очищая данные о потреблении. Поместите чистую таблицу выполнения в ____________

if ($value['runStatus'] === self::FINISH) {

Изменить на

$currentTime = time();
if ($value['runStatus'] === self::FINISH || $value['sec'] < $currentTime) {

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