ݺߣ

ݺߣShare a Scribd company logo
View как чистая функция
от состояния базы
данных
Илья Беда / bro.agency
Кто я?
● Тимлид и один из основателей bro.agency
● Разрабатываю веб-формочки на python в течении 7
лет
● Специализируюсь на аутсорс-разработке
● Продвигаю функциональное программирование в
массы
● Провожу воркшопы и мастер-классы
● С недавнего времени выступаю на конференциях
2
There are only two hard things in Computer
Science: cache invalidation and naming things.
Phil Karlton
3
Какая нам нужна инвалидация кэша?
4
Инвалидация по умолчанию (по таймауту)
5
Инвалидация по умолчанию (по таймауту)
6
Слишком часто Слишком редко
Инвалидация по умолчанию (по таймауту)
7
Слишком часто Слишком редко
Кэш становится не
актуальным, но сами
данные остались
неизменными
Пользователь увидит не
актуальную версию
страницы
Инвалидация по умолчанию (по таймауту)
8
Слишком часто Слишком редко
Кэш становится не
актуальным, но сами
данные остались
неизменными
Пользователь увидит не
актуальную версию
страницы
9
Какую инвалидацию использовать для таких
приложений?
10
Как работает ВЕБ
11
Что делает Handler?
12
Получение
данных из базы
Формирование
контекста
Рендер
шаблона
Что делает Handler?
13
Запросы к
внешнему API
Формирование
контекста
json.dumps
И handler очень похож на чистую функцию от
состояния базы данных
14
Получение
данных из базы
Формирование
контекста
Рендер
шаблона
Какие функции являются чистыми?
15
Какие функции являются чистыми?
1. Детерминированные функции
2. Функции не обладающие сторонними эффектами
16
Чистая функция
17
Не чистая функция
18
В чем преимущества чистых функций?
19
В чем преимущества чистых функций?
Для одного и того же набора аргументов она
возвращает одно и тоже значение.
Что упрощает проблему инвалидации
20
Давайте сделаем наш ВЕБ функционально
чистым и забудем про проблемы
инвалидации кэша.
21
Как это выглядит в реальности (Django)
22
1
2
3
4
5
def some_view(request, url_param):
items = SomeModel.objects.filter(some_field=url_param)
c = Context({'items': items})
response = Template("my_template.html").render(c)
return HttpResponse(response)
Как это выглядит в реальности (Django)
23
1
2
3
4
5
def some_view(request, url_param):
items = SomeModel.objects.filter(some_field=url_param)
c = Context({'items': items})
response = Template("my_template.html").render(c)
return HttpResponse(response)
Как это выглядит в реальности (Django)
24
1
2
3
4
5
def some_view(request, url_param):
items = SomeModel.objects.filter(some_field=url_param)
c = Context({'items': items})
response = Template("my_template.html").render(c)
return HttpResponse(response)
Как это выглядит в реальности (Django)
25
1
2
3
4
5
def some_view(request, url_param):
items = SomeModel.objects.filter(some_field=url_param)
c = Context({'items': items})
response = Template("my_template.html").render(c)
return HttpResponse(response)
Проанализируем с точки зрения чистоты
26
1
2
3
4
5
def some_view(request, url_param):
items = SomeModel.objects.filter(some_field=url_param)
c = Context({'items': items})
response = Template("my_template.html").render(c)
return HttpResponse(response)
Проанализируем с точки зрения чистоты
27
1
2
3
4
5
def some_view(request, url_param):
items = SomeModel.objects.filter(some_field=url_param)
c = Context({'items': items})
response = Template("my_template.html").render(c)
return HttpResponse(response)
Получается наш ВЕБ
НЕ
функционально чистый.
28
Приведем функцию к чистому виду
29
1
2
3
4
5
6
7
8
9
10
def some_view(request, url_param):
items = list(
SomeModel.objects.filter(some_field=url_param))
@cache_pure
def _some_view_pure(object_list):
c = Context({'items': object_list})
response = Template("my_template.html").render(c)
return HttpResponse(response)
return _some_view_pure(items)
Приведем функцию к чистому виду
30
1
2
3
4
5
6
7
8
9
10
def some_view(request, url_param):
items = list(
SomeModel.objects.filter(some_field=url_param))
@cache_pure
def _some_view_pure(object_list):
c = Context({'items': object_list})
response = Template("my_template.html").render(c)
return HttpResponse(response)
return _some_view_pure(items)
Приведем функцию к чистому виду
31
1
2
3
4
5
6
7
8
9
10
def some_view(request, url_param):
items = list(
SomeModel.objects.filter(some_field=url_param))
@cache_pure
def _some_view_pure(object_list):
c = Context({'items': object_list})
response = Template("my_template.html").render(c)
return HttpResponse(response)
return _some_view_pure(items)
Давайте пофантазируем
32
1
2
3
4
5
6
7
8
9
10
11
def some_view(request, url_param):
@cache_pure
def _some_view_pure(url_param, database_state):
items = SomeModel.objects.filter(
some_field=url_param)
c = Context({'items': items})
response = Template("my_template.html").render(c)
return HttpResponse(response)
return _some_view_pure(
url_param,
get_database_state_from_magic())
Давайте пофантазируем
33
1
2
3
4
5
6
7
8
9
10
11
def some_view(request, url_param):
@cache_pure
def _some_view_pure(url_param, database_state):
items = SomeModel.objects.filter(
some_field=url_param)
c = Context({'items': items})
response = Template("my_template.html").render(c)
return HttpResponse(response)
return _some_view_pure(
url_param,
get_database_state_from_magic())
Давайте пофантазируем
34
1
2
3
4
5
6
7
8
9
10
11
def some_view(request, url_param):
@cache_pure
def _some_view_pure(url_param, database_state):
items = SomeModel.objects.filter(
some_field=url_param)
c = Context({'items': items})
response = Template("my_template.html").render(c)
return HttpResponse(response)
return _some_view_pure(
url_param,
get_database_state_from_magic())
def get_database_state_from_magic():
Что же это такое состояние базы данных?
35
def get_database_state_from_magic():
return subprocess.check_output(["pg_dump"])
36
def get_database_state_from_magic():
Если пренебречь тем, что база данных может
вернуться в предыдущее состояние, то можно
использовать индекс поколений.
И это практичное решение проблемы, которое можно
использовать.
37
38
News News News
DB State 1 DB State 2 DB State 3
Реализация индексирования поколений
39
1
2
3
4
5
6
7
8
9
10
11
import redis
from django.db.models.signals import post_save
r = redis.StrictRedis(host='localhost', port=6379, db=0)
def inc_generation_index(sender, **kwargs):
r.incr('generation_index')
post_save.connect(inc_generation_index)
def get_database_state_from_magic():
return r.get('generation_index')
Реализация индексирования поколений
40
1
2
3
4
5
6
7
8
9
10
11
import redis
from django.db.models.signals import post_save
r = redis.StrictRedis(host='localhost', port=6379, db=0)
def inc_generation_index(sender, **kwargs):
r.incr('generation_index')
post_save.connect(inc_generation_index)
def get_database_state_from_magic():
return r.get('generation_index')
Реализация индексирования поколений
41
1
2
3
4
5
6
7
8
9
10
11
import redis
from django.db.models.signals import post_save
r = redis.StrictRedis(host='localhost', port=6379, db=0)
def inc_generation_index(sender, **kwargs):
r.incr('generation_index')
post_save.connect(inc_generation_index)
def get_database_state_from_magic():
return r.get('generation_index')
Реализация индексирования поколений
42
1
2
3
4
5
6
7
8
9
10
11
import redis
from django.db.models.signals import post_save
r = redis.StrictRedis(host='localhost', port=6379, db=0)
def inc_generation_index(sender, **kwargs):
r.incr('generation_index')
post_save.connect(inc_generation_index)
def get_database_state_from_magic():
return r.get('generation_index')
Реализация индексирования поколений
43
1
2
3
4
5
6
7
8
9
10
11
import redis
from django.db.models.signals import post_save
r = redis.StrictRedis(host='localhost', port=6379, db=0)
def inc_generation_index(sender, **kwargs):
r.incr('generation_index')
post_save.connect(inc_generation_index)
def get_database_state_from_magic():
return r.get('generation_index')
И теперь это реально работающий код
44
1
2
3
4
5
6
7
8
9
10
11
def some_view(request, url_param):
@cache_pure
def _some_view_pure(url_param, database_state):
items = SomeModel.objects.filter(
some_field=url_param)
c = Context({'items': items})
response = Template("my_template.html").render(c)
return HttpResponse(response)
return _some_view_pure(
url_param,
get_database_state_from_magic())
Какие могут быть проблемы
при индексировании поколений?
45
Слишком частая инвалидация.
Кэш становится неактуальным, но сами
данные остались неизменными
46
47
current_news
News.objects.filter(hidden=False)
news_comemnts
Comment.objects.filter(news_id=1, hidden=False)
News Comment
48
current_news
News.objects.filter(hidden=False)
news_comemnts
Comment.objects.filter(news_id=1, hidden=False)
News Comment
+ Comment
49
current_news
News.objects.filter(hidden=False)
news_comemnts
Comment.objects.filter(news_id=1, hidden=False)
News Comment
Comment
50
current_news
News.objects.filter(hidden=False)
news_comemnts
Comment.objects.filter(news_id=1, hidden=False)
News Comment
Comment
51
current_news
News.objects.filter(hidden=False)
news_comemnts
Comment.objects.filter(news_id=1, hidden=False)
News Comment
Comment
hidden = True
Гранулярная инвалидация сделает
кэширование оптимальнее.
52
Можно индексировать поколения каждой
таблицы отдельно.
https://github.com/jmoiron/johnny-cache
53
54
current_news
News.objects.filter(hidden=False)
news_comemnts
Comment.objects.filter(news_id=1, hidden=False)
News Comment
Comment
55
В реальности очень много таблиц, поэтому это будет
прекрасно работать.
News Comment Page Event User
Можно пойти дальше и инвалидировать кэш,
зависящий от определенной части состояния базы
данных.
Тогда нам нужен инструмент для описания этой
части.
56
57
current_news
News.objects.filter(hidden=False)
news_comemnts
Comment.objects.filter(news_id=1, hidden=False)
News Comment
58
current_news
News.objects.filter(hidden=False)
news_comemnts
Comment.objects.filter(news_id=1, hidden=False)
News Comment
Можно индексировать части запросов
59
News.hiden=False
Comment.news_id=1
Comment.hidden=False
Cache Store Criterion
Можно индексировать части запросов
60
News.hiden=False
Comment.news_id=1
Comment.hidden=False
Cache Store Criterion
+ Comment
hiden True
news_id 1
Можно индексировать части запросов
61
News.hiden=False
Comment.news_id=1
Comment.hidden=False
Cache Store Criterion
+ Comment
hiden True
news_id 1
Можно индексировать части запросов
62
News.hiden=False
Comment.news_id=1
Comment.hidden=False
Cache Store Criterion
+ Comment
hiden True
news_id 1
Можно индексировать части запросов
63
News.hiden=False
Comment.hidden=False
Cache Store Criterion
Тоже есть готова реализация
http://hackflow.com/blog/2014/03/09/on-orm-
cache-invalidation/
https://github.com/suor/django-cacheops
64
Эффективное кэширование с помощью
cacheops
65
1
2
3
4
5
6
7
8
9
10
def some_view(request, url_param):
items = SomeModel.objects.filter(some_field=url_param)
@cached_view_as(items)
def _render(request, url_param):
c = Context({'items': items})
response = Template("my_template.html").render(c)
return HttpResponse(response)
return _render(request, url_param)
Эффективное кэширование с помощью
cacheops
66
1
2
3
4
5
6
7
8
9
10
def some_view(request, url_param):
items = SomeModel.objects.filter(some_field=url_param)
@cached_view_as(items)
def _render(request, url_param):
c = Context({'items': items})
response = Template("my_template.html").render(c)
return HttpResponse(response)
return _render(request, url_param)
Эффективное кэширование с помощью
cacheops
67
1
2
3
4
5
6
7
8
9
10
def some_view(request, url_param):
items = SomeModel.objects.filter(some_field=url_param)
@cached_view_as(items)
def _render(request, url_param):
c = Context({'items': items})
response = Template("my_template.html").render(c)
return HttpResponse(response)
return _render(request, url_param)
Как же быть с Class Based View?
68
Class Based View
69
1
2
3
4
5
6
7
8
class SomeModelListView(ListView)
def get_queryset(self):
return SomeModel.objects.all()
def get(self, request, *args, **kwargs):
self.object_list = self.get_queryset()
context = self.get_context_data()
return self.render_to_response(context)
Class Based View
70
1
2
3
4
5
6
7
8
class SomeModelListView(ListView)
def get_queryset(self):
return SomeModel.objects.all()
def get(self, request, *args, **kwargs):
self.object_list = self.get_queryset()
context = self.get_context_data()
return self.render_to_response(context)
Class Based View
71
1
2
3
4
5
6
7
class CachedListView(ListView):
def get(self, request, *args, **kwargs):
@cached_view_as(self.get_queryset())
def _get(request, *args, **kwargs):
return = super(CachedListView, self).get(
request, *args, **kwargs)
return _get(request, *args, **kwargs)
Class Based View
72
1
2
3
4
5
6
7
class CachedListView(ListView):
def get(self, request, *args, **kwargs):
@cached_view_as(self.get_queryset())
def _get(request, *args, **kwargs):
return = super(CachedListView, self).get(
request, *args, **kwargs)
return _get(request, *args, **kwargs)
Class Based View
73
1
2
3
4
5
6
7
class CachedListView(ListView):
def get(self, request, *args, **kwargs):
@cached_view_as(self.get_queryset())
def _get(request, *args, **kwargs):
return = super(CachedListView, self).get(
request, *args, **kwargs)
return _get(request, *args, **kwargs)
Class Based View
74
1
2
class NewsView(CachedListView):
model = News
Кэшируйте правильно!
Инвалидируйте правильно!
75
Кэшируйте правильно!
Инвалидируйте правильно!
ir4y.ix@gmail.com
76

More Related Content

What's hot (20)

XPath локаторы в Selenium WebDriver
XPath локаторы в Selenium WebDriverXPath локаторы в Selenium WebDriver
XPath локаторы в Selenium WebDriver
Илья Кожухов
"Жизнь без интернета" Кувалдин Артём, Яндекс
"Жизнь без интернета" Кувалдин Артём, Яндекс"Жизнь без интернета" Кувалдин Артём, Яндекс
"Жизнь без интернета" Кувалдин Артём, Яндекс
it-people
Автоматизация UI тестирования под Windows и Windows Phone
Автоматизация UI тестирования под Windows и Windows PhoneАвтоматизация UI тестирования под Windows и Windows Phone
Автоматизация UI тестирования под Windows и Windows Phone
CodeFest
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
DevDay
Web осень 2013 лекция 5
Web осень 2013 лекция 5Web осень 2013 лекция 5
Web осень 2013 лекция 5
Technopark
React со скоростью света: не совсем обычный серверный рендеринг
React со скоростью света: не совсем обычный серверный рендерингReact со скоростью света: не совсем обычный серверный рендеринг
React со скоростью света: не совсем обычный серверный рендеринг
Timophy Chaptykov
#2 "Распространённые ошибки в JavaScript" Денис Речкунов
#2 "Распространённые ошибки в JavaScript" Денис Речкунов#2 "Распространённые ошибки в JavaScript" Денис Речкунов
#2 "Распространённые ошибки в JavaScript" Денис Речкунов
JSib
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
Омские ИТ-субботники
10 - Web-технологии. MVC фреймворки (продолжение)
10 - Web-технологии. MVC фреймворки (продолжение)10 - Web-технологии. MVC фреймворки (продолжение)
10 - Web-технологии. MVC фреймворки (продолжение)
Roman Brovko
Component Inspector
Component InspectorComponent Inspector
Component Inspector
Roman Dvornov
Selenium: приемы работы
Selenium: приемы работыSelenium: приемы работы
Selenium: приемы работы
Paul Stashevsky
Jsfwdays 2013-2
Jsfwdays 2013-2Jsfwdays 2013-2
Jsfwdays 2013-2
Pavlo Iuriichuk
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf Conference
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
Timur Shemsedinov
Performance optimisation in javascript
Performance optimisation in javascriptPerformance optimisation in javascript
Performance optimisation in javascript
Артем Захарченко
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
Roman Dvornov
Коротко о React.js
Коротко о React.jsКоротко о React.js
Коротко о React.js
Mad Devs
Михаил Давыдов — JavaScript: Асинхронность
Михаил Давыдов — JavaScript: АсинхронностьМихаил Давыдов — JavaScript: Асинхронность
Михаил Давыдов — JavaScript: Асинхронность
Yandex
"Жизнь без интернета" Кувалдин Артём, Яндекс
"Жизнь без интернета" Кувалдин Артём, Яндекс"Жизнь без интернета" Кувалдин Артём, Яндекс
"Жизнь без интернета" Кувалдин Артём, Яндекс
it-people
Автоматизация UI тестирования под Windows и Windows Phone
Автоматизация UI тестирования под Windows и Windows PhoneАвтоматизация UI тестирования под Windows и Windows Phone
Автоматизация UI тестирования под Windows и Windows Phone
CodeFest
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
DevDay
Web осень 2013 лекция 5
Web осень 2013 лекция 5Web осень 2013 лекция 5
Web осень 2013 лекция 5
Technopark
React со скоростью света: не совсем обычный серверный рендеринг
React со скоростью света: не совсем обычный серверный рендерингReact со скоростью света: не совсем обычный серверный рендеринг
React со скоростью света: не совсем обычный серверный рендеринг
Timophy Chaptykov
#2 "Распространённые ошибки в JavaScript" Денис Речкунов
#2 "Распространённые ошибки в JavaScript" Денис Речкунов#2 "Распространённые ошибки в JavaScript" Денис Речкунов
#2 "Распространённые ошибки в JavaScript" Денис Речкунов
JSib
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
Омские ИТ-субботники
10 - Web-технологии. MVC фреймворки (продолжение)
10 - Web-технологии. MVC фреймворки (продолжение)10 - Web-технологии. MVC фреймворки (продолжение)
10 - Web-технологии. MVC фреймворки (продолжение)
Roman Brovko
Selenium: приемы работы
Selenium: приемы работыSelenium: приемы работы
Selenium: приемы работы
Paul Stashevsky
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf 2011: Разделение труда: Организация многозадачной, распределенной сист...
ZFConf Conference
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
Timur Shemsedinov
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
Roman Dvornov
Коротко о React.js
Коротко о React.jsКоротко о React.js
Коротко о React.js
Mad Devs
Михаил Давыдов — JavaScript: Асинхронность
Михаил Давыдов — JavaScript: АсинхронностьМихаил Давыдов — JavaScript: Асинхронность
Михаил Давыдов — JavaScript: Асинхронность
Yandex

Similar to View как чистая функция от состояния базы данных - Илья Беда, bro.agency (20)

Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов Игорь
PVasili
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
drupalconf
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноkranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
Krivoy Rog IT Community
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Mink
tyomo4ka
UWDC 2013, Yii2
UWDC 2013, Yii2UWDC 2013, Yii2
UWDC 2013, Yii2
Alexander Makarov
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
Technopark
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в Django
MoscowDjango
django cheBit'11
django cheBit'11django cheBit'11
django cheBit'11
dva
Web осень 2012 лекция 4
Web осень 2012 лекция 4Web осень 2012 лекция 4
Web осень 2012 лекция 4
Technopark
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
Ontico
Web весна 2013 лекция 4
Web весна 2013 лекция 4Web весна 2013 лекция 4
Web весна 2013 лекция 4
Technopark
Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"
Yandex
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov
Computer Science Club
Scala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application DevelopmentScala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application Development
Anton Kirillov
Ошибки, которые сложно заметить на code review, но которые находятся статичес...
Ошибки, которые сложно заметить на code review, но которые находятся статичес...Ошибки, которые сложно заметить на code review, но которые находятся статичес...
Ошибки, которые сложно заметить на code review, но которые находятся статичес...
Andrey Karpov
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
Andrey Karpov
Семь тысяч Rps, один go
Семь тысяч Rps, один goСемь тысяч Rps, один go
Семь тысяч Rps, один go
Badoo Development
Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2
Oleksii Okhrymenko
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Ontico
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов Игорь
PVasili
Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
drupalconf
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективноkranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
Krivoy Rog IT Community
Behat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и MinkBehat в PHP с использованием Behat и Mink
Behat в PHP с использованием Behat и Mink
tyomo4ka
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
Technopark
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в Django
MoscowDjango
django cheBit'11
django cheBit'11django cheBit'11
django cheBit'11
dva
Web осень 2012 лекция 4
Web осень 2012 лекция 4Web осень 2012 лекция 4
Web осень 2012 лекция 4
Technopark
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
TypeScript: особенности разработки / Александр Майоров (Tutu.ru)
Ontico
Web весна 2013 лекция 4
Web весна 2013 лекция 4Web весна 2013 лекция 4
Web весна 2013 лекция 4
Technopark
Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"
Yandex
20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov20130429 dynamic c_c++_program_analysis-alexey_samsonov
20130429 dynamic c_c++_program_analysis-alexey_samsonov
Computer Science Club
Scala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application DevelopmentScala, SBT & Play! for Rapid Application Development
Scala, SBT & Play! for Rapid Application Development
Anton Kirillov
Ошибки, которые сложно заметить на code review, но которые находятся статичес...
Ошибки, которые сложно заметить на code review, но которые находятся статичес...Ошибки, которые сложно заметить на code review, но которые находятся статичес...
Ошибки, которые сложно заметить на code review, но которые находятся статичес...
Andrey Karpov
Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?Статический анализ кода: Что? Как? Зачем?
Статический анализ кода: Что? Как? Зачем?
Andrey Karpov
Семь тысяч Rps, один go
Семь тысяч Rps, один goСемь тысяч Rps, один go
Семь тысяч Rps, один go
Badoo Development
Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2
Oleksii Okhrymenko
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Ontico

More from it-people (20)

«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co
«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co
«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co
it-people
«Scrapy internals» Александр Сибиряков, Scrapinghub
«Scrapy internals» Александр Сибиряков, Scrapinghub«Scrapy internals» Александр Сибиряков, Scrapinghub
«Scrapy internals» Александр Сибиряков, Scrapinghub
it-people
«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains
«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains
«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains
it-people
«Gevent — быть или не быть?» Александр Мокров, Positive Technologies
«Gevent — быть или не быть?» Александр Мокров, Positive Technologies«Gevent — быть или не быть?» Александр Мокров, Positive Technologies
«Gevent — быть или не быть?» Александр Мокров, Positive Technologies
it-people
«Ещё один Поиск Яндекса» Александр Кошелев, Яндекс
«Ещё один Поиск Яндекса» Александр Кошелев, Яндекс«Ещё один Поиск Яндекса» Александр Кошелев, Яндекс
«Ещё один Поиск Яндекса» Александр Кошелев, Яндекс
it-people
«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...
«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...
«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...
it-people
«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalr
«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalr«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalr
«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalr
it-people
«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...
«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...
«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...
it-people
«Тотальный контроль производительности» Михаил Юматов, ЦИАН
«Тотальный контроль производительности» Михаил Юматов, ЦИАН«Тотальный контроль производительности» Михаил Юматов, ЦИАН
«Тотальный контроль производительности» Михаил Юматов, ЦИАН
it-people
«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк
«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк
«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк
it-people
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co
it-people
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
it-people
«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...
«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...
«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...
it-people
«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies
«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies
«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies
it-people
«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn System
«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn System«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn System
«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn System
it-people
«(Без)опасный Python», Иван Цыганов, Positive Technologies
«(Без)опасный Python», Иван Цыганов, Positive Technologies«(Без)опасный Python», Иван Цыганов, Positive Technologies
«(Без)опасный Python», Иван Цыганов, Positive Technologies
it-people
«Python of Things», Кирилл Борисов, Яндекс
«Python of Things», Кирилл Борисов, Яндекс«Python of Things», Кирилл Борисов, Яндекс
«Python of Things», Кирилл Борисов, Яндекс
it-people
«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...
«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...
«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...
it-people
«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognician
«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognician«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognician
«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognician
it-people
«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...
«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...
«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...
it-people
«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co
«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co
«Про аналитику и серебряные пули» Александр Подсобляев, Rambler&Co
it-people
«Scrapy internals» Александр Сибиряков, Scrapinghub
«Scrapy internals» Александр Сибиряков, Scrapinghub«Scrapy internals» Александр Сибиряков, Scrapinghub
«Scrapy internals» Александр Сибиряков, Scrapinghub
it-people
«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains
«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains
«Отладка в Python 3.6: Быстрее, Выше, Сильнее» Елизавета Шашкова, JetBrains
it-people
«Gevent — быть или не быть?» Александр Мокров, Positive Technologies
«Gevent — быть или не быть?» Александр Мокров, Positive Technologies«Gevent — быть или не быть?» Александр Мокров, Positive Technologies
«Gevent — быть или не быть?» Александр Мокров, Positive Technologies
it-people
«Ещё один Поиск Яндекса» Александр Кошелев, Яндекс
«Ещё один Поиск Яндекса» Александр Кошелев, Яндекс«Ещё один Поиск Яндекса» Александр Кошелев, Яндекс
«Ещё один Поиск Яндекса» Александр Кошелев, Яндекс
it-people
«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...
«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...
«How I Learned to Stop Worrying and Love the BFG: нагрузочное тестирование со...
it-people
«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalr
«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalr«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalr
«Write once run anywhere — почём опиум для народа?» Игорь Новиков, Scalr
it-people
«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...
«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...
«Gensim — тематическое моделирование для людей» Иван Меньших, Лев Константино...
it-people
«Тотальный контроль производительности» Михаил Юматов, ЦИАН
«Тотальный контроль производительности» Михаил Юматов, ЦИАН«Тотальный контроль производительности» Михаил Юматов, ЦИАН
«Тотальный контроль производительности» Михаил Юматов, ЦИАН
it-people
«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк
«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк
«Детские болезни live-чата» Ольга Сентемова, Тинькофф Банк
it-people
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co
«Микросервисы наносят ответный удар!» Олег Чуркин, Rambler&Co
it-people
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
it-people
«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...
«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...
«Что такое serverless-архитектура и как с ней жить?» Николай Марков, Aligned ...
it-people
«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies
«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies
«Python на острие бритвы: PyPy project» Александр Кошкин, Positive Technologies
it-people
«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn System
«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn System«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn System
«PyWat. А хорошо ли вы знаете Python?» Александр Швец, Marilyn System
it-people
«(Без)опасный Python», Иван Цыганов, Positive Technologies
«(Без)опасный Python», Иван Цыганов, Positive Technologies«(Без)опасный Python», Иван Цыганов, Positive Technologies
«(Без)опасный Python», Иван Цыганов, Positive Technologies
it-people
«Python of Things», Кирилл Борисов, Яндекс
«Python of Things», Кирилл Борисов, Яндекс«Python of Things», Кирилл Борисов, Яндекс
«Python of Things», Кирилл Борисов, Яндекс
it-people
«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...
«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...
«Как сделать так, чтобы тесты на Swift не причиняли боль» Сычев Александр, Ra...
it-people
«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognician
«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognician«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognician
«Клиенту и серверу нужно поговорить» Прокопов Никита, Cognician
it-people
«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...
«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...
«Кошелек или деньги: сложный выбор между памятью и процессором» Алексеенко Иг...
it-people

View как чистая функция от состояния базы данных - Илья Беда, bro.agency