Лучшие практики для многопоточной обработки записей базы данных

Homebrew имеет несколько уровней фильтрации переменных среды. Первое, что встречается, относится к предыдущей версии вашего вопроса, где у вас была переменная GITLAB_HOMEBREW_TOKEN. Первоначальная фильтрация Homebrew позволяет только определенным переменным среды проходить через команды brew, чтобы избежать загрязнения среды сборки. Таким образом, GITLAB_HOMEBREW_TOKEN не будет передано, потому что оно не начинается с HOMEBREW_ (или не соответствует никаким другим переменным из белого списка).

Второй уровень фильтрации - это тот, который вы в данный момент используете, когда «чувствительные» переменные среды фильтруются , если они соответствуют следующему регулярному выражению Ruby:

/(cookie|key|token|password)/i

Поскольку переменная имеет ключевое слово TOKEN в имени переменной, которую она отфильтровывает прежде, чем достигнет вашей формулы.

Короче говоря, вам нужно использовать другое имя переменной среды, которое начинается с с HOMEBREW_, например:

HOMEBREW_GITLAB_SECRET=secretsquirrel brew install Pouet

, и вы будете иметь доступ к это в коде Ruby вашей Формулы.

См. Также https://docs.brew.sh/Formula-Cookbook#using-environment-variables для справки о типах фильтрации переменных среды, которая существует.

14
задан Drew Noakes 19 February 2009 в 23:19
поделиться

5 ответов

Шаблон, который я использовал бы, следующие:

  • Создайте столбцы "lockedby" и "locktime", которые являются идентификатором потока/процесса/машины и устанавливают метку времени соответственно (Вам будет нужен идентификатор машины при разделении обработки между несколькими машинами),
  • Каждая задача сделала бы запрос, такой как:

    ОБНОВИТЕ taskstable НАБОР lockedby = (мой идентификатор), locktime=now (), ГДЕ lockedby ЯВЛЯЕТСЯ ПУСТЫМ идентификационным ПРЕДЕЛОМ ORDER BY 10

Где 10 "пакетный размер".

  • Затем каждая задача делает ВЫБОР для обнаружения, какие строки она "заблокирована" для обработки и обрабатывает их
  • После того, как каждая строка завершена, Вы устанавливаете lockedby и locktime назад к ПУСТОМУ УКАЗАТЕЛЮ
  • Все это сделано в цикле для стольких пакетов, сколько существуют.
  • Задание крона или запланированная задача, периодически сбрасывает "lockedby" любой строки, locktime которой является слишком длинным назад, поскольку они были, по-видимому, сделаны задачей, которая зависла или отказала. Кто-то еще затем возьмет их

ПРЕДЕЛ 10 является конкретным MySQL, но я думаю, что другие базы данных имеют эквиваленты. ORDER BY является импортом для предотвращения запроса, являющегося недетерминированным.

10
ответ дан 1 December 2019 в 13:48
поделиться

Хотя я понимаю намерение, я не согласился бы относительно попытки расположить в ряд уровень, блокирующий сразу. Это уменьшит Ваше время отклика и может на самом деле сделать Вашу ситуацию хуже. Если после тестирования Вы видите проблемы параллелизма с APL, необходимо сделать повторяющееся перемещение к блокировке “datapage” сначала!

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

DOL, datarow блокирующее использование намного больше блокировок, чем allpage/page блокировка уровня. Издержки в управлении всеми блокировками и следовательно уменьшение доступной памяти из-за запросов на большее количество структур блокировки в кэше будет уменьшать производительность и противостоять любым усилениям, которые Вы можете иметь путем перемещения в более параллельный подход.

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

Так короче говоря не перемещайтесь в datarows, непосредственно пробуют Ваш подход параллелизма сначала затем, если существует использование проблем datapage блокировка сначала затем последнего средства datarows.

4
ответ дан 1 December 2019 в 13:48
поделиться

Необходимо включить row level locking на таблице с:

CREATE TABLE mytable (...) LOCK DATAROWS

Затем Вы:

  • Начните транзакцию
  • Выберите свою строку с FOR UPDATE опция (который заблокирует его),
  • Сделайте то, что Вы хотите.

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

P. S. Служебные проблемы некоторого упоминания, которые могут следовать из использования LOCK DATAROWS.

Да, существуют издержки, хотя я едва назвал бы их проблемой для таблицы как это.

Но если Вы переключаетесь на DATAPAGES затем можно заблокировать только одну строку на PAGE (2k по умолчанию), и процессы, строки которых находятся на одной странице, не сможет работать одновременно.

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

Параллелизм процесса имеет намного больше значения для дизайна как этот.

2
ответ дан 1 December 2019 в 13:48
поделиться

Преобразуйте процедуру в единственный SQL-оператор и обработайте несколько строк как единый пакет. Это - то, как базы данных, как предполагается, работают.

0
ответ дан 1 December 2019 в 13:48
поделиться

Самый очевидный путь блокирует, если Ваша база данных не имеет блокировок, Вы могли бы реализовать его сами путем добавления поля "Locked".

Некоторые способы упростить параллелизм состоят в том, чтобы рандомизировать доступ к необработанным объектам, таким образом, вместо конкуренции на первом объекте, они распределяют доступ случайным образом.

1
ответ дан 1 December 2019 в 13:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: