Дизайн системы Секилла

интервью Java
Дизайн системы Секилла

Ставьте лайк и смотрите снова, формируйте привычку и ищите в WeChat [Третий принц Ао Бин] Обратите внимание на этот инструмент человека, который борется за выживание в Интернете.

эта статьяGitHub github.com/JavaFamilyВключено, и есть полные тестовые площадки, материалы и мой цикл статей для интервью с производителями первой линии.

задний план

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

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

текст

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

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

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

проблема

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

база данных:

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

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

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

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

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

Начнем с передней части:

внешний интерфейс

Система seckill, как правило, представляет собой веб-страницу торгового центра, H5, APP и небольшие программы.

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

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

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

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

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

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

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

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

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

скажу позже.

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

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

Физический контроль:

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

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

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

После того, как кнопку можно нажать, она должна стать серой на несколько секунд, иначе он продолжит нажимать после запуска.

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

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

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

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

Продаем 1000 штук, в запросе 10Вт, нам не нужно ставить все 100000, можно поставить 1Вт запрос, а потом оперировать, потому что второй килл это черный ящик для самого юзера, так что вы делаете они Не понял, почему вы ставите 1 Вт вместо 1000, это потому, что некоторые пользователи потеряют немного шерсти.Что касается того, как судить, я расскажу об этапе контроля риска позже.

Нгинкс:

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

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

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

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

Контроль ветра

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

Так что же мне делать, непонятно?

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

У этого хакера действительно есть способ:поднять номер

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

что делать?

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

В предыдущем текущем лимите мы помещали 10 000 запросов, но наш реальный запас составляет только 1 000. Затем мы вычисляем 1 000 человек, которые, скорее всего, будут реальными пользователями, чтобы убить другие запросы, потому что второе уничтожение изначально является операцией черного ящика. Уровень не является перцептивным, поэтому дизайн позволяет реальным пользователям покупать вещи, а также может снизить вероятность быть заколотым.

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

задняя часть

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

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

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

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

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

Кластер Redis:

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

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

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

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

Что тогда?

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

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

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

** Несколько продуктов несколько раз! ! ! **Например, сейчас остался только 1 инвентарь.У нас высокий параллелизм.Мы вместе опросили 4 сервера и обнаружили, что 1 остался. результат получился в -3, да только один был реально схвачен, остальные перепроданы. Что делать?

Сделка:

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

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

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

Очередь сообщений (снижение пиков и заполнение впадин):

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

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

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

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

база данных

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

Чтобы построить базу данных только для seckill, чтобы обслуживать seckill, дизайн таблицы также максимально прост.Филиальная библиотекаиз.

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

Распределенная транзакция

Почему бы мне не поместить его в конец и не поставить в конце?

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

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

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

**Двухступенчатая (2PC), которую все считают не такой надежнойиПригодится трехэтапный (3PC) метод: они могут не гарантировать, что данные в конечном итоге непротиворечивы, но с эффективностью все равно все в порядке.

Суммировать

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

Наконец, если вы посмотрите на эту систему seckill, у вас могут появиться новые идеи: действительно ли система не так проста, как все думают, и у меня все еще есть некоторые детали, которые я упустил, что несомненно.

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

Суммировать

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

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

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

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

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

Я Ао Бин, чем больше ты знаешь, тем больше ты не знаешь, увидимся в следующий раз!

талантнаш【Три подряд】Это самая большая движущая сила для создания Ao Bing.Если в этом блоге есть какие-либо ошибки и предложения, вы можете оставить сообщение!


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