Краткое обсуждение структуры инвентаря в системе купонов на скидку

задняя часть

Активность запасов купона активность, как правило, делятся на: общий запас и запасы запасов. Когда пользователь должен получать купоны, вам необходимо определить текущий день общего запаса и избыток адекватности адекватности инвентаров, если это достаточное количество отчислений инвентаря, или подскажите пользователю получать отказ. Общий день инвентаризации и инвентаризации - это атомная операция, либо все преуспевает, либо не удастся. Мы знаем, что транзакция базы данных для удовлетворения «кислотных» свойств, поэтому могут ли эти две операции в транзакции осуществляться.

Оригинальный дизайн сцены

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

Учитывая масштабируемость модуля системной базы данных, мы используем метод «сегментирования» данных для «сегментирования» данных в соответствии с конкретным бизнес-идентификатором, Например, мы можем сегментировать наши данные в соответствии с номером действия, чтобы общий запас и ежедневная инвентаризация одной и той же деятельности попадают в базу данных, которая может быть преобразована в транзакцию. Мы не используем распределенные транзакции из соображений производительности.

Преимуществами такой конструкции системы являются: простая реализация и строгая согласованность инвентаризации (гарантированная транзакциями); но ее недостатки также очевидны: при открытии транзакции MySQL добавит блокировки строк к общей инвентаризации и ежедневной инвентаризации (механизм хранения InnoDB). , блокировки строк являются эксклюзивными, и все остальные транзакции должны ждать до фиксации одной транзакции. Поэтому, хотя в нашей системе предусмотрена многопоточная параллельная обработка запросов при получении купонов, все запросы при обновлении базы по-прежнему "сериализовать". Если предположить, что нам требуется 10 мс для обновления общего запаса и ежедневного запаса за раз, то максимальный запрос "TPS" системы для каждого действия составляет всего 100, что много для некоторых "горячих" действий. это было невыносимо.

Вычет инвентаризации базы данных Redis в памяти

Redis — это высокопроизводительная распределенная система кэширования, которую можно использовать как в качестве кэша, так и в качестве базы данных в памяти. Он характеризуется чрезвычайно высокой производительностью, поскольку операции являются чисто операциями с памятью. Одна машина может достигать максимального количества запросов в секунду 10 Вт, что уже соответствует требованиям для общей системы. «У каждой медали две стороны», хотя Redis обладает чрезвычайно высокой производительностью, у него также есть недостатки. Например, транзакции Redis не могут гарантировать характеристики «ACID» транзакций, таких как MySQL, а транзакции Redis обеспечивают согласованность в ACID (C) и изоляцию. (I), но не гарантируется атомарность (A) и долговечность (D). Это может вызвать проблемы, например, при вычете запасов сначала вычесть общий запас, а затем вычесть ежедневный запас. Предполагается, что общий вычет запасов выполнен успешно, а ежедневный вычет запасов не выполнен. Redis не имеет механизма отката, поэтому даже если транзакция завершится неудачно, весь запас нельзя будет откатить, что вызовет проблемы.

Высокая доступность Redis

Redis поддерживает кластерное развертывание.Кластер Redis имеет слоты 16384. Рассчитав контрольную сумму CRC16 ключа, а затем по модулю 16384, можно получить, на какой слот приходится ключ (CRC16(key)% 16384). Если один узел Redis не может храниться, вы можете рассмотреть возможность использования кластера Redis для вычета запасов. Репликация master-slave между главным узлом и подчиненным узломSentinelВыполните отказоустойчивость.

Redis синхронно вычитает инвентарь и асинхронно синхронизируется с решениями базы данных.

Хотя Redis предоставляет схему настойчивости (RDB, AOF), для некоторых важных бизнес-данных, схема настойчивых redis само по себе может быть недостаточно. Нам нужно асинхронно синхронизировать данные инвентаризации, записанные в Redis в базу данных. В крайних случаях Redis зависает, а база данных используется в качестве «учетных данных». Поэтому, в соответствии с потребностями бизнеса, вы можете рассмотреть вопрос о запуске фоновой задачи для периодической синхронизации данных инвентаризации, записанные в Redis в базу данных.