Upload
stepan-stolyarov
View
2.838
Download
2
Embed Size (px)
DESCRIPTION
Citation preview
NodeJSNodeJS • • CouchDBCouchDB
Серверный JavaScriptСерверный JavaScript
Привет, мир!Привет, мир!
Степан СтоляровСтепан Столяровhttp://bit.ly/stevebesthttp://bit.ly/stevebest
[email protected]@gmail.com
Вопросы: Вопросы: http://goo.gl/mod/ABoChttp://goo.gl/mod/ABoC
JavaScriptz LOL!JavaScriptz LOL!
http://www.flickr.com/photos/wanderingnome/61806757/
БыстрыйБыстрый
http://www.flickr.com/photos/eole/380316678/
ПростойПростой
http://www.flickr.com/photos/ldrose/4609205635/
Богатый инструментарийБогатый инструментарий
http://www.flickr.com/photos/ontario_wanderer/3496185271/
One lang to rule them allOne lang to rule them all
http://www.flickr.com/photos/alessandrocarrozzo/442563751/
NodeJSNodeJS
● Первая реализация серверного JavaScript, Первая реализация серверного JavaScript, которой хочется пользоватьсякоторой хочется пользоваться
● Событийный ввод/вывод для Google V8Событийный ввод/вывод для Google V8
http://nodejs.org/http://nodejs.org/
http://github.com/ry/nodehttp://github.com/ry/node
Наивный ввод-выводНаивный ввод-вывод
1010 PRINTPRINT 'Как вас зовут?''Как вас зовут?'2020 INPUTINPUT name name3030 PRINTPRINT 'Привет, ''Привет, ', name, , name, '!''!'4040 ENDEND
Неблокирующий ввод-выводНеблокирующий ввод-вывод
print(print('Как вас зовут?''Как вас зовут?'););
input(input(functionfunction (name) {(name) { print( print('Привет, ''Привет, ' + name + + name + '!''!'););});});
// Мы можем продолжать выполнение,// Мы можем продолжать выполнение,// не дожидаясь ответа.// не дожидаясь ответа.
NodeJS: зачем?NodeJS: зачем?
● Серверные приложения должны быть Серверные приложения должны быть производительнымипроизводительными
● Один процессорный поток на соединение — Один процессорный поток на соединение — это неоптимальноэто неоптимально● Затраты на обработку и переключение потоковЗатраты на обработку и переключение потоков● Смена контекстов дорога (стек выполнения, кеш Смена контекстов дорога (стек выполнения, кеш
процессора)процессора)● Thread safetyThread safety
● Решение — один поток с циклом событийРешение — один поток с циклом событий
Событийный эхо-серверСобытийный эхо-сервер
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"););
NodeJS: что внутри?NodeJS: что внутри?
● Двоичные буферы и потоки ввода-выводаДвоичные буферы и потоки ввода-вывода● События и таймерыСобытия и таймеры● Файловая система и процессыФайловая система и процессы● Сеть, Сеть, сокеты, DNS, UDP, сокеты, DNS, UDP, HTTPHTTP, query string, query string● КриптографияКриптография● Запуск скриптов в управляемой средеЗапуск скриптов в управляемой среде● Assert, юнит-тестированиеAssert, юнит-тестирование● REPLREPL
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/
Документы — это 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" }}}}
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" } }} }
]}]}
Moar JavaScriptz!Moar JavaScriptz!
● Валидация данныхВалидация данных● Генерация представления в различных Генерация представления в различных
форматахформатах● Получение и преобразование списковПолучение и преобразование списков
CouchAppsCouchApps
● CouchDB — это сервер БД, сервер CouchDB — это сервер БД, сервер приложений, и веб-серверприложений, и веб-сервер
● CouchApps — приложения для CouchDBCouchApps — приложения для CouchDB● couchappcouchapp — инструмент разработки — инструмент разработки
● «Офлайновый режим» бесплатно«Офлайновый режим» бесплатно● P2P приложенияP2P приложения
NodeJS: масштабированиеNodeJS: масштабирование
● Масштабирование — это сложная штукаМасштабирование — это сложная штука● Многопроцессорные системы: запустите Многопроцессорные системы: запустите
больше процессовбольше процессов● Разделите сокет между процессами. Разделите сокет между процессами.
Балансировщик — ядро ОСБалансировщик — ядро ОС● Используйте традиционные средства IPCИспользуйте традиционные средства IPC● WebWorkersWebWorkers
● Масштабирование вниз: Palm webOSМасштабирование вниз: Palm webOS
NodeJS: рецептыNodeJS: рецепты
● Многопользовательские приложенияМногопользовательские приложения● Онлайновые игрыОнлайновые игры
● Низкоуровневая работа с запросамиНизкоуровневая работа с запросами● Обработка больших файловОбработка больших файлов● Потоковая генерация и скачиваниеПотоковая генерация и скачивание
● Создание mash-upsСоздание mash-ups