Поговорите о том, как спроектировать лотерейную систему с миллионным уровнем

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

Мало знаний, большой вызов! Эта статья участвует в "Необходимые знания для программистов«Творческая деятельность

Эта статья участвовала в "Проект «Звезда раскопок»”, чтобы выиграть творческий подарочный пакет и бросить вызов творческим поощрительным деньгам.

Эта статья участвует в "Боевой рекорд оптимизации производительности"Тема заявки на доклады


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

Эта статья включена в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 будет продолжен ниже.


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