Мало знаний, большой вызов! Эта статья участвует в "Необходимые знания для программистов«Творческая деятельность
Эта статья участвовала в "Проект «Звезда раскопок»”, чтобы выиграть творческий подарочный пакет и бросить вызов творческим поощрительным деньгам.
Эта статья участвует в "Боевой рекорд оптимизации производительности"Тема заявки на доклады
Ставьте лайк и смотрите снова, формируйте привычку.
Эта статья включена вgithub-JavaExpert, который содержит мою серию статей, банк вопросов для интервью, материалы для самостоятельного изучения, электронные книги и т. д.
предисловие
Всем привет, я а.
Сегодня я поделюсь проблемой, с которой столкнулись фанаты на второй стороне Meituan — как спроектировать лотерейную систему на миллион человек?
карта разума
Когда я недавно общался с такими экспертами, как Байт Диди, в группе по обмену мнениями о том, как лучше передавать знания фанатам, все согласились, что интеллект-карты способствуют созданию сети знаний.Отзывам фанатов также нравятся интеллект-карты, поэтому в следующей статье я попробую сопровождаться ментальной картой.
Исходный файл карты:GitHub.com/LBS тоже/Java E…
Карта объясняется от мелкого к глубокому.Архитектура никогда не проектируется, она развивается
От лотерейной системы с несколькими сотнями людей до десятков тысяч и миллионов постоянно добавляются новые вещи.
Окончательное резюмедизайн-мышление,СлишкомУниверсальный шаблон, так что интервьюер спрашивает о любой системе с высокой степенью параллелизма и должен учитывать только эти направления.
[toc]
V0 — монолитная архитектура
Если вам сейчас разрешено внедрить лотерейную систему с десятками людей, то умереть легко, а ударить можно сильно!
Два кота и один дельфин гуляют по рекам и озерам, выигрывают в лотерею и заходят на склад, настраивают службу уведомлений, проверяют уведомления библиотеки, отлично!
Я думаю, что каждый мог сделать такой случай при изучении java, Подумайте об этом 🤔 В чем проблема?
- Единая служба, вы потеряете все, если случайно
- Качать и качать, один человек - армия
- Вредоносные скрипты, нет приза, который не могли бы выиграть программисты
Далее поговорим о том, как решить эти проблемы?
V1 — Балансировка нагрузки
Когда количество посещений сервера в единицу времени больше, нагрузка на сервер больше, а когда оно превышает собственные возможности, сервер выйдет из строя.
Чтобы избежать сбоев сервера и предоставить пользователям лучший опыт, мы разделяем нагрузку на сервер с помощью балансировки нагрузки.
Балансировка нагрузки заключается в создании большого количества серверов для формирования серверного кластера.Когда пользователь обращается к веб-сайту, он сначала обращается к промежуточному серверу, например, к обслуживающему персоналу, который выбирает сервер с меньшей нагрузкой в кластере серверов, а затем вводит запрос доступа к серверу.
Таким образом, доступ каждого пользователя гарантирует, что нагрузка на каждый сервер в кластере серверов будет сбалансирована, разделяя нагрузку на сервер и избегая ситуации сбоя сервера.
Балансировка нагрузки реализована по принципу «обратного прокси». Конкретный алгоритм балансировки нагрузки и его реализация будут продолжены ниже.
Хотя балансировка нагрузки решает проблему непреднамеренной потери одной архитектуры, стоимость сервера по-прежнему не может обеспечить всестороннюю защиту системы.Мы должны подумать о том, как обеспечить удобство работы пользователей после выхода сервера из строя.
То есть, как облегчить большое количество запросов в момент розыгрыша лотереи.
V2 - Ограничение рабочего тока
Основная функция ограничения тока — защитить узлы службы или узлы данных за кластером и предотвратить сбой службы и данных из-за чрезмерного мгновенного трафика (например, большого количества интерфейсных кэшей), что приводит к недоступности.
Может также использоваться для сглаживания запросов.
В предыдущем разделе мы сделали балансировку нагрузки, чтобы обеспечить доступность кластера, но компании необходимо учитывать стоимость сервера.Увеличивать количество серверов без ограничений нельзя.Как правило, она будет рассчитана для обеспечения что нет проблем в повседневном использовании.
Смысл текущего лимита в том, что мыНевозможно предсказать неизвестный трафик, например, только что упомянутая лотерея может столкнуться:
- Повторить розыгрыш
- вредоносный скрипт
Некоторые другие сценарии:
- Горячие события (Weibo)
- Много рептилий
Эти ситуации непредсказуемы, я не знаю, когда придет 10-кратный или даже 20-кратный трафик. попробую)
Смысл ограничения тока прояснен, давайте рассмотрим как реализовать ограничение тока
Запретить пользователям повторять лотерею
Повторяющиеся розыгрыши и вредоносные сценарии могут быть сгруппированы вместе, при этом сотни тысяч пользователей потенциально могут делать миллионы запросов одновременно.
Если один и тот же пользователь отправляет несколько запросов на лотерею в течение 1 минуты, это считается злонамеренной повторной лотереей или скрипт проводит лотерею.Такой трафик не должен продолжать запрашиваться, и он должен быть напрямую заблокирован при балансировке нагрузки. слой.
в состоянии пройтиnginx
настроитьip
частота доступа или в комбинации на уровне шлюзаsentinel
Настройте текущую политику ограничения.
Статус лотереи пользователя можно сохранить через redis, о чем будет рассказано далее.
Блокировать недействительный трафик
Будь то лотерея или спайк, призы и товары ограничены, поэтому большое количество запросов, поступающих позже, на самом деле бесполезны.
Например, если лотерею разыграют 500 000 человек, а мобильники заготовят 100, то моментально хлынет 500 000 запросов, по сути, первые 500 запросов вырвут мобильник, и незачем ему делать бизнес за последующие сотни тысяч запросов.Логика,просто насильно перехватить и вернуть до конца лотереи.
В то же время интерфейс также может делать некоторые статьи по серой кнопке.
Тогда подумайте, как узнать, что призы разыграны, то есть проблема синхронизации данных перед инвентаризацией и заказом.
Снижение качества обслуживания и прерывание обслуживания
С вышеперечисленными мерами это невозможно? Поэтому на стороне сервера есть механизм понижения версии и прерывания цепи.
Вот простое дополнение, пожалуйста, продолжайте обращать внимание на автора для деталей.
Есть много людей, которые легко путают эти два понятия.Пусть каждый разберется на маленьком примере:
Предположим теперь, что количество подписчиков статьи превышает 1 миллион, и она бросается в горячий поиск Weibo, поклонник А и поклонник Б оба открывают Weibo для просмотра, но А видит содержание пресс-конференции, а Б видит, что «система занят", а через некоторое время Да, B также может видеть контент.
(Пожалуйста, позвольте фантазии 😎)
В вышеописанном процессе, во-первых, горячее время вызвало большое количество запросов, и сервис был взорван.Чтобы обеспечить доступность всей системы, был принесён в жертву некий пользователь B. Видимая B "система занята" происходит деградация сервиса (fallback), а через некоторое время будет Восстановление доступа, что также является особенностью автоматических выключателей (hystrix)
Статус синхронизации V3
Тогда вернитесь к вопросу в предыдущем разделе, как синхронизировать статус лотереи?
Это должно быть упомянутоredis
, которая широко используется в качестве базы данных кэша для систем с высокой степенью параллелизма.
Мы можем реализовать это общее состояние лотереи на основе Redis, который очень легковесен и подходит для совместного доступа к двухуровневым системам.
Конечно, также можно использовать ZooKeeper, На уровне балансировки нагрузки вы можете отслеживать состояние узла znode на основе клиента zk. Как только лотерея закончится, сервис лотереи обновит состояние zk, и уровень балансировки нагрузки это воспримет.
Оптимизация потока V4
Для онлайн-сред количество рабочих потоков является важным параметром, который необходимо настроить в соответствии с вашей собственной ситуацией.
Как мы все знаем, каждый запрос, поступающий в Tomcat, фактически будет передан независимому рабочему потоку для обработки, поэтому количество потоков в Tomcat определяет способность обрабатывать параллельные запросы.
Однако количество потоков необходимо оценивать с помощью стресс-тестирования, поскольку каждый поток будет обрабатывать запрос, а этому запросу необходимо обращаться к внешним системам, таким как базы данных, поэтому не каждая система может иметь одинаковые параметры, и вам необходимо настроить параметры самостоятельно.Система испытана под давлением.
Но чтобы дать эмпирическое значение, количество потоков в Tomcat не должно быть слишком большим. Поскольку потоков слишком много, ЦП обычного сервера не может с этим справиться, но это приведет к слишком высокой загрузке ЦП машины и, в конечном итоге, к сбою.
В то же время количество потоков Tomcat не должно быть слишком маленьким, потому что если будет всего 100 потоков, это приведет к невозможности полностью использовать потоковые ресурсы Tomcat и ресурсы ЦП машины.
Поэтому, как правило, число потоков Tomcat составляет от 200 до 500. Однако вам нужно проверить, насколько вам нужно нагрузить, и постоянно корректировать параметры, чтобы увидеть конкретную загрузку ЦП и эффективность запросов на выполнение потоков.
Когда загрузка ЦП приемлема, а производительность выполнения запросов нормальная, максимально увеличьте количество потоков.
Однако, если оно достигает критического значения, обнаруживается, что нагрузка на машину слишком высока, и скорость обработки запросов потока начинает снижаться, что указывает на то, что машина не может обрабатывать такое количество потоков, одновременно выполняющих запросы на обработку, и количество потоков не может быть увеличено в настоящее время.
Бизнес-логика V5
Как сделать логику лотереи?
Хорошо, теперь пришло время научиться играть в лотерею
На уровне балансировки нагрузки, например, 480 000 из 500 000 трафика были заблокированы, но 20 000 трафика все еще может поступать в лотерейный сервис.
Поскольку все лотерейные мероприятия — это временные услуги, вы можете арендовать кучу машин в Alibaba Cloud, и это не очень дорого.После оптимизации tomcat проблема с сервером решена, так что же осталось?
Mysql, да, выдержит ли ваш Mysql 20 000 одновременных запросов?
Ответить сложно, что делать?
Заменить Mysql на Redis очень легко, и одна машина может выдержать 20 000 одновременных операций.
И структура данных Redisset
Он очень подходит для лотереи, вы можете случайным образом выбрать элемент и удалить его.
Отсечение трафика V6
Сверху вниз оставшаяся часть уведомления о выигрыше не была оптимизирована.
Подумайте об этом: если предположить, что лотерейная служба выиграла 10 000 запросов из 20 000 запросов, это неизбежно приведет к тому, что лотерейная служба вызовет службу подарков 10 000 раз.
Это то же самое, что и лотерейный сервис?
На самом деле в этом нет необходимости, так как отправка уведомлений не требует своевременности, а 10 000 запросов можно отправлять медленно, в это время используется промежуточное ПО сообщений для ограничения тока и срезания пиков.
Иными словами, служба лотереи отправляет информацию о выигрыше в MQ, а затем уведомляет службу о том, чтобы она медленно потребляла информацию о выигрыше от MQ и, наконец, завершала распределение подарков.Это также причина, по которой мы задерживаем получение информации о выигрыше или логистическая информация.
Если предположить, что два экземпляра службы уведомлений могут выполнить отправку 100 уведомлений в секунду, то 10 000 сообщений будут отправлены с задержкой в 100 секунд.
Давление на MySQL также уменьшится, поэтому уровень базы данных также можно будет сопротивляться.
Взгляните на окончательную блок-схему:
Шаблон ответа на вопрос
Так называемый шаблон ответа — это несколько направлений мышления и решений для проблем с высокой степенью параллелизма.
единственная ответственность
Основная идея конструкции, напоминающая ряд и параллель в школьной физике, ряд разрушается и целое разрушается, и у каждой параллели есть путь.
Точно так же высокая сплоченность, низкая связанность.
Причиной роста микросервисов является разделение сложных функций: даже если сайт падает и заказы не могут быть размещены, функция просмотра все еще работает, а не все сервисы вызывают цепную реакцию, которая полностью парализована, как лавина.
Динамическое шифрование URL
Это делается для предотвращения злонамеренного доступа.Некоторые сканеры или сценарии очистки вызовут большое количество запросов на доступ к вашему интерфейсу.Вы даже не знаете, какие параметры он вам передаст, поэтому мы должны сделать дополнительную проверку при определении интерфейса, потому что не только вы Друзья можете настраивать свой интерфейс, возможны и враги.
Статические ресурсы — CDN
CDN означает сеть доставки контента, которая представляет собой распределенную сеть, созданную и покрытую несущей сетью и состоящую из групп серверов пограничных узлов, распределенных в разных регионах.
С точки зрения непрофессионала, это размещение часто используемых и требующих много времени ресурсов на ближайших к вам серверах.
Для доступа к изображениям Taobao 98% трафика идет в кеш CDN. Только 2% вернутся к источнику, что сэкономит много ресурсов сервера.
Однако, если содержимое изображения изменяется в больших количествах в период пикового доступа пользователей, доступ большого количества пользователей будет проникать через CDN, вызывая огромную нагрузку на исходный сайт.
Поэтому для статических ресурсов, таких как картинки, по возможности размещайте их в CDN.
Лимит сервисного тока
Как объяснялось выше, его можно разделить на внешнее ограничение тока и внутреннее ограничение тока.
- Внешний интерфейс: кнопка отключена, черный список IP-адресов
- Серверная часть: служебный предохранитель, переход на более раннюю версию службы, проверка разрешений
Прогрев данных
Вы можете использовать запланированную задачу (elastic-job) для запроса Druid в режиме реального времени и помещать горячие данные в кеш Redis.
Рассмотрим вопрос:
Например, сейчас остался только 1 инвентарь.У нас высокий параллелизм.Когда опрашиваем 4 сервера вместе, мы обнаруживаем, что 1 еще есть. результат становится -3, да реально схвачен только один, остальные перепроданы. Что делать?
отвечать:
Это может быть реализовано с помощью скрипта CAS+LUA.
Скрипты Lua аналогичны транзакциям Redis, которые обладают определенной атомарностью и не будут прерываться другими командами, а также могут выполнять некоторые транзакционные операции Redis. Это ключ.
Напишите сценарий для записи операции оценки инвентарных вычетов инвентаря в сценарии и отправьте его в Redis, чтобы сделать это. После достижения 0 он вернет False, верно? Если это не удается, вы изменяете переключатель, чтобы напрямую блокировать все запросы.
сбривание пиков и заполнение долин
Умение работать с промежуточным программным обеспечением даст вам много очков
Очереди сообщений постепенно стали основным средством внутренней связи в корпоративных ИТ-системах.
Он имеет ряд функций, таких как низкая связанность, надежная доставка, широковещательная передача, управление потоком и согласованность в конечном итоге, и стал одним из основных средств асинхронного RPC.
Сегодня на рынке есть много основных промежуточных программ для обмена сообщениями, таких как старый ActiveMQ, RabbitMQ, горячий Kafka и RocketMQ, независимо разработанные Alibaba.
В самом примитивном MQ производитель сначала доставляет сообщение в контейнер под названием «очередь», затем берет сообщение из контейнера и, наконец, пересылает его потребителю, вот и все.
Более подробный MQ будет продолжен ниже.
Я так много узнал сегодня. Я считаю, что у всех есть предварительное представление о системах с высокой степенью параллелизма. Интервьюеру нечего будет сказать, когда его спросят, но вам предстоит пройти долгий путь, если вы хотите хорошо учиться. Я надеюсь, что вы обратит внимание на одного и возьмет вас учиться вместе!