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