Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 24.05.2012, 16:13
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

Архитектура server-side приложения
Мир кодерам.

По долгу службы я бОльшую часть времени имею дело с client-side приложениями, поэтому возник такой вопрос.

Я делаю собственный проект, без использования фреймворков по идеологическим причинам. Архитектуру серверной части сайта продумываю сам и хотелось бы получить несколько советов от людей, разбирающихся в этом предмете, до того как начать её создавать.

Наблюдая за другими проектами, мне понравился способ, при котором страница, на которую пришел запрос, сама вытягивает нужные ей данные. Причем, на разных проектах это выглядит по-разному:

1. Шаблон напрямую обращается к источникам данных (базе, например).
2. Шаблон дергает некую ручку (приложение), которое обращается к данным, формирует их в нужном формате и возвращает.
3. Приложение (а не шаблон), получает нужные данные из источников и передаёт их одной пачкой в шаблон.

Это самые частые механизмы генерации страниц, которые мне попадались.
Есть один важный момент, который мне нужно учесть: данные могут быть запрошены как для шаблона, так и в чистом виде. Например: на странице есть блок - ТОП10 мудаков сайта. Список мудаков нужно отдать в шаблон, при запросе содержащей её страницы. Затем, каждые 10 минут необходимо обновлять блок AJAX-ом, т.е. получить по-сути те же данные, которые отдаются в шаблон перед рендерингом.

Исходя из этого требования, становится понятно, что первый и третий варианты не подходят - придется дублировать агрегацию данных для шаблонов и AJAX-запросов. В первом варианте шаблон сам агрегирует нужные ему данные. Во втором этим занимается отдельное приложение. А кто будет это делать для AJAX? Не круто.

Второй вариант подходит. Но. Что, если шаблон не умеет дергать ручки? Например, dust, TSN. Да, они могут вызывать функции, но результат при этом должен вернуться синхронно, а в NodeJS (мой проект на ноде) этого практически никогда не бывает.

Поэтому я ничего лучше не придумал, как объединить второй и третий вариант. Алгоритм:
1. Приходит GET-запрос на роутер (в моем случае это nginx). Роутер определяет сервис (раздел или подраздел сайта, к примеру), который обрабатывает этот запрос и проксирует ему.
2. Сервис, получив запрос, определяет какой шаблон с какими данными необходимо вернуть.
3. Дергает нужные ручки, в надежде получить от них данные в JSON.
4. После получения всех данных рендерит шаблон и возвращает результат.

Для получения AJAX-ответа достаточно будет создать сервис AJAX, который будет дергать нужную ручку и возвращать полученные от неё данные.
Можно считать, что ручка - это модель, сервис - контроллер, шаблон - представление. Контроллер запрашивает только нужные данные, которые могут не нуждаться в представлении (как в сервисе AJAX).


Кто-нибудь имел дело с такой архитектурой?

Представьте, что вы устроились на работу в проект, где всё так устроено. Хотелось бы вам работать в таком окружении?
__________________
Болтовня ничего не стоит. Покажите мне код. — Linus Torvalds
влад.куркин.рф
Ответить с цитированием
  #2 (permalink)  
Старый 24.05.2012, 16:19
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

UPD: Буду рад услышать ваши варианты, но с аргументами.
__________________
Болтовня ничего не стоит. Покажите мне код. — Linus Torvalds
влад.куркин.рф
Ответить с цитированием
  #3 (permalink)  
Старый 24.05.2012, 20:22
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

Сообщение от B~Vladi
Алгоритм:
Если приложение сложное, то я делаю именно так.

У меня не nginx решает, а php куда дальше передавать запрос или исполнение задачи. Запрос разбивается на части и определяется раздел и прочие данные.

В самом простейшем случае подходит банальный switch, в сложном то, что описал ты. С более сложным не сталкивался.
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
Ответить с цитированием
  #4 (permalink)  
Старый 24.05.2012, 20:40
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

Немного поясню про nginx. Там, собственно, никакой магии нет:
Код:
	location /serviceName/ {
		proxy_pass http://127.0.0.1:8001;
		# Этот порт слушает сервис, т.е. HTTP Server NodeJS.
		# Каждый сервис на своем порту и не доступны извне.
		# Далее идут параметры кеширования.
	}
Другими словами: я разделил url на хост/сервис/параметры_сервиса. Выбрал nginx из соображений производительности. Причем соображения разные, например, попытаюсь запилить такую схему на AJAX-ответы:
Код:
Request -> Nginx -> Memcached -> Nginx -> Response.
Т.е. без участия backend-а (у nginx есть необходимый модуль). Ответ в бинарном виде (Для этого и писал Buffer.js).
__________________
Болтовня ничего не стоит. Покажите мне код. — Linus Torvalds
влад.куркин.рф
Ответить с цитированием
  #5 (permalink)  
Старый 24.05.2012, 21:35
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

Сообщение от B~Vladi
попытаюсь запилить такую схему на AJAX-ответы
Ну и нормально
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
Ответить с цитированием
  #6 (permalink)  
Старый 25.05.2012, 21:53
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

Больше никому нечего добавить? Хотя это не удивительно - здесь большинство клиентских кодеров. Но ведь должны же быть ещё знающие люди.
__________________
Болтовня ничего не стоит. Покажите мне код. — Linus Torvalds
влад.куркин.рф
Ответить с цитированием
  #7 (permalink)  
Старый 12.06.2012, 09:04
Аватар для Vantedur
Профессор
Отправить личное сообщение для Vantedur Посмотреть профиль Найти все сообщения от Vantedur
 
Регистрация: 21.04.2011
Сообщений: 429


very complexity
Ответить с цитированием
  #8 (permalink)  
Старый 12.06.2012, 11:40
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

Vantedur, на картинке ничего не видно.
__________________
Болтовня ничего не стоит. Покажите мне код. — Linus Torvalds
влад.куркин.рф
Ответить с цитированием
  #9 (permalink)  
Старый 12.06.2012, 12:26
Аватар для Vantedur
Профессор
Отправить личное сообщение для Vantedur Посмотреть профиль Найти все сообщения от Vantedur
 
Регистрация: 21.04.2011
Сообщений: 429

там личные имена, а вообще это мануал ядра для совсем профи, всю систему писал сперва чисто для профи а уже потом построил поверх конструктор. сейчас виду работу над изготовлением всевозможных готовых комплектов, ну чтоб чайники могли сразу юзать.
Ответить с цитированием
  #10 (permalink)  
Старый 12.06.2012, 12:41
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

И как это относится к теме поста?
__________________
Болтовня ничего не стоит. Покажите мне код. — Linus Torvalds
влад.куркин.рф
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
JavaScript client и server side игры Москва 110 000 Yanazavr Работа 0 25.03.2012 14:16
Помогите с архитектурой приложения epson Общие вопросы Javascript 6 09.02.2012 16:32
ВАКАНСИЯ:Сlient side developer СПБ ElenaJMK Работа 25 19.11.2010 16:24
ошибка XMLHttpRequest при запросе ис-под Isa Server poison jQuery 5 14.04.2010 13:38
Архитектура расширяемого приложения. DeveloperRu Библиотеки/Тулкиты/Фреймворки 2 16.03.2010 23:52