Tracks Flow изнутри

    Что такое вложенный 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 запросов в секунду.

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

    И, к слову, мы ищем супер людей в наш отличный офис на Красном Октябре.
    Tracks Flow 32,28
    Компания
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 33
    • –4
      Инвайт получил, но не работает :(
      Не играет вообще ничего.
      • +1
        А можно попросить рассказать более подробно про использование Entity Framework: чем пользуетесь для профилирования запросов? Насколько доминирует Entity SQL над LINQ to Entities?
        • 0
          В целом мы стараемся писать очень простые запросы. Стараемся писать на LINQ to Entities. Есть пара сложных запросов с джойнами на Entity SQL — на нем получается понятнее. Совсем сложные запросы выносим в хранимки.
          Запросы отлаживаем в Managmant Studio предварительно получив текст запроса в VS.
          • 0
            Интересовало больше противостояние Entity SQL vs LINQ to Entities в свете производительности =)
            • 0
              А какая разница — все равно все в конечном итоге выполняется на СУБД. Производительность попутных операций парсинга и преобразования в объекты не столь существенна.
              Вообще, если говорить о производительности, то всегда стоит обращать внимание на время выполнения разовых запросов (скорость работы сайта без нагрузки) — мы за этим стараемся следить. Если частота запросов растет и это начинает сказываться на скорости работы, то используем кеш.
              • 0
                Разница во времени, необходимом на создание Object Service уровня. Написав Entity SQL, я подразумевал Entity SQL to Entity Client.
            • 0
              А почему не старые добрые процедуры?
              Как вы решаете задачу модификации группы объектов по заданным критериям? (например удалить неактивных пользователей)
              • 0
                С процедурами работать не очень удобно. Например при изменении списка параметров надо:
                1. Поменять код процедуры в Managment Studio
                2. Обновить Entity Data Model
                3. Внести соответствующие правки в код.

                Запросы править прямо в коде проще. Да и вообще мы стараемся делать только то, что действительно необходимо.
                Еще есть очевидный плюс в деплое — структура БД при нашем подходе меняется мало и не надо отслеживать изменения в БД. В случае с процедурами надо учитывать все правки и перенакатывать их на боевую СУБД в момент выкладки сайта.
          • 0
            Кстати клиент под Linux / Win не планируется?
            Мне удобно когда плеер в трее болтается, а не в браузере вкладка маячит.
            • 0
              Клиенты будут. Сейчас пытаемся понять какой функционал там будет.
            • +1
              Без привязки аккаунта ВКОНТАКТЕ толком послушать ничего не удалось :(
              • +2
                Нашел 5 треков, которые не мог найти ранее нигде. Это гууууд!!! Вот скачать бы их…
                • 0
                  Если не секрет, что за треки?
                  • 0
                    Patti Boulaye -You Stepped Into My Life (Secret Button Bureau
                    Brothers Johnson — Stomp (Yasumo

                    и т.д.
                • 0
                  Если мне не изменяет память, то вы хотели еще с juno сотрудничать… Не так ли?
                  • 0
                    Да, именно так.
                    • 0
                      Это радует! Буду ждать анонса! Еще раз спасибо за сервис!

                      Кстати, если мне понравился трек, как я могу его скачать/купить? Будет ли инфа на этот счет?
                      • 0
                        Мы собираемся размещать линки на музыкальные магазины. С juno, кстати, будет именно так.
                  • +1
                    Сервис понравился, но программа на айфоне работает ужасно медленно.
                    • 0
                      Есть такой момент, но уже засабмитили апдейт. будет сильно быстрее
                    • 0
                      Вы молодцы. Ждем клиентов и трансформацию в спотифай для СНГ.
                      • +3
                      • 0
                        Куда-то пропало окно комментариев в «связи с разработчиком», есть только окно email и надпись: «Опишите, пожалуйста, подробно суть проблемы или вашего предложения:» а место где писать нету!!!
                        Mozilla Firefox 13.0.1
                      • 0
                        Сервис мне понравился. Правда, если не соединить аккаунт ВК, то много песен остаются без источника, поэтому и соединил аккаунт ВК, но и тут была проблема — если выйти из аккаунта ВК, то tracksflow пишет «подключите аккаунт ВКонтакте», учитывая то, что я его подключил, но вышел. У Аудиотории такая же ситуация, кажется это из-за API VK.

                        И у меня такая проблема возникла. В приглашении даётся три ссылки (одноразовые). Я часто стираю куки/кэш, и уже последней ссылкой мз письма воспользовался. Как мне потом заходить на ваш сервис? Зарегистрировался, но входа нету, если кэш и куки стёр…не хочется лишаться доступа в сервису из-за обычной чистки кук/кэша.
                        • 0
                          С ВКонтакте часто возникают проблемы, поэтому в первоочередных планах у нас — расширение открытых источников контента.

                          С инвайтами — временное решение на стадию альфа-тестирования. В ближайшее время система инвайтов будет переработана и вы отовсюду сможете получать доступ к серсису в любое время
                          Пока можете писать письмо в support@tracksflow.com с указанием Логина на сайте и мы решим проблему инвайтов
                        • 0
                          Можно ли получить приглашение для регистрации?
                          • 0
                            Вчера вечером мы изменили систему инвайтов, авторизации и создания аккаунта. У администрации инвайтов больше нет, ищите инвайты у пользователей Tracks Flow.
                            • 0
                              То есть теперь я, как зарегистрированный пользователь, смогу заходить отовсюду без инвайтов?
                        • 0
                          Каким инструментом нарисована блок-схема?

                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                        Самое читаемое