Проект на 2-3 человек
Требуется реализовать прототип распределенной системы для продажи железнодорожных билетов для одной из наиболее развитых железнодорожных сетей мира. Система должна обеспечивать устойчивость к обрывам связи при стабильной гарантированной производительности.
Для хранения данных предлагается использовать кластер MongoDB с шардингом и репликацией.
Для поиска поездов и доступных билетов - ElasticSearch
Для кэширования справочников (станций) - кэш Hazelcast
Для блокирования места при бронировании и до получения оплаты - механизм блокировок в Hazelcast
Основные сущности:
- Остановочный пункт (Station) - справочник станций, которые могут быть пунктом отправления или назначения в билете (Москва, Бологое, Санкт-Петербург)
- Маршрут (Route) - множество станций, на которых останавливается поезд (маршрут #251: Москва, Тверь, Вышний Волочек, Бологое, Санкт-Петербург)
- Поезд (Train) - поезд, назначенный на указанные маршрут на конкретную дату (рейс поезда следует, назначенный на 25.09.2017 следует по маршруту #251)
- Билет (TicketPlace) - место в поезде, свободное или купленное.
Сценарии:
- Инициализация поездов
- Заполнение данными Station, Route
- Заполнение данными Train и TicketPlace (порядка миллионов документов в TicketPlace)
- Поиск свободных мест и покупка билета
- Пользователь вводит станции отправления и назначения, дату отправления
- Система определяет подходящие по станциям маршруты и ищет поезда, следующие по этим маршрутам, отображая только те, на которых есть свободные места
- Пользователь выбирает поезд, система отображает свободные места
- Пользователь выбирает свободное место и нажимает "Купить билет"
- Система блокирует указанное место до символической "велиоплаты"
- Пользователь оплачивает билет
- Система помечает билет как купленные и снимает блокировку
Комментарии к реализации.
Для простоты реализации поиска, можно объединить данные Маршрутов, Поездов и билетов в одном индексе ElasticSearch в формате, удобном для поиска по данному сценарию.
План работы:
- Обсудить предметную область, детально описать модель хранимых данных в MongoDB
- Реализация:
- Класс-сервис для работы со справочниками Station и Route
- Класс-сервис для работы с Train
- Класс-сервис для покупки билета (добавление TicketPlace, изменение статуса, оплата)
- Расширение сервиса для покупки билета (добавление и снятие блокировки в Hazelcast при бронировании и покупке соответственно)
- Расширение сервисов работы со справочниками - добавление кэширование в Hazelcast
- Конвертирование данных билетов в формат, удобный для поиска и индексирование в ES
- Класс-сервис для поиска поездов и билетов в ES
- Web-страница для поиска и отображения списка поездов и билетов
- Web-страница для бронирования и покупки билетов
- Интеграция и тестирование
- Подготовка и загрузка данных
- Функциональное тестирование на загруженных данных и исправление ошибок
- Тестирование поведение системы при отключении узла
Можно предположить, что для увеличения доступности и скорости работы, отдельные узлы будут географически распределены по регионам страны. При этом автоматический шардинг данных может быть неэффективен. Попробуйте рассмотреть возможность шардинга данных в соответствии с расположением станций и оценить объем изменений в системе.