FinLab - торговая платформа для Facebook
Приложение на Facebook для игры на Forex. Лучшие игроки получают денежные выигрыши.
Задача
- Созданиефорекс-платформыс нуля
- Оптимизация под высокие нагрузки и бесперебойная работа
- Реализация в виде facebook приложения
Особенности проекта
Один из наиболее технически сложных проектов, который мы писали
- Объем разработки 4000 рабочих часов
- Сроки разработки 6 месяцев
- Команда разработки 7 человек
- Дизайн в стиле крупных торговых платформ, ничего лишнего
- Интеграция с Facebook. Покупки внутри приложения: сервисы, аналитика, торговые новости, сувениры
- Подключение высокоскоростного источника реальных данных по котировкам
- Тщательное документирование всех аспектов разработки, включая API общения между клиентской и серверной частями, и инструкций для серверного администрирования
Техническая реализация
Подход к реализации
Проект реализован как одностраничное приложение на базе библиотеки Backbone.js.
Свой API
Написан API с хорошей документацией и песочницей (для тестирования методов API) для общения между клиентской частью и бэкендом.
Кеширование
Приложение мультиязычное, для каждого языка JS код собирается помодульно в один файл, который кешируется у каждого клиента. Этот подход увеличивает скорость загрузки при повторных обращениях.
Графики
Для построения графиков котировок на open-source решения была написана библиотека под нужды заказчика.
Многопоточное получение котировок
Подключение к высокоскоростному источнику данных по котировкам. Для максимально эффективного использования ресурсов сервера на Python написан многопоточный скрипт обработки с кешированием.
Для отображения данных по каждому временному интервалу создается свой поток через веб-сокет, и при входе нового клиента он подключается к одному из этих каналов, а не создает новый.
Базы данных
Две базы данных: PostgreSQL и MongoDB. Большая часть финансовой логики реализована как процедуры в PostgreSQL. Процедуры тестировались с помощью unit-тестов. MongoDB используется как хранилище логов для анализа и статистических данных поведения пользователей.
Выдача данных клиентам
Обмен данными между клиентом и сервером реализован через веб-сокет, как наиболее производительный метод работы с постоянным потоком данных.
Backend фреймворк
Backend реализован на MVC фреймворке Symfony2.
Нагрузочное тестирование
Нагрузочное тестирование с помощью Jmeter. Проверяли производительность и находили узкие места с помощью NewRelic.
Автотесты
Весь проект покрыт автотестами на Behat. Для тестирования клиентской части использовался Selenium.
Масштабирование
Реализовано автоматическое масштабирование. Проект разделен на модули для того, чтобы модули с большой нагрузкой можно было распределять между несколькими серверами. Процесс масштабирования максимально автоматизирован – используется решение PAAS Jelastic для вертикального и горизонтального масштабирования.
Технологии
- PHP Python
- require.js
- Symfony2
- Backbone.js
- Sockets: redchet.php, autobahn.js
- Queues: ZNQ
- Testing: phpunit, behat/mink, selenium
- Load testing: jmeter
- Monitoring ofperformance: new relic
- Postgresql, Mongodb
- PAAS Jelastic