Що таке вкладений MVC? Як в одному проекті уживаються три бекенд-сервера Node, php-fpm і IIS? Чи можна запустити музичний сервіс на своєму ноутбуці? І як взагалі працює tracksflow.com зсередини?
На старті проекту tracksflow.com стояло завдання зробити музичний сервіс, який:
На момент старту розробки у нас було:
Рішення, які ми прийняли на самому старті
Оскільки у нас планується кілька клієнтів і сайт буде виконаний у вигляді веб-додатки, ми будемо жорстко відокремлювати базу даних (модель) від уявлень.
Відокремлювати модель від уявлення будемо за допомогою API в форматі REST - платформонезалежна технологія, проста в реалізації на всіх клієнтах.
Формат передачі даних - JSON. Тут виникли запеклі суперечки з iOS командою, але шляхом грубої сили змусили їх працювати з JSON - так зручніше більшості.
Було зрозуміло, що робота з декількома сторонніми сервісами буде привносити в роботу сайту і iOS пріоженія елемент випадковості - ніколи не можна бути впевненим, що тобі щось повернеться і, якщо повернеться, то коли. Нам також хотілося мати єдиний формат передачі даних для всіх сторонніх сервісів. У цей момент і народилася ідея використовувати Node.js як легкого MVC-контролера, який буде асинхронно взаємодіяти з API сторонніх сервісів, попутно приводячи результати в потрібний вид.
У свою чергу у всіх клієнтських додатках і в .NET використовувався MVC як внутрішній патерн. Ось вам і матрьошка з MVC :)
Далі виявилося, що використовувати Node.js для проксінг запитів до власного бекенд на .Net не дуже зручно - нода була явно зайвою ланкою і ми її від цієї роботи позбавили, направивши запити від клієнтів до .Net бекенд «безпосередньо» через nginx.
Так, всі запити шолом через нгінкс. Це позбавляє нас від проблем з кросдоменнимі запитами, закриває backend-сервери від прямого доступу. Також nginx дозволяє в разі чогось непередбаченого перенаправити запити на іншу збірку / сервер.
Що на чому написано?
Бекенд написаний на 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-повідомлень про нові події.
Разом на весь сервіс 4 ядра, 340 GB Hdd, 8 Гбайт пам'яті: tracksflow.com можна сміливо запускати на ноутбуці :)