#Что нужно делать, а чего делать не нужно!
{
// stage properties
dataExtractor:[null, Function(ctx):[String, Object]],
template:[null, String],
errorExtractor:[null, Function(err, ctx):[String,Object]],
errorTemplate:[null, String],
success:[null, Function(req,res,content)],
failure:[null, Function(req,res,content)],
run:[String, function([err, ] ctx[, done]), Stage]
// coworker list
coworker : [String, {
name:[String],// name of registered worker
root:[String]// root of the context for worker
}],
//---- route properties
route:[null, String],
regexp:[null, RegExp],
methods:[Array(String)],
}registerWorker принимает следующие параметры:
name: String- Название воркера, по которому его будет искать система.worker: function([err,] ctx[, done]) | Stage- методы обоаботчик, к нему применимы все правила по работе с pipeline.js
Необходимо использовать pipeline.js где только это возможно.
Основной принцип pipeline.js и главное преимущество этой библиотеки --- декларативное описание действий, которые нужно выполнить в какой либо последовательности.
Для этих целей уже есть 11(!) стандартных Stage , которые можно использовать в разработке.
сигнатура метода stage может быть 4х видов:
function(err, ctx, done);function(ctx, done);function(ctx);function();
err - необходимо задавать ТОЛЬКО если вы сами обрабатываете код ошибки внутри метода, в этом случае ошибка с предыдуших шагов будет передана внутрь этого метода
done - неоходимо задавать ТОЛЬКО если вам нужно обработать асинхронную операцию внутри кода.
ctx - это контекст выполнения метода
>Note: если этот параметр не указан, то контекстом является this тела функции.
Отличие Promises/A+ vs Pipeline.js pipeline.js нет памяти одна и та же функция может обрабатывать много разных контекстов. поэтому это stage этап конвеера. Promises/A+ каждый промис содержит результат выполнения внутри себя... получается как бы он unmutable
##Обработка ошибок
2. все ошибки оборачивать в new Error('<текст моей ошибки>') это позволит найти ошибку по трассировке свойства err.stack.
1. если для обработки ошибки нужна какая-то информация. создавать свой тип ошибки, регистрировать где-то и все равно передавать объект ошибки.
2. pipeline.js будет ругаться если в done будет передан не экземпляр Error т.е. `new Error('текст моего сообщения об ошибке')`
3. Гасить ошибки внтутри метода, **ТОЛЬКО** если вы сможете их обработать.
4. для обработки ошибок выводить в консоль. `err.stack` он дает большую информацию об ошибке.
5. для отслеживания места ошибки можно использовать код:
var log = new Error();
console.log(log.stack);Для просмотра работы кода и ошибок вместо console.log() использовать debug
Пример кода:
var debug = require('debug')('my:cool:errorLogger');
...
...
// error, or messagelog
debug('all works better than ever', err.stack);код console.log не будет тормозить работу приложения, поскольку операция синхронная, т.е. с ожиданием времени необходимого на вывод сообщения.
для отладки нужно запустить grainjs таким образом
DEBUG=my:* grainjs edit
#или
DEBUG=*:cool:* grainjs edit
#или
DEBUG=* grainjs editв последнем случае консоль наполниться всеми известными и неизвестными сообщениями об ошибках.
- не использовать глобальные переменные для передачи ошибок между функциями. пишите асинхронный код с вызовом в callback ошибки. для простых вещей, можно использовать promise, Но лучше использовать pipeline
##Templates Q: rак Закомментировать код шаблона чтобы он не обрабатывался? A: закомментировать код шаблона можно поместив его часть в JS раздел и закомментировать в стиле js
какой-то код шаблона
<#
/*
тут любой текст и прочее которое не должно попасть в шаблон
или не должен обрабатываться шаблонизатором
*/
#>
продолжение шаблонастатьи о сравнении Promises/A+
http://spion.github.io/posts/why-i-am-switching-to-promises.html прочитать всем... 1. чистый стек завалит только саму операцию в случае падения... но не весь процесс.... поэтому нужно использовать process.nextTick();
http://robotlolita.me/2013/06/28/promises-considered-harmful.html http://spion.github.io/posts/analysis-generators-and-other-async-patterns-node.html
Анализ скорости показал! 1. Pipeline.js стабилен в скорости ... 2. вызов callback через setImmediate замедляет работу кода асинхронного кодо до 20% 3. скорее всего проблема средних показателей в context. Поскольку должен выполняться код преобразования значений
ссылка на репозиторий: https://github.com/vedmalex/promises-benchmark
выполнение кода с setImmediate на callback с проверкой ошибок
node scenarios/serial/index.js
:: Benchmarks for: Serial (no noise)
›› pipeline.js x 73.69 ops/sec ±7.56% (61 runs sampled)
:: Benchmarks for: Serial (some noise)
›› pipeline.js x 75.23 ops/sec ±6.66% (80 runs sampled)
:: Benchmarks for: Serial (noisy)
›› pipeline.js x 74.60 ops/sec ±5.38% (75 runs sampled)
:: Benchmarks for: Serial (mostly noise)
›› pipeline.js x 58.84 ops/sec ±5.04% (74 runs sampled)
node scenarios/light-serial/index.js
:: Benchmarks for: Lightweight serial (no noise)
›› pipeline.js x 82.05 ops/sec ±6.73% (76 runs sampled)
:: Benchmarks for: Lightweight serial (some noise)
›› pipeline.js x 79.60 ops/sec ±5.43% (80 runs sampled)
:: Benchmarks for: Lightweight serial (noisy)
›› pipeline.js x 75.40 ops/sec ±5.14% (76 runs sampled)
:: Benchmarks for: Lightweight serial (mostly noise)
›› pipeline.js x 57.14 ops/sec ±5.72% (74 runs sampled)
node scenarios/parallel/index.js
:: Benchmarks for: Parallelism (no cache)
›› pipeline.js x 151 ops/sec ±4.05% (64 runs sampled)
:: Benchmarks for: Parallelism (small cache)
›› pipeline.js x 182 ops/sec ±3.68% (76 runs sampled)
:: Benchmarks for: Parallelism (big cache)
›› pipeline.js x 231 ops/sec ±4.20% (62 runs sampled)
:: Benchmarks for: Parallelism (fully cached)
›› pipeline.js x 409 ops/sec ±3.69% (80 runs sampled)
Версия без проверок на ошибки
node scenarios/serial/index.js
:: Benchmarks for: Serial (no noise)
›› pipeline.js x 65.57 ops/sec ±6.04% (55 runs sampled)
:: Benchmarks for: Serial (some noise)
›› pipeline.js x 94.20 ops/sec ±6.55% (83 runs sampled)
:: Benchmarks for: Serial (noisy)
›› pipeline.js x 98.58 ops/sec ±5.40% (82 runs sampled)
:: Benchmarks for: Serial (mostly noise)
›› pipeline.js x 91.92 ops/sec ±5.89% (77 runs sampled)
node scenarios/light-serial/index.js
:: Benchmarks for: Lightweight serial (no noise)
›› pipeline.js x 101 ops/sec ±6.66% (77 runs sampled)
:: Benchmarks for: Lightweight serial (some noise)
›› pipeline.js x 102 ops/sec ±5.11% (78 runs sampled)
:: Benchmarks for: Lightweight serial (noisy)
›› pipeline.js x 102 ops/sec ±5.47% (84 runs sampled)
:: Benchmarks for: Lightweight serial (mostly noise)
›› pipeline.js x 94.70 ops/sec ±4.94% (79 runs sampled)
node scenarios/parallel/index.js
:: Benchmarks for: Parallelism (no cache)
›› pipeline.js x 237 ops/sec ±3.84% (85 runs sampled)
:: Benchmarks for: Parallelism (small cache)
›› pipeline.js x 226 ops/sec ±3.93% (81 runs sampled)
:: Benchmarks for: Parallelism (big cache)
›› pipeline.js x 342 ops/sec ±3.88% (67 runs sampled)
:: Benchmarks for: Parallelism (fully cached)
›› pipeline.js x 552 ops/sec ±4.57% (53 runs sampled)
pipeline.js
c Проверкой на ошибки без выполнения setImmediate
node scenarios/serial/index.js
:: Benchmarks for: Serial (no noise)
›› pipeline.js x 60.30 ops/sec ±3.54% (53 runs sampled)
:: Benchmarks for: Serial (some noise)
›› pipeline.js x 94.30 ops/sec ±6.27% (82 runs sampled)
:: Benchmarks for: Serial (noisy)
›› pipeline.js x 93.60 ops/sec ±5.24% (80 runs sampled)
:: Benchmarks for: Serial (mostly noise)
›› pipeline.js x 83.43 ops/sec ±6.13% (72 runs sampled)
node scenarios/light-serial/index.js
:: Benchmarks for: Lightweight serial (no noise)
›› pipeline.js x 98.70 ops/sec ±6.36% (86 runs sampled)
:: Benchmarks for: Lightweight serial (some noise)
›› pipeline.js x 97.52 ops/sec ±5.27% (82 runs sampled)
:: Benchmarks for: Lightweight serial (noisy)
›› pipeline.js x 96.47 ops/sec ±4.98% (80 runs sampled)
:: Benchmarks for: Lightweight serial (mostly noise)
›› pipeline.js x 86.34 ops/sec ±4.78% (85 runs sampled)
node scenarios/parallel/index.js
:: Benchmarks for: Parallelism (no cache)
›› pipeline.js x 221 ops/sec ±3.76% (83 runs sampled)
:: Benchmarks for: Parallelism (small cache)
›› pipeline.js x 211 ops/sec ±3.12% (85 runs sampled)
:: Benchmarks for: Parallelism (big cache)
›› pipeline.js x 312 ops/sec ±3.48% (66 runs sampled)
:: Benchmarks for: Parallelism (fully cached)
›› pipeline.js x 489 ops/sec ±4.74% (57 runs sampled)
When
node scenarios/serial/index.js
:: Benchmarks for: Serial (no noise)
›› When x 79.69 ops/sec ±7.16% (68 runs sampled)
:: Benchmarks for: Serial (some noise)
›› When x 78.94 ops/sec ±6.46% (85 runs sampled)
:: Benchmarks for: Serial (noisy)
›› When x 83.86 ops/sec ±4.72% (83 runs sampled)
:: Benchmarks for: Serial (mostly noise)
›› When x 76.43 ops/sec ±5.02% (76 runs sampled)
node scenarios/light-serial/index.js
:: Benchmarks for: Lightweight serial (no noise)
›› When x 156 ops/sec ±6.27% (81 runs sampled)
:: Benchmarks for: Lightweight serial (some noise)
›› When x 146 ops/sec ±5.96% (86 runs sampled)
:: Benchmarks for: Lightweight serial (noisy)
›› When x 143 ops/sec ±5.06% (80 runs sampled)
:: Benchmarks for: Lightweight serial (mostly noise)
›› When x 122 ops/sec ±5.00% (77 runs sampled)
node scenarios/parallel/index.js
:: Benchmarks for: Parallelism (no cache)
›› When x 249 ops/sec ±3.60% (79 runs sampled)
:: Benchmarks for: Parallelism (small cache)
›› When x 257 ops/sec ±3.46% (79 runs sampled)
:: Benchmarks for: Parallelism (big cache)
›› When x 404 ops/sec ±3.28% (84 runs sampled)
:: Benchmarks for: Parallelism (fully cached)
›› When x 721 ops/sec ±2.51% (45 runs sampled)
bluebird
node scenarios/serial/index.js
:: Benchmarks for: Serial (no noise)
›› bluebird x 44.20 ops/sec ±6.00% (64 runs sampled)
:: Benchmarks for: Serial (some noise)
›› bluebird x 70.58 ops/sec ±6.52% (77 runs sampled)
:: Benchmarks for: Serial (noisy)
›› bluebird x 69.62 ops/sec ±6.16% (73 runs sampled)
:: Benchmarks for: Serial (mostly noise)
›› bluebird x 65.64 ops/sec ±4.02% (81 runs sampled)
node scenarios/light-serial/index.js
:: Benchmarks for: Lightweight serial (no noise)
›› bluebird x 135 ops/sec ±5.38% (81 runs sampled)
:: Benchmarks for: Lightweight serial (some noise)
›› bluebird x 123 ops/sec ±6.02% (81 runs sampled)
:: Benchmarks for: Lightweight serial (noisy)
›› bluebird x 115 ops/sec ±4.89% (82 runs sampled)
:: Benchmarks for: Lightweight serial (mostly noise)
›› bluebird x 95.73 ops/sec ±5.09% (80 runs sampled)
node scenarios/parallel/index.js
:: Benchmarks for: Parallelism (no cache)
›› bluebird x 245 ops/sec ±4.18% (81 runs sampled)
:: Benchmarks for: Parallelism (small cache)
›› bluebird x 261 ops/sec ±3.89% (81 runs sampled)
:: Benchmarks for: Parallelism (big cache)
›› bluebird x 399 ops/sec ±3.62% (72 runs sampled)
:: Benchmarks for: Parallelism (fully cached)
›› bluebird x 688 ops/sec ±2.88% (63 runs sampled)
Вывод: тесты синтетические, но pipeline.js показал неплохие результаты. сравнимые с лидирующими библиотеками Promises/A+