Skip to content

Instantly share code, notes, and snippets.

@vedmalex
Last active August 29, 2015 14:17
Show Gist options
  • Select an option

  • Save vedmalex/455f4e0154c89ba115b1 to your computer and use it in GitHub Desktop.

Select an option

Save vedmalex/455f4e0154c89ba115b1 to your computer and use it in GitHub Desktop.

#Что нужно делать, а чего делать не нужно!

registerWorker, registerController

структура объекта принимаемого в registerController

{
	// 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

registerWorker принимает следующие параметры:

  • name: String - Название воркера, по которому его будет искать система.
  • worker: function([err,] ctx[, done]) | Stage - методы обоаботчик, к нему применимы все правила по работе с pipeline.js

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 тела функции.

pipeline.js

Отличие 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);

Logging

Для просмотра работы кода и ошибок вместо 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

в последнем случае консоль наполниться всеми известными и неизвестными сообщениями об ошибках.

  1. не использовать глобальные переменные для передачи ошибок между функциями. пишите асинхронный код с вызовом в 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+

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment