1 / 48

Tactoom изнутри

Tactoom.com изнутри. Юра Богданов Техдир и соучредитель Tactoom.com. Юра Богданов Техдир и соучредитель Tactoom.com. 9 лет в сфере веб-разработки Последние три года работаю над своими проектами Люблю экспериментировать с новыми технологиями

Download Presentation

Tactoom изнутри

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Tactoom.com изнутри Юра Богданов Техдир и соучредитель Tactoom.com

  2. Юра Богданов Техдир и соучредитель Tactoom.com • 9 лет в сфере веб-разработки • Последние три года работаю над своими проектами • Люблю экспериментировать с новыми технологиями • Использую NodeJS с самых ранних версий (более 2х лет) на production

  3. Tactoom.com Блоггинг на основе интересов

  4. NodeJS • Серверный JavaScript на базе Google V8 • Событийный ввод/вывод (Evented I/O) • Идеально подходит для realtime приложений

  5. NodeJS для чего подходит лучше всего • Много I/O + большая конкурентность • RIA —«богатые» приложения • API • Proxy • Realtime • Чаты • Онлайн игры • Трансляции • Publish/Subscribe, COMET

  6. NodeJS для чего подходит лучше всего • Много I/O + большая конкурентность • RIA —«богатые» приложения • API • Proxy • Realtime • Чаты • Онлайн игры • Трансляции • Publish/Subscribe, COMET • Блог-платформы :)

  7. Приятные особенности

  8. Общий код для сервера и клиента • Общие «виды» (views) • Общие модули типа sprintf, crc32 • Markdown процессинг на сервере и на клиенте • Возможность писать unit-тесты сразу на два фронта • Легко работать с одним языком, даже не смотря на то, что принцип работы совсем разный Приятные особенности

  9. ExpressJS web framework • Sinatra inspired • Легкий • Быстрый • Гибкий, модульный, расширяемый (connect) var app = express.createServer(); app.get('/', function(req, res){ res.send('Hello World'); }); app.listen(3000); Приятные особенности

  10. COMET • Сервис мгновенных сообщений о событиях пользователю • Очень лаконичнаяреализация на NodeJS – спасибо коллегам из Geometria.ru за Beseda https://github.com/geometria-lab/Beseda Приятные особенности

  11. Неприятные особенности

  12. Callback-driven парадигма • Любой ввод/вывод – неблокирующий • Следовательно, каждая операция ввод/вывода требует callback, а значит, новый контекст • Нельзя использовать try/throw/catch • Вместо этого, используется конвенциональное решение для обработки ошибок • Следовательно, много служебного шума в вашем коде • Спагетти код и необходимость изменения привычного подхода к дизайну Неприятные особенности

  13. node-sync Callback-driven парадигма Function.prototype.sync = function(context, arguments…) • Использует сопрограммы (coroutines)с++ • Основан на node-fibers • Позволяет писать на nodejs без коллбэков • Позволяет использовать родные try/throw/catch • Ввод-вывод можно использовать внутри циклов https://github.com/laverdet/node-fibers https://github.com/0ctave/node-sync tactoom

  14. node-sync, synopsis: callback-driven: fs.readFile(‘file.txt’, function(err, content) { if (err) return console.error(err); }); node-sync: try { var content = fs.readFile.sync(fs, ‘file.txt’); } catch(e) { console.error(e); } https://github.com/0ctave/node-sync tactoom

  15. Очень легко налажать • JavaScript супер гибкий, что не всегда является преимуществом для серверной технологии • Существует много неочевидных нюансов самой технологии, о которых нужно всегда помнить • При отсутствии четкой конвенции становится сложно проектировать большое приложение Неприятные особенности

  16. Очень легко налажать • JavaScript на front-end писать на много легче: • Нет многопользовательсвого аспекта • Управление памятью не так важно • Меньше операций ввода/вывода • «Взрослые» фреймворки и стандарты Неприятные особенности

  17. Плохая отказоустойчивость • Один процесс обслуживает множество запросов одновременно • Следовательно, ошибка в одном запросе может: • привести к потере данных • привести к зависанию сотен других запросов • нарушить целостность состояния системы • Нет гарантированной изоляции стэка для каждого запроса/сессии (как, например, в erlang) Неприятные особенности

  18. Плохая отказоустойчивость • В Tactoom проблема частично решена: • node-sync повышает надежность благодаря родному try/throw/catch • node-sync изолирует каждый запрос в новом «волокне» (fiber) • запускаем больше процессов Неприятные особенности

  19. Очень сложно искать утечки памяти • Замыкания и долго живущие процессы приводят к неоднозначности процедуры сборки мусора • Сложно не допускать утечек памяти, особенно с использованием сторонних библиотек • Нет нормальных средств для отладки, тем более на production Неприятные особенности

  20. Очень сложно искать утечки памяти • В Tactoom: • При хабра/mail эффекте один процесс ест 1ГБ за 10 минут • Проблема «решена»написанием плагина к node-cluster, который перезапускает «зажравшиеся» процессы Неприятные особенности

  21. Странное open-source сообщество • Каждый делает по своему, поскольку общепринятый стандарт только на стадии зарождения • Очень много споров вокруг технологии, и все по своему правы, нет единого (авторитетного) мнения Неприятные особенности

  22. Странное open-source сообщество • Ввиду очень стремительного развития технологии, в основном, все плюют на обратную совместимость • Для многих NodeJS – не более чем игрушка, по этому большинство модулей не поддерживаются • Tactoom: • До сих пор работает на node 0.4.12 • Переход на >= 0.5.x не представляется реальным Неприятные особенности

  23. Заключение Цитируя лозунг создателей NodeJS: «Because nothing blocks, less-than-expert programmers are able to develop fast systems.» «Из-за того, что ничего не блокируется, менее-чем-эксперты могут разрабатывать быстрые системы.» Мой вывод: Для того, чтобы разрабатывать быстрые и надежные системы на NodeJS, нужно быть экспертом. Tactoom: С точки зрения бизнеса, NodeJS как технология, себя не оправдала. Для реализации большинства задач платформы, NodeJS скорее являлась препятствием, нежели эффективным решением.

  24. Другие технологии • Redis • Key-value store • Сервер очередей • Кросс-серверный mutex • Кэш • Publish/Subscribe • MongoDB • Elasticsearch • Быстрый поиск интересов • Capistrano • Rackspace • Erlang/Webmachine • Загрузка и обработка аудио

  25. Юра Богданов Tactoom: http://tactoom.com/octave About.me: http://about.me/bogdanov Github: https://github.com/0ctave Twitter: http://twitter.com/yuriybogdanov LinkedIn: http://linkedin.com/in/yuriybogdanov Habrahabr: http://octave.habrahabr.ru/ Email: octave@tactoom.com Спасибо за внимание.

  26. Appendix

  27. Особенности NodeJS • NodeJS – один процесс, один поток, одно ядро CPU • 100% утилизация ядра CPU • Нет гонок(race conditions) • Почти нет головняка с параллельным доступом к данным • Меньше переключений контекста CPU • Как масштабировать? • Количество процессов= количество ядер CPU • node-cluster • Меняется парадигма доступа к данным

  28. Масштабирование CPU x4 Node http://0.0.0.0:3000

  29. Масштабирование CPU x4 CPU x4 Node Node1 Node2 Node3 Node4 node-cluster http://0.0.0.0:3000 http://0.0.0.0:3000

  30. Масштабирование 1 процесс: var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World\n'); }).listen(3000); node-cluster (много процессов): var http = require('http'), cluster = require('cluster'); var server = http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World\n'); }); cluster(server).listen(3000);

  31. Масштабирование > 1 сервера CPU x4 Node1 Node2 Node3 Node4 node-cluster http://0.0.0.0:3000

  32. Масштабирование > 1 сервера Сервер1 Сервер2 Node1 Node1 Node2 Node2 Node3 Node3 Node4 Node4 node-cluster node-cluster http://0.0.0.0:3000 http://0.0.0.0:3000 ?

  33. Масштабирование > 1 сервера Сервер1 Сервер2 Node1 Node1 Node2 Node2 Node3 Node3 Node4 Node4 node-cluster node-cluster http://0.0.0.0:3000 http://0.0.0.0:3000 nginx (upstream)

  34. Масштабирование > 1 сервера Сервер1 Сервер2 Node1 Node1 Node2 Node2 Node3 Node3 Node4 Node4 node-cluster node-cluster upstream servers { server server1:3000; server server2:3000; } server { location / { proxy_pass http://servers; } }

  35. Декомпозиция • Географическая • сервера в разных зонах • приоритезация зон • перераспределение функций по зонам • перераспределение функций в зависимости от характеристик серверов • Функциональная • вынесение ресурсоемких операций на другие сервера («фон»)

  36. Географическая декомпозиция Сервер1 Сервер2 Франция Rackspace CDN DB JS JS JS JS JS JS JS JS node-cluster node-cluster

  37. Географическая декомпозиция Сервер1 Сервер2 Франция Rackspace CDN DB JS JS JS JS JS JS JS JS node-cluster node-cluster

  38. Географическая декомпозиция Сервер1 Сервер2 Франция Rackspace CDN DB JS JS JS JS JS JS JS JS node-cluster node-cluster

  39. Географическая декомпозиция upstream servers { server server1:3000; server server2:3000; } server { location / { proxy_pass http://servers; } }

  40. Географическая декомпозиция upstream main { server server1:3000 weight=10; server server2:3000 weight=1; } upstream fastcdn { server server1:3000 weight=1; server server2:3000 weight=10; } server { location / { proxy_pass http://main; } location /upload_avatar { proxy_pass http://fastcdn; } }

  41. Функциональная декомпозиция Сервер1 Сервер2 JS JS JS JS JS JS JS JS «фоновые» операции

  42. Функциональная декомпозиция Сервер1 Сервер2 Сервер3 JS JS JS JS JS JS JS JS JS JS JS JS Q Сервер очередей «фоновые» операции

  43. Функциональная декомпозиция Сервер1 Сервер4 Сервер2 Сервер3 JS JS JS JS JS JS JS JS JS JS JS JS JS JS JS JS Q Сервер очередей «фоновые» операции

  44. Функциональная декомпозиция Сервер3 JS JS JS JS Redis – http://redis.io Kue – http://learnboost.github.com/kue/ node-cluster – http://learnboost.github.com/cluster/ «фоновые» операции

  45. Redis • Очереди • lists • LPUSH • RPOP, BRPOP • Кэш • GET/SET • EXPIRE • Кросс-серверный mutex • Для изоляции участков кода между процессами • Publish/Subscribe • Для общения между процессами Redis is an open source, advanced key-value store.

  46. MongoDB • SchemaLess • Less I/O • Convenient and flexible • ReplicaSets & Automatic failover • Native JSON, data-driven queries • Easy migrations • Atomic operations MongoDB is a scalable, high-performance, open source NoSQL database. Written in C++.

  47. ElasticSearch • SchemaLess • JSON • RESTful • Scalable • Fast • A lot of features RESTful opensource search backend written on top of Apache Lucene.

  48. ElasticSearch http://tactoom.com СерверX (NodeJS) СерверX (NodeJS) СерверX (NodeJS) nginx JS JS JS JS JS JS JS JS JS JS JS JS MongoDB ElasticSearch

More Related