1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/GuoqingLee-distributed-seckill

В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
README.md 16 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 28.11.2024 13:46 855c688

Анализ: разработка системы мгновенных распродаж

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

Мы знаем, что реализация системы мгновенных распродаж для веб-приложений требует одинаковой важности как для обработки на стороне клиента, так и для обработки на сервере. На стороне клиента обычно используется CDN (сеть доставки контента), а на стороне сервера — распределённое развёртывание, ограничение трафика, оптимизация производительности и другие операции. Кроме того, поскольку текущая система основана на WeChat Mini Program, оптимизация на стороне клиента выполняется в основном в коде, и использование CDN становится ненужным.

Дополнительные размышления о системе мгновенных распродаж:

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

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

Фактически, оба решения кажутся подходящими, но они предназначены для разных сценариев использования. Существующее решение больше подходит для платформ с относительно небольшим трафиком и более простым процессом. Новое решение часто используется на крупных платформах и предназначено для сглаживания пиковых нагрузок с использованием очередей сообщений. Оба решения ограничивают количество запросов, которые действительно могут быть обработаны, используя атомарное увеличение счётчика в Redis для записи количества запросов. Когда количество запросов достигает определённого кратного размера запасов, последующие запросы будут возвращать сообщение о том, что активность слишком популярна.

  1. Архитектура: серверная часть проекта основана на микросервисной архитектуре SpringCloud + SpringBoot. Клиентская часть работает в магазине WeChat Mini Programs.
  2. Основные компоненты:
    • Сервисный шлюз Zuul;
    • Регистрация и обнаружение сервисов Eureka + Ribbon;
    • Централизованная аутентификация и авторизация Spring Security OAuth2, JWTToken;
    • Фреймворк сервисов Spring MVC/Boot;
    • Отказоустойчивость сервисов Hystrix;
    • Распределённая блокировка Redis;
    • Вызов сервисов Feign;
    • Очередь сообщений Kafka;
    • Файловый сервис на частном облачном диске;
    • Компонент форматированного текста UEditor;
    • Запланированные задачи xxl-job;
    • Центр конфигурации apollo.
  3. Особенности сценариев мгновенных распродаж:
    • Мгновенные распродажи обычно сопровождаются большим количеством одновременных покупок пользователями, что приводит к резкому увеличению трафика на сайте;
    • В большинстве случаев мгновенные распродажи имеют гораздо больший объём запросов, чем доступный запас, и только небольшая часть пользователей может успешно совершить покупку;
    • Процесс мгновенных распродаж относительно прост и обычно включает в себя оформление заказа;
  4. Принципы проектирования системы мгновенных распродаж:
    • Ограничение трафика: учитывая, что только небольшое количество пользователей может совершать покупки во время мгновенных распродаж, необходимо ограничить большую часть трафика и разрешить доступ только небольшому количеству трафика (в настоящее время не обрабатывается);
    • Сглаживание пиковых нагрузок: для мгновенных распродаж характерны резкие всплески трафика. Распространённым методом сглаживания является использование кеша или очередей сообщений;
    • Асинхронная обработка: асинхронная обработка может значительно повысить пропускную способность высоконагруженных систем. Асинхронная обработка также является одним из методов сглаживания пиковых нагрузок;
    • Кеширование памяти: основной узким местом системы мгновенных распродаж является чтение и запись базы данных, особенно дисковый ввод-вывод, который может привести к снижению производительности. Если большая часть бизнес-логики перенесена в кеш, производительность может значительно улучшиться;
    • Масштабируемость: если требуется поддержка большего числа пользователей или более высокой нагрузки, система должна быть спроектирована таким образом, чтобы её можно было легко масштабировать. Если трафик увеличивается, можно добавить дополнительные машины.
  5. Идеи проектирования мгновенных распродаж:
    • Поскольку клиентская сторона основана на Mini Program, нет проблем с нагрузкой на стороне клиента.
      1. Все интерфейсы, связанные с активностью, должны быть кэшированы с использованием Redis.
      1. Вся информация о реальном запасе, блокировке запасов, ограничении покупок и оформлении заказов должна храниться в Redis.
      1. Когда поступает запрос, сначала используется атомарное приращение Redis для записи текущего количества запросов. После превышения определённого порога последующие запросы возвращают сообщение о чрезмерной популярности активности. Запросы, которые могут участвовать в мгновенных распродажах, сначала проходят проверку на повторяемость с использованием распределённой блокировки с гранулярностью активности. Если условия соблюдены, запрос переходит к следующему шагу, в противном случае возвращается сообщение о том, что заказ уже сделан.
      1. Во-вторых, проверяется, превышает ли доступный запас количество покупок. Если условие выполнено, запрос переходит к следующему этапу, в противном случае возвращается сообщение об отсутствии товаров.
      1. В-третьих, текущий запрос на покупку блокирует доступный запас. Запрос на оформление заказа помещается в очередь сообщений Kafka.
      1. В-четвёртых, ключ polling добавляется в Redis для опроса интерфейса, чтобы определить, был ли заказ успешно оформлен. После успешного оформления заказа ключ polling должен быть удалён, а также должен быть создан ключ с идентификатором активности и идентификатором пользователя для предотвращения повторных покупок.
      1. В-пятых, сообщения обрабатываются в очереди, и после успешного оформления заказа реальный запас уменьшается, а ключ polling удаляется. Если в процессе оформления заказа возникает ошибка, ключ ограничения покупок удаляется, запас разблокируется, и пользователю отправляется сообщение о неудачной попытке оформления заказа.
      1. В-шестых, предоставляется интерфейс опроса, который позволяет клиенту проверять успешность оформления заказа после завершения процесса мгновенных распродаж. Основной критерий — состояние ключа polling в Redis.
      1. Весь процесс будет перехватывать все запросы, поступающие на серверную часть, на уровне кэша Redis, за исключением взаимодействия с базой данных для окончательного оформления заказа. Таким образом, нагрузка на базу данных сводится к минимуму.
  6. Ограничение трафика: SpringCloud Zuul предоставляет эффективные механизмы ограничения трафика, которые помогают предотвратить злонамеренные запросы от одного и того же пользователя. Пример конфигурации ограничения трафика в Zuul:
zuul:
ratelimit:
key-prefix: your-prefix #对应用来标识请求的key的前缀
enabled: true
repository: REDIS #对应存储类型(用来存储统计信息)
behind-proxy: true #代理之后
default-policy: #可选 - 针对所有的路由配置的策略,除非特别配置了policies
limit: 10 #可选 - 每个刷新时间窗口对应的请求数量限制
quota: 1000 #可选-  每个刷新时间窼口对应的请求时间限制(秒)
refresh-interval: 60 # 刷新时间窗口的时间,默认值 (秒)
type: #可选 限流方式
- user
- origin
- url
policies:
myServiceId: #特定的路由
limit: 10 #可选- 每个刷新时间窗口对应的请求数量限制
quota: 1000 #可选-  每个刷新时间窗口对应的请求时间限制(秒)
refresh-interval: 60 # 刷新时间窗口的时间,默认值 (秒)
type: #可选 限流方式
- user
- origin
- url
  1. Распределение нагрузки и балансировка трафика: Когда активность получает очень большой объём трафика, возможно, потребуется рассмотреть возможность использования нескольких IP-адресов для одного домена и их сопоставления с несколькими высокодоступными серверами Nginx в DMZ. Также можно рассмотреть возможность использования кластера Redis для обеспечения распределённого хранения и SpringCloud Hystrix для обеспечения отказоустойчивости сервисов. Кроме того, важно оптимизировать параметры Nginx, Tomcat, Zuul и других компонентов для повышения производительности системы. Следует также отметить, что даже если клиентская часть основана на Mini Program, ресурсы изображений, связанные с активностью, размещаются на собственном облачном сервисе, поэтому размещение ресурсов изображений на CDN также имеет решающее значение. В противном случае даже при наличии 1G пропускной способности канала трафик может быть быстро исчерпан.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/GuoqingLee-distributed-seckill.git
git@api.gitlife.ru:oschina-mirror/GuoqingLee-distributed-seckill.git
oschina-mirror
GuoqingLee-distributed-seckill
GuoqingLee-distributed-seckill
master