Серия "Войдём на большой завод вместе" - дизайн системы Seckill

Java Redis задняя часть
Серия "Войдём на большой завод вместе" - дизайн системы Seckill

Чем больше вы знаете, тем больше вы не знаете

Ставьте лайк и смотрите снова, формируйте привычку

GitHubоткрытый источникgithub.com/JavaFamilyЕсть карты мозга и личная контактная информация для интервью с крупными заводами первой линии.Добро пожаловать в Star и советы.

болтовня

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

Что касается меняRedisЭто очень распространено в процессе разработки.Он будет использоваться для хранения горячих данных и улучшения общей производительности, но, как я уже сказалТехнологии — это палка о двух концах, будет много проблем связанных с их использованием.Я сталкивался с ними в старом клубе Double TwelveКэш ЛавинаИз-за этой проблемы общий сервис был недоступен в течение 3 минут. Все должны знать данные Alibaba Double Eleven за этот год. Сколько стоят эти 3 минуты в настоящее время? На самом деле не могу себе представить.

RedisВ качестве примера возьму Наггетс, не знаю, правильно ли это, но мое визуальное наблюдение верно.

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

Популярные статьи обычно видят все, т.Данные точки доступа, сделай там кеш, ему такой высокий не нуженв реальном времениДа, тогда список статей ниже - это последние опубликованные статьи, которые имеют характеристики высокой производительности в реальном времени.Люди, которые посещают больше и помещают их в кеш, также могут снизить нагрузку на БД. Я не знаю, если Во всяком случае, Наггетс делают это по той причине, что это имеет смысл.

какой сценарий используетсяRedis — более сложная сцена, и требуетМного промежуточного программного обеспеченияиБизнес-логикаСотрудничать?

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

рыбы

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

Закладывая хороший фундамент, можно писать лучший код! В противном случае подождите, пока тест продукта вас не поразит.

текст

Перед проектированием системы нам необходимо подтвердить, как выглядит наш бизнес-сценарий.Возьмите всех, чтобы представить себе сценарийВ порядке.

Сцены

Сейчас мы продаем 100 из следующихдетские подгузники, а затем, основываясь на данных и опыте предыдущих пиковых мероприятий, за этими 100 подгузниками пришли полные 100 000 человек. (Антарктические люди зарабатывают деньги!)

Как только вы это слышите, все кончено, как наш сервер может это выдержать! Честно говоря, прямое попадание в БД определенно зависнет. Но не волнуйтесь, естьтеплый человекАо Бин здесь, мы должны подумать об этом, прежде чем мы начнемкакие проблемы возникнут?

проблема

Высокий параллелизм:

даВысокий параллелизмЭто момент, о котором нам даже не нужно думать. Так много людей приходят в одно мгновение. Когда это не высокий параллелизм?

Правильно, это характеристика шиповочень короткое время,Мгновенное большое количество пользователей.

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

Всем известно, что если маркетинг на месте, цена привлекательна, а трафик в сотни тысяч вообще не проблема, то автономныйRedisЧувствую, что QPS в 3-4Вт еще выдержит, но каким бы высоким он ни был, нет возможности сделать, то эти данные могут быть больше, чем всплеск хот-продаваемой продукции.

Запросов поступает большое количество, и нам нужно учитывать множество моментов.Кэш Лавина,разбивка кеша,проникновение в кешВсе пункты, о которых я упоминал ранее, возможны. Если есть проблема, будет очень сложно повесить БД. Если событие не удается, пользовательский опыт плохой, и популярность события уходит. В конце концов, вина все еще на нем.развивать.

Перепроданность:

Но если это шип, я боюсьперепродан, я тут просто в качестве примера привожу подгузники.Если заменить на 100 Huawei MatePro30, бюджет продавца может продать 100, чтобы заработать немного денег и создать импульс.В результате, если вы напишете не ту программу и продадите еще 200, вы не будете грузить пользователя.жаловаться на тебя,Платформазакрой свой магазин, вы отправляете этопотеря крови,что бы вы сделали?
(Можно читать статью Ао Бина, и я не боюсь)

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

Вредоносный запрос:

Твоя цена такая низкая, если я возьму ее, я ее продам.заработанная кровью? Даже если я не продам, я не в убытке, пользователь знает, вы знаете, другие люди со скрытыми мотивами (хакеры, спекулянты...) тоже должны знать.

Это легко, я знаю, когда вы собираетесь это сделать, я создам десятки машин и напишу несколько сценариев, а также смоделировал запросы примерно от 100 000 человек. Значит ли это, что у меня в основном 80% успеха? .

Реальная ситуация может быть намного сложнее, потому что скорость машинных запросов часто намного превышает скорость человеческих рук.В Аобинге, Гуйчжоу, я каждый год еду домой, чтобы купить билеты на высокоскоростную железную дорогу.второй светДа, не знаю, есть ли в этом заслуга спекулянтов, хочу вас диссить, спекулянты. Если вы не сможете достать билеты на концерт Джея, я вас тоже диссирую.

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

Но мне трудно вернуться домой без спекулянтов У нас в Юньгуйчуань, как и у меня, слишком много детей, которые хотят вернуться домой на Китайский Новый год 555!

Экспозиция по ссылке:

Первые несколько вопросов могут быть хорошо поняты всеми.Когда вы видите это, некоторые друзья могут быть более сбиты с толку, что это такое?Ссылка экспозицииА?

Я полагаю, что все студенты, изучающие разработку, знакомы с этим экраном. Любой, кто хоть немного разбирается, может открыть Googleрежим разработчика, а затем посмотрите код вашей веб-страницы, у некоторых есть URL-адреса, но когда я пишу VUE, событие срабатывает, а затем я вызываю интерфейс в файле, чтобы увидеть исходный код, но я могу нажатьПроверьте адрес вашего запросаАх, но вы, кажется, можете сделать кнопку серой перед секкиллом.

Все равно это опасно, вы там все блокируете, вы продаете эту вещь слишком дешево, заманчиво, вы можете гарантироватьнежелание развиваться? Разработчик знает адрес и запрашивает его заранее, когда его убивают. . . (Развитие: Почему ТМ снова это я)

база данных:

Десятки тысяч или даже сотни тысяч в секундуQPS(запросов в секунду) напрямую кбаза данных, в принципе вам придется убить библиотеку, а ваша служба не только для seckill, но и включает в себя другие бизнесы, вы не сделалиДаунгрейд, ограничение тока, предохранительЧто, тусоваться с остальными, может для небольшой компанииОбщий сбой 404.

Да и вообще, как ни убивай за секунды, больше ничего не повесь, правильно, программиста не убьешь, если повесишь трубку.

Программист: Я такой сложный!

Перечислены проблемы, затем как спроектировать и как решить эти проблемы, это следующее, что нужно рассмотреть, мы назначим правильное лекарство.

Служба единоличной ответственности:

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

Что вы имеете в виду, все знают, что дизайн сейчасДизайнерское мышление микросервисов, затем используйтеМетод распределенного развертывания

То есть существует служба заказа, когда мы размещаем заказ, пользовательская служба, такая как управление входом в систему и т. Д., Так почему бы нам не открыть службу для seckill, мы помещаем код бизнес-логики seckill вместе.

Создайте базу данных для него одного, и нынешнее развертывание архитектуры ИнтернетаФилиальная библиотекаДа то же, что сервис заказа соответствует библиотеке заказов, а также мы строим для него собственную библиотеку seckill.

Что касается таблицы, это зависит от того, как вы ее спроектируете, вам все равно нужно установить индекс в том месте, где должен быть установлен индекс, и не забудьте использовать его после того, как вы его построите.explainВзгляниSQLплан выполнения. (Для тех, кто не знает, я расскажу о главе MySQL)

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

Шип связи с солью:

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

Я знаю URL-адрес, поэтому я могу постоянно получать самое последнее пекинское время через программу, которая может достигатьмиллисекундный уровеньДа, я сделал запрос в 00 миллисекунд, осмелюсь сказать, что вероятность успеха ваших ручных точек определенно намного выше, и я могу отправить N запросов за одну миллисекунду. Может быть, вы продаете 100 товаров, и я возьму их все.

Как избежать этой ситуации?

просто, поставитьURL динамический, Даже человек, который пишет код, не знает, вы можете зашифровать случайную строку с помощью алгоритма шифрования, такого как MD5, чтобы сделать URL-адрес, а затем получить URL-адрес через интерфейсный код для прохождения фоновой проверки.

Нуан, чувак, я подготовил простое шифрование URL-адресов, чтобы все могли его попробовать.поставить лайк?

Кластер Redis:

Раньше я не говорил ни об одной машине.RedisЯ не могу этого вынести, тогда просто найди еще несколько братьев.Второе убийство - больше читать и меньше писать, чтобы ты сразу вспомнил, о чем я говорил тебе раньше,Кластер Redis,синхронизация ведущий-ведомый,разделение чтения-записи, давайте еще немногочасовой, наУпорствоПрямо непобедим и высокодоступен!

Нгинкс:

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

Совет: Насколько я знаю, крупный отечественный завод арендовал все серверы в Азии во время Весеннего фестиваля в прошлом году.Маленькие компании также любят покупать машины трафика во время Double Eleven, чтобы выдержать давление.

Считаете ли вы, что ваш кластер может работать намного лучше, чем этот?

Перехват злонамеренного запросаЕго тоже нужно использовать.Вообще количество запросов для одного пользователя слишком преувеличено, в отличие от искусственных запросов, которые приходится перехватывать на уровне шлюза.Иначе одно дело, если запросов слишком много и могут ли они захватить его или нет, нагрузка на сервер возрастет, и это может занять пропускную способность сети илиСбой сервера, сбой кешаи Т. Д.

Статический ресурс:

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

Кнопка управления:

Вы заметили, что перед спайком общие кнопкиположить серыйДа, нажимайте, только когда время истекло.

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

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

После того, как кнопку можно нажать, она должна стать серой на несколько секунд, иначе он продолжит нажимать после запуска.Вы смеете утверждать, что этого не было, когда вы шипели?

Ограничение:

Я думаю, что текущий лимит должен быть разделен наВходное ограничение токаиОграничение внутреннего тока.

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

Ограничение внутреннего тока: seckill должен включать в себя последующие операции, такие как генерация заказа и оплата, но только счастливчики, которым это удастся, перейдут к этому шагу.Как только 100 продуктов будут проданы, будет возвращено false, и интерфейс seckill завершится напрямую. Затем ваш сервер также отключает вмешательство последующих недействительных запросов.

Совет: Реальное ограничение тока также будет включать в себя добавление компонентов ограничения тока, таких как Ali Sentinel, Hystrix и т. д. Я не буду расширять это здесь, просто расскажу о физическом ограничении тока.

Разогрев инвентаря:

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

Развитие: Ты наконец подумаешь обо мне хоть раз.

Что тогда?

Мы все знаем, что базы данных не выдерживают, но его брат — нереляционная база данных.RedisМожет топ!

Это не просто Прежде чем мы начнем спайк, вы сдаете задания на время или эксплуатации и обслуживания одноклассников.Заранее загрузите перечень продуктов в RedisИдите, пусть весь процесс будет выполнен в Redis, а затем дождитесь окончания всплеска, а затем асинхронно измените инвентарь.

Но есть проблема с Redis, выше мы сказали, что используемМастер-раб, то есть мы будем читать инвентарь, а затем судить, а затем уменьшать инвентарь, когда есть инвентарь.Обычно это не проблема, но проблема высокого параллелизма является большой проблемой.

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

Продукт несколько раз! ! !Например, остался только 1 инвентарь.У нас высокий параллелизм.Опрошиваются вместе 4 сервера и выясняется, что есть еще 1. Потом все думают, что они сами его захватили, поэтому все вычитают инвентарь, и результат становится таким А -3, да только один реально расхватали, остальные перепроданы. Что делать?

Луа:

В предыдущей статье он кратко упоминался, поэтому сегодня я расскажу о нем немного больше.

LuaФункция скрипта является самой большой изюминкой Reids в версии 2.6.Благодаря встроенной поддержке среды Lua Redis решил долгосрочную неэффективную обработку.CAS(проверить и установить), а путем объединения нескольких команд можно легко реализовать шаблоны, которые ранее были сложными или неэффективно реализованными.

Скрипты Lua аналогичны транзакциям Redis, которые обладают определенной атомарностью и не будут прерываться другими командами, а также могут выполнять некоторые транзакционные операции Redis.Это ключ.

Зная принцип, мы напишем скрипт для записи операции оценки инвентаря вычета инвентаря в скрипте и отправим его в Redis, чтобы сделать это.После достижения 0 он вернет False, верно?Если один не сработает, вы модифицируете переключатель и напрямую блокировать все запросы и делать все остальное.

Ограничение тока, деградация, плавление и изоляция:

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

Снятие пиков и заполнение впадин:

Как только этот термин упоминается, многие друзья узнают его, верно?MQ, вы покупаете меньше вещей, вы прямо запрашиваете 100 запросов на изменение библиотеки, я думаю, это не проблема, но если вы убьете 10 000 за одну секунду, что насчет 100 000? Сервер зависает,Программисты снова должны взять на себя вину.

Подсказка:Может быть, маленький друг сказал, что наш бизнес не может достичь таких масштабов, так что это не нужно. Но я хочу сказать, что когда мы пишем код, мы не должны писать код с логическими лазейками.По крайней мере, в будущем компания будет расти в размерах, и другим не нужно будет менять код на первый взгляд.На первый взгляд, автор кода Ао Бинг? Что-то!

Вы можете поставить его в очередь сообщений, а затем изменить инвентарь с небольшим потреблением, но для одного продукта достаточно одного изменения.Несколько продуктов одновременноСцена совместного убийства друг друга очень похожа на Double Eleven.

Суммировать

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

(Если есть старший брат, дайте Ао Бингу больше идей, зайдите на GitHubgithub.com/JavaFamilyУпомяните это мне, а также мой контакт)

Наконец, я нарисую полную блок-схему, чтобы все могли подвести итоги!


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

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

(Эта глава действительно не для того, чтобы быть проститутками даром, каждый раз, когда вы ее читаете, она вам не нравится, вы хотите меня проституировать даром? Ты хороший и плохой, но мне это нравится)

Суммировать

Давайте играть и играть, давайте играть, а не высмеивать интервью.

Спайк — это не обязательно то, о чем спросит каждый одноклассник, по крайней мере, точно неОсновы RedisТак часто спрашивают, но раз спросили, надо отвечать по существу.

По крайней мере, ты должен сказатьвозможные ситуации,Ситуации, о которых следует знать, и дляРешения и решения.

Наконец, вам необходимо ознакомиться со всей ссылкой. Обратите внимание, что это полная ссылка. Как устроен внешний интерфейс? Роль шлюза?Решите конкуренцию параллелизма RedisКакие,Как синхронизировать данныеАх,Роль MQКакие.

(Упоминается, что MQ - это целая ссылка знаний, таких как асинхронность, пиковое бритье, развязка и т. д., поэтому в интервью мы все же не боремся с сомнительной победой)

прощаться со слезами

Серия RedisНа этом я очень хочу со всеми попрощаться.Я написал 7 статей.На самом деле мне очень нравятся идеи и клипы многих больших парней.На самом деле всем видно,что мои статьи имеют очень сильный личный стиль и цвет, каким я являюсь в своей жизни. Говоря, я также надеюсь использовать этот стиль, чтобы сделать изначальную скучную точку знаний, чтобы каждый мог читать ее с удовольствием, как чтение романа. Я не знаю, как все себя чувствуют, пожалуйста оставьте мне сообщение, если это хорошо или плохо.

я из этой серии напишу о себеGitHub github.com/JavaFamilyВсе точки знаний на картинке, побеспокою вас позаботиться о них в дальнейшем.Пишу в свободное время, а в основном вношу вклад в выходные и вечера.Я тоже новичок и многие моменты не трогал, поэтому я также хочу читать книги.Вы можете написать это только после прочтения информации, поэтому иногда я надеюсь, что вы будете терпеть меня.

Тогда увидимся в следующий раз!

Пишите в следующем выпуске____?

Не скажу тебе, ха-ха!

Обратите внимание, не потеряйтесь

Хорошо всем, это все содержание этой статьи. Люди, которые могут видеть это здесь, всеталант.

Каждую неделю я буду обновлять несколько статей, связанных с интервью и общими технологическими стеками ведущих интернет-компаний, большое спасиботалантМы можем видеть здесь, если эта статья хорошо написана, я думаю, что «Ао Бин» ячто-тоеслиПожалуйста, лайкните 👍 Пожалуйста, следите за ❤️ поделитесь пожалуйста 👥Это правда для меняочень полезно! ! !

Проституция нехороша, творить нелегко,Ваша поддержка и признание — самая большая мотивация для моего творчества, увидимся в следующей статье!

Ао Бин | Текст [Оригинал]

Если в этом блоге есть какие-либо ошибки, пожалуйста, критикуйте и советуйте, это очень ценится!


Статья постоянно обновляется каждую неделю, вы можете искать в WeChat "Третий принц Ао Бин"Читать и запрашивать обновления в первый раз (на одну-две статьи раньше, чем в блоге), эту статьюGitHub github.com/JavaFamilyОн был включен, есть карта разума точек интервью заводов первого уровня, а также я организовал много своих документов. Добро пожаловать в Звезду и совершенствуйтесь. Каждый может обратиться в тестовый центр для ознакомления. Надеюсь мы можем иметь что-то вместе.