Если нужно реально быстрое API с минимумом логики - тогда tarantool отличный вариант. Но у вас финансы нужно гарантированно в БД писать, а значит нужен универсальный тул. И тут вариантов масса - С++, Java, Scala, Haskel, nodejs, go, Python, PHP, и Ruby. Похожий на вашу ситуацию тест от TechEmpover - features (запрос из БД одной строчки) - https://www.techempower.com/benchmarks/#section=da...
В топе - С++, Java, go, Lua и нода с почетными 50% перфоманса от С++. Так что тут без вариантов, если выбор
между нодой и руби - то без нода без вариантов. Если хочется максимального перфоманса, масштабируемости и надежности за счет статической типизации - то go или Java.
В ноде koa тормозит за счет обвязки генераторной, берите только чистую ноду/express на промисах - рвет руби в 3 раза - и это мегаоптимизированный sinatra, а rails вообще в хвосте плетется с отставанием в 50 раз.
Потому что в ng2 подход к компиляции темплейтов изменился на 100%. В первом парсинг темплейта и развешивание хэндлеров происходили в браузере, поэтом весь фарш из атрибутов ангуляра был виден. Сейчас у Анугляра появился собственный парсер HTML и все темплейты проходят через компиляцию под конкретную платформу - в браузере будут сразу повешены евент хэндлеры, при рендеринге на сервере (universal/isomorph) будет собран только HTML без обработки всяких onload/ondocumentready и потом в браузере уже прицепляются хэндлеры.
В итоге старт приложения в браузере для ng2 может занять чуть больше времени/ресурсов, но при этом весь HTML темплейта будет провалидирован и мутных ошибок первого ангуляра при потере закрывающего div или опечатке в имени атрибута директивы не будет.
да не нужен никакой ручной рефреш - это дыра в безопасности, "skipAuthorization: true," - сразу по рукам
Вот рабочий код по рефрешу токена на сервере (по ссылке выше):
function(req, res, next) {
var newToken,
token = jwtLib.fetch(req.headers);
if(token) {
jwt.verify(token, config.jwt.secret, {
secret: config.jwt.secret
}, function(err, decoded) {
if(err) {
return res.status(401).send({
message: 'User token is not valid'
});
}
//Refresh: If the token needs to be refreshed gets the new refreshed token
newToken = jwtLib.refreshToken(decoded);
if(newToken) {
// Set the JWT refreshed token in http header
res.set('Authorization', 'Bearer ' + newToken);
next();
} else {
res.set('Authorization', 'Bearer ' + token);
next();
}
});
} else {
return res.status(401).send({
message: 'User token is not present'
});
}
};
на клиенте достаточно только перекладывать его в/из localStorage/sessionStorage:
Токен в базе хранить не нужно. REST совсем не для этого придуман. Никаких сессий в базе! Токен генерить по отработанному стандарту JWT и хранить там всю нужную информацию о юзере. На клиенте грамотно использовать localStorage/ sessionStorage (разные ющера на разных таба!) и цеплять в хидер authorization на каждый запрос к api
Сессия пользователя полностью контролируется expiry в токене и валидируется без обращения к базе.
Выделять в отдельный контроллер/компонент, использовать ui-router чтобы не перегружать этот контроллер при смене URL и держать флаг open/closed в localStorage чтобы по F5 стейт не терялся.
"Использовать http.request на сервере - нормальная практика..." - это костыль который свидетельствует об отсутствии нормального state management в приложении.
В тестах http.request прикрутить (без других костылей) уже не получится. Итог - костыльный говнокод.
zeromq и прочее к рендерингу вообще никак.
Тот же ReactDOMServer.renderToString - синхронный метод => никакие http.request туды впихнуть не получится, значит все данные надо иметь уже в готовом виде.
var state = evaluateStateBasedOnRequestUrl();
var el = ;
return ReactDOMServer.renderToString(el)
Сергей Протько: Набор слов, архитектура бекенда с запросами на http.request в момент генерации базовой страницы - пародия на изоморф. И никакой HTTP2 и кеш тут не спасет.
"Страница начинает генериться через 5 секунд после запроса" - это лучшая характеристика "фуллстэк" девелопера ;-(
Говнокод, в общем, курить гугл "архитектура изоморфных приложений"
copal: Вот из-за таких nodejs "разработчиков" году и считают тормозной и нестабильной. HTTP запрос на сервере на сторонний хост в момент рендеринга базовой страницы приложения - это даже не говногод, это диагноз.
Один HTTP запрос возвращающий разметку и данные будет всегда быстрее, чем загрузка базового SPA, клиентский рендеринг/последующий запрос за данными/повторный рендеринг
Проблема с изоморфами не в "профите", а в увеличенной нагрузке на сервер, но и это можно порешать
copal: клиентский XMLHttpRequest() и серверный http.request() - это не изоморф, а говнокод. Если бы в реальном проекте увидел такую хрень - сразу по рукам чем-нить тяжелым.
Нормальный изоморф работает со своими данными и серверным рендерингом оптимизирует раунд-трипы SPA за страничными данными. И уже только за счет замены нескольких HTTP запросов на один он будет намного быстрее.
for( n in [1,2,2,2]) {
(function (ndx) {
setTimeout(function(){ new Notification('сообщение ' + ndx, {
tag : "order_4656",
body : 'Message text ' + ndx
})}, ndx*500) })(n)
В топе - С++, Java, go, Lua и нода с почетными 50% перфоманса от С++. Так что тут без вариантов, если выбор
между нодой и руби - то без нода без вариантов. Если хочется максимального перфоманса, масштабируемости и надежности за счет статической типизации - то go или Java.
В ноде koa тормозит за счет обвязки генераторной, берите только чистую ноду/express на промисах - рвет руби в 3 раза - и это мегаоптимизированный sinatra, а rails вообще в хвосте плетется с отставанием в 50 раз.
А вообще Руби умер, он не нужен.