Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Изоморфные React-
приложения:

производительность
и масштабирование
Денис Измайлов
Почему от классического
Single Page Application
необходимо отказаться?
Как изоморфные приложения
отразятся на Вашей зарплате?
Что вы будете делать

на этих выходных?
Идеально
1. React 14
2. webpack
3. ES6
4. Node.js
5. Express / koa
6. Isomorphic (Universal) apps
Часть 1
Web стал очень
большим
Искусство

Разработка под Web



Наука
Раньше было просто
• Создал страницу
• Добавил пару скриптов
• Отправил в Production
Раньше было просто
Сервер
Браузер
Раньше было просто
Сервер
Браузер
Делал всё
Раньше было просто
Сервер
Браузер
- HTML
- [CSS, JavaScript]
Делал всё
Это работало
Single Page

Applications

(SPA)
Single Page Application
Сервер
Браузер
Single Page Application
Сервер
Браузер
Страница существует?

Авторизация нужна?

Доступ есть?
Single Page Application
Сервер
Браузер
Страница существует?

Авторизация нужна?

Доступ есть?
- Tiny HTML, [CSS]
- JavaScr...
Single Page Application
Плюсы
• Легко начать
• webpack
• <div id=“root” />
• React, Redux
• build
Single Page Application
Плюсы
• Легко начать
• Богатый функционал
webpack, <div id=“root” />, React, Redux
Single Page Application
Плюсы
• Легко начать
• Богатый функционал
• Быстро дорабатывать
webpack, <div id=“root” />, React,...
Single Page Application
Плюсы
• Легко начать
• Богатый функционал
• Быстро дорабатывать
• Отзывчивый UI
webpack, <div id=“...
Single Page Application
Плюсы
• Легко начать
• Богатый функционал
• Быстро дорабатывать
• Отзывчивый UI
• Удобно кэшироват...
- Wow. И не одного
минуса?
Single Page Application
Минусы
• Долгая загрузка
• JavaScript bundle up to 3-5 Mb
• первое обращение
• исполнение
• память
Single Page Application
Минусы
• Долгая загрузка
• Сложность поддержки
• side-эффекты
• memory leak
1st request, CPU, mem
Single Page Application
Минусы
• Долгая загрузка
• Сложность поддержки
• Пустая страница, один URL
1st request, CPU, mem
s...
Single Page Application
Минусы
• Долгая загрузка
• Сложность поддержки
• Пустая страница, один URL
• Legacy Browsers
1st r...
- Разве это минусы?
Single Page Application
Минусы
• Долгая загрузка
для бизнеса
снижение UX
Single Page Application
Минусы
• Долгая загрузка
• Сложность поддержки
для бизнеса
снижение UX
риски
Single Page Application
Минусы
• Долгая загрузка
• Сложность поддержки
• Пустая страница
для бизнеса
снижение UX
риски
про...
Single Page Application
Минусы
• Долгая загрузка
• Сложность поддержки
• Пустая страница
• Один URL
для бизнеса
снижение U...
Single Page Application
Минусы
• Долгая загрузка
• Сложность поддержки
• Пустая страница
• Один URL
• Legacy Browsers
для ...
Single Page Application
Минусы
• Долгая загрузка
• Сложность поддержки
• Пустая страница
• Один URL
• Legacy Browsers
для ...
Single Page Application
Минусы
для бизнеса
снижение UX
риски
проблемы SEO
проблемы SMM
потеря ЦА
Расходы
- WAT? Что делать?
Взять лучшее из обоих
миров
Изоморфные
приложения
Изоморфные приложения
By isomorphic we mean that any
given line of code (with notable
exceptions) can execute both on
the ...
Шаблоны
Стили
Локализация
Конфигурация
Routes
Права доступа
Модели
Схемы
Валидация
Сервисы
Изоморфные приложения
server.js...
Браузер
Изоморфные приложения
Front-end
сервер
Back-end
сервер



Database
Java

etc
Браузер
Изоморфные приложения
Front-end
сервер
Back-end
сервер



Database
Java

etc
Браузер
Изоморфные приложения
Front-end
сервер
Back-end
сервер



Database
Java

etc
- HTML
- [critical CSS]
- …
Front-end
клиент
Изоморфные приложения
Front-end
сервер
Back-end
сервер



Database
Java

etc
- HTML
- [critical CSS]
- JS...
Front-end
клиент
Изоморфные приложения
Front-end
сервер
Back-end
сервер



Database
Java

etc
- HTML
- [critical CSS]
- JS...
Front-end
клиент
Изоморфные приложения
Front-end
сервер
• Единая среда
исполнения

• Общая кодовая база

• Полный контроль...
- Но как?
Server-Side Rendering

(SSR)
Server-Side Rendering
• Сборка React-приложения в HTML-код
на Front-end сервере
• Моментальное отображение в
браузере, ещё...
Server-Side Rendering
Код на сервере выглядит очень просто:
import ReactDOMServer from 'react-dom/server';

import Applica...
Server-Side Rendering
1. Пользователь видит страницу
мгновенно
2. Отсутствие дополнительных запросов
на получение данных
3...
Часть 2
Производительность
и масштабирование
Масштабирование
Масштабирование

функциональное
Server-Side Rendering
Всё супер, когда данные есть:
import ReactDOMServer from 'react-dom/server';

import Application fro...
Server-Side Rendering
Всё супер, когда данные есть:
import ReactDOMServer from 'react-dom/server';

import Application fro...
Server-Side Rendering
Как получить асинхронный State:

1. Вручную для каждой страницы
2. Facebook Relay
3. redux-catch-pro...
Асинхронный State
Вручную для каждой страницы:
• Получить State, необходимый для
страницы

• ReactDOMServer.renderToString...
Асинхронный State
Facebook Relay:
1. The framework for building data-driven
React applications
2. Declarative. Colocation....
Асинхронный State
redux-catch-promise:
• Redux - state container для React
• Redux: the best for isomorphic apps,
MoscowJS...
Асинхронный State
redux-catch-promise:
1. Вешаем callback для захвата Promise-
экшнов
2. Делаем рендер приложения
3. Делае...
Асинхронный State
redux-catch-promise:
1. Примеры и исходный код:

https://github.com/DenisIzmaylov/
redux-catch-promise
2...
Производительность
Производительность
Тестовый стенд:
MacBook Pro 15” Retina (Early 2013)
2.4 GHz Intel Core i7
Производительность
Размер страницы: 56 238 байт
Производительность
Размер страницы: 56 238 байт
Производительность
Размер страницы: 56 238 байт
Производительность
Размер страницы: 56 238 байт
Производительность
Размер страницы: 56 238 байт
Производительность
Размер страницы: 56 238 байт
Производительность
Для теста используем:
ab -n 100 http://localhost:3000/profile

Производительность
Для теста используем:
ab -n 100 http://localhost:3000/profile
Запускаем…
Производительность
Для теста используем:
ab -n 100 http://localhost:3000/profile
Запускаем…
Time per request: 61.850 ms
Производительность
61.850 ms



Это много или мало?
Производительность
61.850 ms



Тот же шаблон в Handlebars:



8.385 ms



86% less
Производительность
1. Идём в Google - ничего полезного.
2. Пробуем спросить Twitter - тишина:
Производительность
Ок, а что если?
NODE_ENV=production
Запускаем…
Производительность
Ок, а что если?
NODE_ENV=production
Запускаем…
Time per request: 37.943 ms

(vs 61.850 ms)

39% less
Производительность
Вроде лучше.
Производительность
Вроде лучше.



Но всё ещё не торт.
Ищем дальше
GitHub issues
Производительность
• “Server rendering is slower with npm
react”



https://github.com/facebook/react/
issues/812



Производительность
• “Server rendering is slower with npm
react”



https://github.com/facebook/react/
issues/812



Решен...
Производительность
Создаём node_modules/react.js:



if (process.env.NODE_ENV === 'production') {
module.exports = require...
Производительность
Создаём node_modules/react.js:



if (process.env.NODE_ENV === 'production') {
module.exports = require...
Как это изменило
результат?
Производительность
Server rendering is slower with npm react
react/dist/react.min.js
Запускаем…
Производительность
Server rendering is slower with npm react
react/dist/react.min.js
Запускаем…
Time per request: 38.253 m...
Производительность
Server rendering is slower with npm react
react/dist/react.min.js
Запускаем…
Time per request: 38.253 m...
0
17,5
35
52,5
70
38,25337,943
8,385
61,85
React SSR Handlebars production
react.js.min
Результаты
0
17,5
35
52,5
70
38,25337,943
8,385
61,85
React SSR Handlebars production
react.js.min
Результаты
39% less
Часть 3
Продвинутые
решения
Продвинутые решения
1. Precompilation + Cache
2. Rendering Separation
3. React DOM Stream
4. Facebook BigPipe
5. HAProxy
Precompilation + Cache
• UI = f(state)
• f = React Component
• state = path + ...

Простое решение: redis
First render: re...
Rendering Separation
React DOM Stream
• Flushing the Document Early
• “Streams make this library as much as 47%
faster in sending down a full p...
Facebook BigPipe
• Сборка страницы в процессе загрузки
• Загружается параллельно
• Устойчивость к ошибкам
Facebook BigPipe
• Сборка страницы на в процессе загрузки
• Всё, что необходимо - загружается параллельно
• Устойчивость к...
Facebook BigPipe
HAProxy
• Обратитесь к DevOps
• Несколько экземпляров
Заключение
Полезные материалы
1. Supercharging page load (100 Days of Google Dev)
https://youtu.be/d5_6yHixpsQ
2. Making Netflix.com ...
Полезные материалы
6. From AngularJS to React: The Isomorphic Way
https://blog.risingstack.com/from-angularjs-to-
react-th...
Рекомендации
• Присоединяйтесь

к сообществу MoscowJS

http://moscowjs.ru/
• Улучшайте английский, не читайте
советских га...
Послесловие
«Большинство проблем
алгоритмов можно решить
сменой структуры данных»,
Андрей Ситник
“Changes is our work”,

J...
Почему от классического
Single Page Application
необходимо отказаться?
Спасибо за
внимание
Денис Измайлов
@DenisIzmaylov
https://github.com/DenisIzmaylov
https://fb.com/denis.izmaylov
Приложение 1
Upcoming SlideShare
Loading in …5
×
Upcoming SlideShare
redux: the best for isomorphic apps
Next
Download to read offline and view in fullscreen.

1

Share

Download to read offline

Изоморфные React-приложения: производительность и масштабирование

Download to read offline

Доклад, с которым я выступал на профессиональной конференции разработчиков высоконагруженных систем HighLoad++ 2015.

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all

Изоморфные React-приложения: производительность и масштабирование

  1. 1. Изоморфные React- приложения:
 производительность и масштабирование Денис Измайлов
  2. 2. Почему от классического Single Page Application необходимо отказаться?
  3. 3. Как изоморфные приложения отразятся на Вашей зарплате?
  4. 4. Что вы будете делать
 на этих выходных?
  5. 5. Идеально 1. React 14 2. webpack 3. ES6 4. Node.js 5. Express / koa 6. Isomorphic (Universal) apps
  6. 6. Часть 1
  7. 7. Web стал очень большим
  8. 8. Искусство
 Разработка под Web
 
 Наука
  9. 9. Раньше было просто • Создал страницу • Добавил пару скриптов • Отправил в Production
  10. 10. Раньше было просто Сервер Браузер
  11. 11. Раньше было просто Сервер Браузер Делал всё
  12. 12. Раньше было просто Сервер Браузер - HTML - [CSS, JavaScript] Делал всё
  13. 13. Это работало
  14. 14. Single Page
 Applications
 (SPA)
  15. 15. Single Page Application Сервер Браузер
  16. 16. Single Page Application Сервер Браузер Страница существует?
 Авторизация нужна?
 Доступ есть?
  17. 17. Single Page Application Сервер Браузер Страница существует?
 Авторизация нужна?
 Доступ есть? - Tiny HTML, [CSS] - JavaScript bundle
  18. 18. Single Page Application Плюсы • Легко начать • webpack • <div id=“root” /> • React, Redux • build
  19. 19. Single Page Application Плюсы • Легко начать • Богатый функционал webpack, <div id=“root” />, React, Redux
  20. 20. Single Page Application Плюсы • Легко начать • Богатый функционал • Быстро дорабатывать webpack, <div id=“root” />, React, Redux
  21. 21. Single Page Application Плюсы • Легко начать • Богатый функционал • Быстро дорабатывать • Отзывчивый UI webpack, <div id=“root” />, React, Redux
  22. 22. Single Page Application Плюсы • Легко начать • Богатый функционал • Быстро дорабатывать • Отзывчивый UI • Удобно кэшировать webpack, <div id=“root” />, React, Redux
  23. 23. - Wow. И не одного минуса?
  24. 24. Single Page Application Минусы • Долгая загрузка • JavaScript bundle up to 3-5 Mb • первое обращение • исполнение • память
  25. 25. Single Page Application Минусы • Долгая загрузка • Сложность поддержки • side-эффекты • memory leak 1st request, CPU, mem
  26. 26. Single Page Application Минусы • Долгая загрузка • Сложность поддержки • Пустая страница, один URL 1st request, CPU, mem side-эффекты, memory leaks
  27. 27. Single Page Application Минусы • Долгая загрузка • Сложность поддержки • Пустая страница, один URL • Legacy Browsers 1st request, CPU, mem side-эффекты, memory leaks
  28. 28. - Разве это минусы?
  29. 29. Single Page Application Минусы • Долгая загрузка для бизнеса снижение UX
  30. 30. Single Page Application Минусы • Долгая загрузка • Сложность поддержки для бизнеса снижение UX риски
  31. 31. Single Page Application Минусы • Долгая загрузка • Сложность поддержки • Пустая страница для бизнеса снижение UX риски проблемы SEO
  32. 32. Single Page Application Минусы • Долгая загрузка • Сложность поддержки • Пустая страница • Один URL для бизнеса снижение UX риски проблемы SEO проблемы SMM
  33. 33. Single Page Application Минусы • Долгая загрузка • Сложность поддержки • Пустая страница • Один URL • Legacy Browsers для бизнеса снижение UX риски проблемы SEO проблемы SMM потеря ЦА
  34. 34. Single Page Application Минусы • Долгая загрузка • Сложность поддержки • Пустая страница • Один URL • Legacy Browsers для бизнеса снижение UX риски проблемы SEO проблемы SMM потеря ЦА Расходы
  35. 35. Single Page Application Минусы для бизнеса снижение UX риски проблемы SEO проблемы SMM потеря ЦА Расходы
  36. 36. - WAT? Что делать?
  37. 37. Взять лучшее из обоих миров
  38. 38. Изоморфные приложения
  39. 39. Изоморфные приложения By isomorphic we mean that any given line of code (with notable exceptions) can execute both on the client and the server. 
 Charlie Robbins,
 18 Oct 2011
  40. 40. Шаблоны Стили Локализация Конфигурация Routes Права доступа Модели Схемы Валидация Сервисы Изоморфные приложения server.jsNode.js worker.js client.jsBrowser admin.js Бизнес-логика Компоненты API-интерфейсы Actions, Reducers Static Files
  41. 41. Браузер Изоморфные приложения Front-end сервер Back-end сервер
 
 Database Java
 etc
  42. 42. Браузер Изоморфные приложения Front-end сервер Back-end сервер
 
 Database Java
 etc
  43. 43. Браузер Изоморфные приложения Front-end сервер Back-end сервер
 
 Database Java
 etc - HTML - [critical CSS] - …
  44. 44. Front-end клиент Изоморфные приложения Front-end сервер Back-end сервер
 
 Database Java
 etc - HTML - [critical CSS] - JS Bundle
  45. 45. Front-end клиент Изоморфные приложения Front-end сервер Back-end сервер
 
 Database Java
 etc - HTML - [critical CSS] - JS Bundle
  46. 46. Front-end клиент Изоморфные приложения Front-end сервер • Единая среда исполнения
 • Общая кодовая база
 • Полный контроль
 • Экосистема
  47. 47. - Но как?
  48. 48. Server-Side Rendering
 (SSR)
  49. 49. Server-Side Rendering • Сборка React-приложения в HTML-код на Front-end сервере • Моментальное отображение в браузере, ещё до загрузки JS • Когда JS загрузится, React только добавит обработчики событий • А это очень быстро
  50. 50. Server-Side Rendering Код на сервере выглядит очень просто: import ReactDOMServer from 'react-dom/server';
 import Application from './components/application';
 
 const body = ReactDOMServer.renderToString(
 <Application />
 );
  51. 51. Server-Side Rendering 1. Пользователь видит страницу мгновенно 2. Отсутствие дополнительных запросов на получение данных 3. Страница может работать даже без JS 4. Полноценная URL-навигация и мета- тэги 5. Сохранение всех возможностей современного JavaScript
  52. 52. Часть 2
  53. 53. Производительность и масштабирование
  54. 54. Масштабирование
  55. 55. Масштабирование
 функциональное
  56. 56. Server-Side Rendering Всё супер, когда данные есть: import ReactDOMServer from 'react-dom/server';
 import Application from './components/application';
 
 const initialState = { siteName: 'HighLoad++ 2015' };
 const body = ReactDOMServer.renderToString(
 <Application state={initialState} />
 );
  57. 57. Server-Side Rendering Всё супер, когда данные есть: import ReactDOMServer from 'react-dom/server';
 import Application from './components/application';
 
 const initialState = { siteName: 'HighLoad++ 2015' };
 const body = ReactDOMServer.renderToString(
 <Application state={initialState} />
 ); Но если их надо получать извне?
  58. 58. Server-Side Rendering Как получить асинхронный State:
 1. Вручную для каждой страницы 2. Facebook Relay 3. redux-catch-promise
  59. 59. Асинхронный State Вручную для каждой страницы: • Получить State, необходимый для страницы
 • ReactDOMServer.renderToString()
  60. 60. Асинхронный State Facebook Relay: 1. The framework for building data-driven React applications 2. Declarative. Colocation. Mutations. 3. https://github.com/facebook/relay/ issues/136 4. 1Q2016
  61. 61. Асинхронный State redux-catch-promise: • Redux - state container для React • Redux: the best for isomorphic apps, MoscowJS 25
 https://youtu.be/Uyk_8WWna6s • redux-catch-promise - это middleware для Redux
  62. 62. Асинхронный State redux-catch-promise: 1. Вешаем callback для захвата Promise- экшнов 2. Делаем рендер приложения 3. Делаем запрос к БД, диспатчим Promise 4. После рендера - имеем все эти промисы, ожидаем их завершения 5. Повторный рендер, с данными
  63. 63. Асинхронный State redux-catch-promise: 1. Примеры и исходный код:
 https://github.com/DenisIzmaylov/ redux-catch-promise 2. Установка: npm install redux-catch-promise
  64. 64. Производительность
  65. 65. Производительность Тестовый стенд: MacBook Pro 15” Retina (Early 2013) 2.4 GHz Intel Core i7
  66. 66. Производительность Размер страницы: 56 238 байт
  67. 67. Производительность Размер страницы: 56 238 байт
  68. 68. Производительность Размер страницы: 56 238 байт
  69. 69. Производительность Размер страницы: 56 238 байт
  70. 70. Производительность Размер страницы: 56 238 байт
  71. 71. Производительность Размер страницы: 56 238 байт
  72. 72. Производительность Для теста используем: ab -n 100 http://localhost:3000/profile

  73. 73. Производительность Для теста используем: ab -n 100 http://localhost:3000/profile Запускаем…
  74. 74. Производительность Для теста используем: ab -n 100 http://localhost:3000/profile Запускаем… Time per request: 61.850 ms
  75. 75. Производительность 61.850 ms
 
 Это много или мало?
  76. 76. Производительность 61.850 ms
 
 Тот же шаблон в Handlebars:
 
 8.385 ms
 
 86% less
  77. 77. Производительность 1. Идём в Google - ничего полезного. 2. Пробуем спросить Twitter - тишина:
  78. 78. Производительность Ок, а что если? NODE_ENV=production Запускаем…
  79. 79. Производительность Ок, а что если? NODE_ENV=production Запускаем… Time per request: 37.943 ms
 (vs 61.850 ms)
 39% less
  80. 80. Производительность Вроде лучше.
  81. 81. Производительность Вроде лучше.
 
 Но всё ещё не торт.
  82. 82. Ищем дальше
  83. 83. GitHub issues
  84. 84. Производительность • “Server rendering is slower with npm react”
 
 https://github.com/facebook/react/ issues/812
 

  85. 85. Производительность • “Server rendering is slower with npm react”
 
 https://github.com/facebook/react/ issues/812
 
 Решение:
 явно подключать react/dist/react.min.js
  86. 86. Производительность Создаём node_modules/react.js:
 
 if (process.env.NODE_ENV === 'production') { module.exports = require('react/dist/react.min.js'); } else { module.exports = require('react/dist/react.js'); }

  87. 87. Производительность Создаём node_modules/react.js:
 
 if (process.env.NODE_ENV === 'production') { module.exports = require('react/dist/react.min.js'); } else { module.exports = require('react/dist/react.js'); }

  88. 88. Как это изменило результат?
  89. 89. Производительность Server rendering is slower with npm react react/dist/react.min.js Запускаем…
  90. 90. Производительность Server rendering is slower with npm react react/dist/react.min.js Запускаем… Time per request: 38.253 ms
 (vs 37.943 ms)
 0.08% more
  91. 91. Производительность Server rendering is slower with npm react react/dist/react.min.js Запускаем… Time per request: 38.253 ms
 (vs 37.943 ms)
 0.08% more FAILED
  92. 92. 0 17,5 35 52,5 70 38,25337,943 8,385 61,85 React SSR Handlebars production react.js.min Результаты
  93. 93. 0 17,5 35 52,5 70 38,25337,943 8,385 61,85 React SSR Handlebars production react.js.min Результаты 39% less
  94. 94. Часть 3
  95. 95. Продвинутые решения
  96. 96. Продвинутые решения 1. Precompilation + Cache 2. Rendering Separation 3. React DOM Stream 4. Facebook BigPipe 5. HAProxy
  97. 97. Precompilation + Cache • UI = f(state) • f = React Component • state = path + ...
 Простое решение: redis First render: redis + kue + workers
  98. 98. Rendering Separation
  99. 99. React DOM Stream • Flushing the Document Early • “Streams make this library as much as 47% faster in sending down a full page than ReactDOM.renderToString, and user perceived performance gains can be even greater.” • Target - 108KB page on Heroku • Time To First Byte (TTFB) - 65% less • Time To Last Byte (TTLB) - 37% less • https://github.com/aickin/react-dom-stream
  100. 100. Facebook BigPipe • Сборка страницы в процессе загрузки • Загружается параллельно • Устойчивость к ошибкам
  101. 101. Facebook BigPipe • Сборка страницы на в процессе загрузки • Всё, что необходимо - загружается параллельно • Устойчивость к ошибкам
  102. 102. Facebook BigPipe
  103. 103. HAProxy • Обратитесь к DevOps • Несколько экземпляров
  104. 104. Заключение
  105. 105. Полезные материалы 1. Supercharging page load (100 Days of Google Dev) https://youtu.be/d5_6yHixpsQ 2. Making Netflix.com Faster http://techblog.netflix.com/ 2015/08/making-netflixcom-faster.html 3. New technologies for the new LinkedIn home page https://engineering.linkedin.com/frontend/new- technologies-new-linkedin-home-page 4. Improving performance on Twitter.com https:// blog.twitter.com/2012/improving-performance-on- twittercom 5. Scaling Isomorphic Javascript Code http:// blog.nodejitsu.com/scaling-isomorphic-javascript-code/
  106. 106. Полезные материалы 6. From AngularJS to React: The Isomorphic Way https://blog.risingstack.com/from-angularjs-to- react-the-isomorphic-way/ 7. Isomorphic JavaScript: The Future of Web Apps http://nerds.airbnb.com/isomorphic-javascript- future-web-apps/ 8. React server side rendering performance http:// www.slideshare.net/nickdreckshage/react-meetup 9. The Lost Art of Progressive HTML Rendering http://blog.codinghorror.com/the-lost-art-of- progressive-html-rendering/
  107. 107. Рекомендации • Присоединяйтесь
 к сообществу MoscowJS
 http://moscowjs.ru/ • Улучшайте английский, не читайте советских газет • Читайте оригиналы и технические блоги • Активно внедряйте в свою жизнь Twitter и GitHub
  108. 108. Послесловие «Большинство проблем алгоритмов можно решить сменой структуры данных», Андрей Ситник “Changes is our work”,
 Jake Archibald, Google
  109. 109. Почему от классического Single Page Application необходимо отказаться?
  110. 110. Спасибо за внимание Денис Измайлов @DenisIzmaylov https://github.com/DenisIzmaylov https://fb.com/denis.izmaylov
  111. 111. Приложение 1
  • belyash

    Aug. 19, 2016

Доклад, с которым я выступал на профессиональной конференции разработчиков высоконагруженных систем HighLoad++ 2015.

Views

Total views

1,056

On Slideshare

0

From embeds

0

Number of embeds

4

Actions

Downloads

8

Shares

0

Comments

0

Likes

1

×