Высоконагруженная система для проведения акций «секундных» распродаж
Среда разработки: IDEA, Tomcat, MySQL, Redis.
Сборка проекта: Maven.
Программное окружение: SSM (SpringMVC, Spring, MyBatis).
Описание проекта: Система создана для организации и проведения акций по продаже товаров со скидками. Позволяет пользователям совершать покупки по сниженным ценам в течение ограниченного времени.
Техническая реализация: Система основана на использовании технологий SpringMVC, Spring и MyBatis. Разработана с применением подхода RESTful. В качестве пула соединений используется c3p0. Для обеспечения высокой производительности применяется база данных Redis. Все операции с данными, включая операции DAO и Service, снабжены тестами JUnit.
Документация по разработке
Бизнес-анализ
-
Процесс работы системы:
- Пользователь выбирает товар для покупки.
- Система проверяет наличие товара на складе.
- Если товара достаточно, пользователь может совершить покупку.
- Информация о покупке сохраняется в системе.
-
Основные аспекты акции:
- Проверка наличия товара на складе перед покупкой.
- Запись информации о покупке после успешной транзакции.
-
Анализ операций с товарами:
- Транзакции с учётом уменьшения количества товара на складе.
- Регистрация покупок.
-
Регистрация информации об успешной акции:
- Объект покупки.
- Время успешной покупки и срок действия скидки.
- Платёжная информация.
Анализ исключений
- Уменьшение количества товара на складе не зарегистрировано.
- Зарегистрирована покупка, но количество товара на складе не уменьшено.
- Перепродажа или недопродажа товара.
Сложности реализации
- MySQL: транзакции и блокировки строк.
- Многопользовательские покупки — обновление количества товаров на складе.
Функциональные модули
- Экспозиция интерфейса для секундных распродаж (Exposer, упакованные DTO).
- Выполнение акции.
- Связанные запросы.
Процесс разработки
- Проектирование и кодирование DAO.
- Проектирование и кодирование Service.
- Кодирование веб-интерфейса (RESTful API и взаимодействие с фронтендом).
- Оптимизация и анализ высоконагруженной системы.
(1) Проектирование и кодирование DAO
Пакеты:
- org.seckill.dao;
- org.seckill.entity.
-
Разработка интерфейсов и SQL-кода.
Примечание: слой DAO не должен содержать информацию из слоя Service. Сервисный слой отвечает за объединение данных из DAO.
-
Создание таблиц базы данных:
- seckill — таблица для хранения информации о количестве товаров для распродажи;
- success_killed — таблица для регистрации успешных покупок.
- Реализация DAO и интерфейсов:
- SeckillDao;
- SuccesskilledDao.
- Интеграция Mybatis с Spring:
- Написание файла конфигурации mybatis-config.xml (глобальные настройки);
- Написание файла spring-dao.xml (настройка dataSource, sqlSessionFactory и т. д.).
- Завершение интеграции DAO-слоя (с использованием JUnit4).
(2) Проектирование и кодирование Service
Пакеты:
- Org.seckill.service — размещение сервисов, объединяющих логику;
- Org. seckill.exception — размещение исключений, необходимых для интерфейсов сервиса, таких как повторные попытки проведения акции или завершение акции;
- Org. seckill.dto — передача данных между слоями, аналогично entity, для передачи данных между веб-сервисом и сервисом.
- Org. seckill.enums — упаковка перечислений, представляющих постоянные значения (например, «успешная акция», «завершение акции» и т.д.).
-
Определение интерфейсов и их реализация:
- Бизнес-интерфейсы: определение интерфейсов с точки зрения пользователя.
- Три аспекта: определение методов, параметров и возвращаемых типов (возвращаемые типы/исключения).
-
Использование Spring для управления зависимостями сервисов (Spring IOC):
- Диаграмма объектов зависимостей:
- Бизнес-объекты и зависимости.
- Написание spring-service.xml.
- Расширение:
- Spring IOC:
- Создание унифицированного управления объектами.
- Управление жизненным циклом объектов.
- Гибкое внедрение зависимостей.
- Унифицированный доступ к объектам.
- Способы внедрения зависимостей Spring IOC и сценарии использования:
- XML:
- Реализация класса происходит из сторонней библиотеки, такой как DataSource.
- Требуется конфигурация пространства имён, такого как context, aop, mvc и т. д.
- Аннотации:
- Классы, используемые в проекте, могут быть аннотированы напрямую, например, @Service, @Controller.
- Java-конфигурация:
- Необходимо контролировать создание объектов через код, например, при настройке пользовательских библиотек.
-
Настройка и использование декларативных транзакций Spring:
- ProxyFactoryBean + XML — старый способ (2.0).
- tx:advice + aop — однократная настройка с постоянным эффектом.
- @Transactional — предпочтительный способ использования аннотаций для контроля транзакций методов.
- Когда откатить транзакцию?
- Возникновение исключения во время выполнения.
- Избегание неправильного использования try...catch...
- Преимущества использования аннотаций для управления транзакциями методов:
- Команда разработчиков достигает консенсуса в отношении стиля программирования для методов транзакций.
- Гарантируется, что время выполнения метода транзакции будет максимально коротким, и другие сетевые операции, RPC/HTTP-запросы или операции, отделённые от метода транзакции, не будут выполняться.
- Не все методы требуют транзакционного управления, например, если есть только одна операция обновления, а операции только для чтения не требуют управления транзакциями.
-
Завершение интеграции Service-слоя (используя JUnit4).
(3) Веб-дизайн и кодирование
-
Логика взаимодействия с фронтендом:
- Поток страниц переднего плана системы секундных распродаж:
- Страница списка секундных распродаж.
- Детальная страница.
-
Основываясь на RestFul API:
- Дизайн URL секундной распродажи:
- GET /seckill/list — список секундных распродаж;
- GET /seckill/{id}/detail — детальная страница;
- GET /seckill/time/now — системное время;
- POST /seckill/{id}/exposer — экспозиция секундной распродажи;
- POST /seckill/{id}/{md5}/execution — выполнение секундной распродажи.
-
Интеграция Spring MVC и соответствующая конфигурация:
- Написание web.xml.
- Добавление spring-web.xml.
-
Реализация соответствующих Restful API для секундных распродаж:
- Создание SeckillController.
- Создание класса DTO SeckillResult для инкапсуляции всех ответов ajax (json).
-
Разработка страниц с использованием Bootstrap:
- Выделение общих компонентов и разработка common пакета.
- Разработка list.jsp — страницы списка товаров.
- Разработка detail.jsp — детальной страницы товара.
-
Логин на основе Cookie:
- Написать код JavaScript (модульный код) для завершения процесса аутентификации (основное внимание уделяется проверке номера мобильного телефона).
- Завершить разработку всплывающего компонента.
-
Взаимодействие таймера:
- Определить время (начало, не началось, конец).
- Отображать различный контент в соответствии с временем.
-
Взаимодействие секундной распродажи:
- Привязать событие нажатия кнопки (одно нажатие), чтобы предотвратить непрерывное нажатие пользователем.
- Учитывать разницу во времени браузера.
- Показать результаты распродажи.
(4) Оптимизация и анализ для высокой нагрузки
Продолжение следует...
Комментарии ( 0 )