Pull to refresh
0

Tracks Flow изнутри

Reading time 4 min
Views 14K
Что такое вложенный MVC? Как в одном проекте уживаются три бэкенд-сервера Node, php-fpm и IIS? Можно ли запустить музыкальный сервис на своем ноутбуке? И как вообще работает tracksflow.com изнутри?

Схема tracksflow.com


На старте проекта tracksflow.com стояла задача сделать музыкальный сервис, который:
  • будет брать контент и метаданные к нему из открытых источников,
  • будет иметь собственную базу пользователей с привязанными к ним плейлистами / лайками и прочим,
  • будет содержать социальные инструменты,
  • будет иметь несколько входов — веб / мобильные приложения,
  • сайт будет выполнен как web-приложение (никаких перезагрузок страниц, реализация части логики на клиенте).


На момент старта разработки у нас было:
  • 5 лицензий Windows server 2003,
  • 2 лицензии MS SQL Server 2008 (по лицензии на процессор),
  • система хранения файлов на php с клиентской библиотекой на C#,
  • три JS-программиста, один .NET программист два Objective-C программиста.


Решения, которые мы приняли на самом старте


Поскольку у нас планируется несколько клиентов и сайт будет выполнен в виде веб-приложения, мы будем жестко отделять базу данных (модель) от представлений.

Отделять модель от представления будем с помощью API в формате REST — платформонезависимая технология, простая в реализации на всех клиентах.

Формат передачи данных — JSON. Тут возникли жаркие споры с iOS командой, но путем грубой силы заставили их работать с JSON — так удобнее большинству.

Было понятно, что работа с несколькими сторонними сервисами будет привносить в работу сайта и iOS приожения элемент случайности — никогда нельзя быть уверенным, что тебе что-то вернется и, если вернется, то когда. Нам также хотелось иметь единый формат передачи данных для всех сторонних сервисов. В этот момент и родилась идея использовать Node.js в качестве легкого MVC-контроллера, который будет асинхронно взаимодействовать с API сторонних сервисов, попутно приводя результаты в нужный вид.

Таким образом, у нас сложилась концепция MVC на уровне компонентов системы. Веб- и мобильные приложения выступали в роли представлений. Node.js — контроллер. .Net и сторонние сервисы — модель.
Единственное — vk.com пришлось привязывать напрямую в клиентах т. к. их API накладывает ограничения на количество запросов с одного IP-адреса, привязывает сессии к IP и вообще всячески пропагандирует реализацию методов работы с vk.com API на клиенте.

В свою очередь во всех клиентских приложениях и в .NET использовался MVC как внутренний паттерн. Вот вам и матрешка из MVC :)

Далее оказалось, что использовать Node.js для проксирования запросов к собственному бэкенду на .Net не очень удобно — нода была явно лишним звеном и мы ее от этой работы избавили, направив запросы от клиентов к .Net бэкенду «напрямую» через nginx.
Да, все запросы шлем через нгинкс. Это избавляет нас от проблем с кросдоменными запросами, закрывает backend-серверы от прямого доступа. Также nginx позволяет в случае чего-то непредвиденного перенаправить запросы на другую сборку / сервер.

Что на чем написано?


Для хранения аватарок мы использовали проверенную временем систему на php, которая обеспечивала в fidel.ru хранение 120 Тбайт данных. Место под нее, конечно, уменьшили.

Бэкенд написан на ASP.NET MVC 3. В работе над предыдущими проектами связка horosho с .NET MVC 3 показала себя с хорошей стороны — REST API делается легко и красиво. Для доступа к БД используется Entity Framework 4.2 beta.

Мобильное (iOS) приложение написано силами newonder нативными средствами. В приложении реализовано много интересных элементов: меню навигации, раскрывающееся по смахиванию; смахивание ячеек таблицы; система миграции моделей данных. Приложение уже в AppStore.

Клиентская часть сайта реализована vmkcom с использованием MVC при помощи связки backbone.js + underscore.js. Роутинг осуществляется на основе pushState и использует history API в тех браузерах, где поддерживается, в остальных — хештеги.
За работу с DOM отвечает старый добрый jQuery.
Из интересных особенностей:
  • мы используем HTML5/Flash/SilverLight плеер mediaelement.js, который автоматически определяет поддержку в браузере того или иного кодека и запускает нужный плагин для воспроизведения,
  • Используется связка socket.io с Node.js для отправки push-уведомлений о новых событиях.


Железо


Cейчас сервис tracksflow.com работает в облаке DataLine из трех виртуальных машин:
linux система с nginx + php-fpm + node.js. Характеристики 2 Гбайт памяти, 32Gb hdd, 1 ядро CPU Xeon 2.67GHz.
Windows Server 2003 IIS 6 с бэкендом на .NET MVC. Характеристики 2 Гбайт памяти, 60Gb hdd, 1 ядро CPU Xeon 2.67GHz.
Windows Server 2003 SQL Server 2008. Характеристики 4 Гбайт памяти, 250Gb hdd, 2 ядра CPU Xeon 2.67GHz.

Итого на весь сервис 4 ядра, 340 GB Hdd, 8 Гбайт памяти: tracksflow.com можно смело запускать на ноутбуке :)

Нагрузки


Не претендуем на high-load проект. Была нагрузка в 50 запросов в секунду при публикации позапрошлого поста в блоге — выдержали на пределе. Узким место стала пара join-ов, выполнявшихся Entity Framework'ом на стороне веб-сервера. Сейчас оптимизировали узкие места, протестировали — вышло около 500 запросов в секунду.

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

И, к слову, мы ищем супер людей в наш отличный офис на Красном Октябре.
Tags:
Hubs:
+10
Comments 33
Comments Comments 33

Articles

Information

Website
tracksflow.com
Registered
Founded
Employees
11–30 employees
Location
Россия