Агентная инфраструктура построения веб приложения

Хочу построить веб приложение. И в качестве инфраструктуры выбрать агентную, например как http://habrahabr.ru/post/200906/

Но в качестве backend агентов хочу использовать не node.js, а Java Spring MVC. А node.js использовать как маршрутизатор между API агентами и для того чтобы быстро бегать в кэш. Организация обмена сообщениями по протоколу http в формате json будет.

Да разные языки в слоях маршрутизации и backend API это не хорошо. Но это даёт большую надёжность кода, чем писать матрёшки на node.js.

Интересует ваше мнение и возможные советы, в такой архитектуре я новичёк

  • Вопрос задан
  • 2820 просмотров
Решения вопроса 1
MarcusAurelius
@MarcusAurelius Куратор тега Node.js
автор Impress Application Server для Node.js

Вот Вы пока боитесь ноды, это все из-за неуверенности в новой и незнакомой технологии. Не бойтесь и смело пишите и API на ноде, и маршрутизатор на ноде, и статику нодой отдавайте, и подписку клиентов на серверные события тоже на ноде делайте. Однородность технологий стоит того, чтобы в ней разобраться. Я конечно специалист не по Java, но Абсолютно не ясно, почему вы думали использовать Java Spring MVC для бэкендов. По сути бэкенды - это API, реализованные или как RPC (stateful, взаимодействие с сохранением состояния на обоих концах) или как REST (stateless, взаимодействие без сохранения состояния). При чем тут MVC к API ? Что должен делать API, так это организовывать доступ к БД, обработку данных, выдачу ответов в нужном формате (пусть JSON), ну и в зависимости от того RPC у или REST - API может или хранить состояние в памяти или не хранить его, делая отдельные запросы независимыми, но лишая нас возможности кешировать объекты предметной области в памяти в рамках сессии. По этому поводу полезный ответ я оставил вот тут - http://toster.ru/q/49346#answer_183494

Теперь про матрешки, чтобы от них уйти в написании API, проще всего использовать async. Основная проблема в том, что нужно сделать несколько запросов в БД и потом на основе всех фрагментов данных, полученных асинхронно, исполнить бизнес-логику и сформировать ответ.


var dataRequests = [];
// массив запросов к разным данным (БД, файлы, сетевые вызовы)
var dataResults  = {};
// я предпочитаю не использовать массив results, который дает async
// а вместо этого делать именованные фрагменты данных
// и писать их в свой хеш

// добавляем один запрос к данным
dataRequests.push(function(callback) {
	db.queryRow(
		'SELECT * FROM TableName1 where Field1=?', [someValue1],
		function(err, res) {
			dataResults.firstPiceName = res;
			callback(err, null);
		}
	);
});

// добавляем второй запрос к данным
dataRequests.push(function(callback) {
	db.queryValue(
		'SELECT count(*) FROM TableName2 where Field2=?',
		[someValue2],
		function(err, res) {
			dataResults.secondPiceName = res;
			callback(err, null);
		}
	);
});

// вызываем массив запросов асинхронно
async.series(dataRequests, function(err, results) {
	// тут делаем бизнес-логику над dataResults в котором у нас есть
	// все фрагменты данных .firstPiceName и .secondPiceName
	// и формируем общий результат
});

Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы