codefest 2010. Столяров С. — Серверный javascript: nodejs и couchdb

26
NodeJS NodeJS CouchDB CouchDB Серверный JavaScript Серверный JavaScript

Upload: codefest

Post on 11-May-2015

856 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB

NodeJSNodeJS • • CouchDBCouchDB

Серверный JavaScriptСерверный JavaScript

Page 2: CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB

Привет, мир!Привет, мир!

Степан СтоляровСтепан Столяровhttp://bit.ly/stevebesthttp://bit.ly/stevebest

[email protected]@gmail.com

Вопросы: Вопросы: http://goo.gl/mod/ABoChttp://goo.gl/mod/ABoC

Page 3: CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB

JavaScriptz LOL!JavaScriptz LOL!

http://www.flickr.com/photos/wanderingnome/61806757/

Page 4: CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB

БыстрыйБыстрый

http://www.flickr.com/photos/eole/380316678/

Page 5: CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB

ПростойПростой

http://www.flickr.com/photos/ldrose/4609205635/

Page 6: CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB

Богатый инструментарийБогатый инструментарий

http://www.flickr.com/photos/ontario_wanderer/3496185271/

Page 7: CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB

One lang to rule them allOne lang to rule them all

http://www.flickr.com/photos/alessandrocarrozzo/442563751/

Page 8: CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB
Page 9: CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB

NodeJSNodeJS

● Первая реализация серверного JavaScript, Первая реализация серверного JavaScript, которой хочется пользоватьсякоторой хочется пользоваться

● Событийный ввод/вывод для Google V8Событийный ввод/вывод для Google V8

http://nodejs.org/http://nodejs.org/

http://github.com/ry/nodehttp://github.com/ry/node

Page 10: CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB

Наивный ввод-выводНаивный ввод-вывод

1010 PRINTPRINT 'Как вас зовут?''Как вас зовут?'2020 INPUTINPUT name name3030 PRINTPRINT 'Привет, ''Привет, ', name, , name, '!''!'4040 ENDEND

Page 11: CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB

Неблокирующий ввод-выводНеблокирующий ввод-вывод

print(print('Как вас зовут?''Как вас зовут?'););

input(input(functionfunction (name) {(name) { print( print('Привет, ''Привет, ' + name + + name + '!''!'););});});

// Мы можем продолжать выполнение,// Мы можем продолжать выполнение,// не дожидаясь ответа.// не дожидаясь ответа.

Page 12: CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB

NodeJS: зачем?NodeJS: зачем?

● Серверные приложения должны быть Серверные приложения должны быть производительнымипроизводительными

● Один процессорный поток на соединение — Один процессорный поток на соединение — это неоптимальноэто неоптимально● Затраты на обработку и переключение потоковЗатраты на обработку и переключение потоков● Смена контекстов дорога (стек выполнения, кеш Смена контекстов дорога (стек выполнения, кеш

процессора)процессора)● Thread safetyThread safety

● Решение — один поток с циклом событийРешение — один поток с циклом событий

Page 13: CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB

Событийный эхо-серверСобытийный эхо-сервер

varvar net = require( net = require("net""net"););

functionfunction handle(socket) { handle(socket) {

socket.on(socket.on("data""data", , functionfunction (data) { (data) { socket.write(data); socket.write(data); }); });

socket.on(socket.on("end""end", , functionfunction () { () { socket.end(); socket.end(); }); });

};};

varvar server = net.createServer(handle); server = net.createServer(handle);

server.listen(server.listen(77777777, , "127.0.0.1""127.0.0.1"););

Page 14: CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB

NodeJS: что внутри?NodeJS: что внутри?

● Двоичные буферы и потоки ввода-выводаДвоичные буферы и потоки ввода-вывода● События и таймерыСобытия и таймеры● Файловая система и процессыФайловая система и процессы● Сеть, Сеть, сокеты, DNS, UDP, сокеты, DNS, UDP, HTTPHTTP, query string, query string● КриптографияКриптография● Запуск скриптов в управляемой средеЗапуск скриптов в управляемой среде● Assert, юнит-тестированиеAssert, юнит-тестирование● REPLREPL

Page 15: CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB
Page 16: CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB

CouchDBCouchDB

● Не просто NoSQL «DB»Не просто NoSQL «DB»● Документо-ориентированная БДДокументо-ориентированная БД

● JSON, схемы данных нетJSON, схемы данных нет● RESTful HTTP APIRESTful HTTP API● Нет SQL, нет JOINНет SQL, нет JOIN

● Реализация Map/Reduce на JavaScriptРеализация Map/Reduce на JavaScript● Встроенная веб-консоль управления FutonВстроенная веб-консоль управления Futon

http://couchdb.apache.org/http://couchdb.apache.org/

Page 17: CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB

Документы — это JSONДокументы — это JSON

{{ "_id""_id" : : "stevebest""stevebest",, "_rev""_rev" : : "1-c0d3...fe57""1-c0d3...fe57",, "type""type" : : "vcard""vcard",, "firstName""firstName" : : "Степан""Степан",, "lastName""lastName" : : "Столяров""Столяров",, "email""email" : : "[email protected]""[email protected]",, "phone""phone" : { : { "cell""cell" : : "+78005551234""+78005551234" }}}}

Page 18: CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB

Map/ReduceMap/Reduce

functionfunction (doc) { (doc) { ifif (doc.type == (doc.type == 'vcard''vcard') {) { emit(doc.lastName + emit(doc.lastName + ' '' ' + doc.firstName, + doc.firstName, doc.phone); doc.phone); } }}}

{ { "total_rows""total_rows": : 11, , "offset""offset": : 00, , "rows""rows": [: [

{ { "id""id": : "stevebest""stevebest",, "key""key": : "Столяров Степан""Столяров Степан",, "value""value": { : { "cell""cell" : : "+78005551234" "+78005551234" } }} }

]}]}

Page 19: CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB

Moar JavaScriptz!Moar JavaScriptz!

● Валидация данныхВалидация данных● Генерация представления в различных Генерация представления в различных

форматахформатах● Получение и преобразование списковПолучение и преобразование списков

Page 20: CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB

CouchAppsCouchApps

● CouchDB — это сервер БД, сервер CouchDB — это сервер БД, сервер приложений, и веб-серверприложений, и веб-сервер

● CouchApps — приложения для CouchDBCouchApps — приложения для CouchDB● couchappcouchapp — инструмент разработки — инструмент разработки

● «Офлайновый режим» бесплатно«Офлайновый режим» бесплатно● P2P приложенияP2P приложения

Page 21: CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB

[email protected]@gmail.com

KTHXBYE!KTHXBYE!

Page 22: CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB

NodeJS: масштабированиеNodeJS: масштабирование

● Масштабирование — это сложная штукаМасштабирование — это сложная штука● Многопроцессорные системы: запустите Многопроцессорные системы: запустите

больше процессовбольше процессов● Разделите сокет между процессами. Разделите сокет между процессами.

Балансировщик — ядро ОСБалансировщик — ядро ОС● Используйте традиционные средства IPCИспользуйте традиционные средства IPC● WebWorkersWebWorkers

● Масштабирование вниз: Palm webOSМасштабирование вниз: Palm webOS

Page 23: CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB

NodeJS: рецептыNodeJS: рецепты

● Многопользовательские приложенияМногопользовательские приложения● Онлайновые игрыОнлайновые игры

● Низкоуровневая работа с запросамиНизкоуровневая работа с запросами● Обработка больших файловОбработка больших файлов● Потоковая генерация и скачиваниеПотоковая генерация и скачивание

● Создание mash-upsСоздание mash-ups

Page 24: CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB
Page 25: CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB
Page 26: CodeFest 2010. Столяров С. — Серверный JavaScript: NodeJS и CouchDB