close

Вход

Забыли?

вход по аккаунту

?

Основы веб-разработки. Лекция 7

код для вставкиСкачать
7
Основы webразработки
Стыценко Илья, Исаев Денис
Содержание
1.
2.
3.
4.
5.
6.
Архитектура веб-серверов
Real-time web applications
Очереди: теория и практика
Поиск по сайту
Кэширование
Место Django в мире веб-технологий
2
Архитектура кафе/столовой. Однопоточный
сервер
3
Архитектура кафе/столовой. Пул потоков
4
Архитектура кафе/столовой. Event loop
5
Архитектура кафе/столовой. Event loop
6
Архитектура веб-серверов. Классификация
1. Один воркер с event loop – неблокирующий сервер
2. По воркеру на каждый коннект –
многоворкерный сервер
1. тип воркера:
1. процесс – многопроцессный (форк) сервер
2. поток – многопоточный сервер
2. воркеры порождаются
1. на каждый коннект – форк сервер
2. заранее создается пул воркеров – префорк
сервер
7
Архитектура веб-серверов. Многоворкерный
сервер
8
Архитектура веб-серверов. Многоворкерный
сервер
9
Архитектура веб-серверов. Неблокирующий
сервер
10
Архитектура веб-серверов. Кто есть кто?
• NGINX, Node.js – неблокирующий (асинхронный) веб-­‐сервер
• Apache httpd, Gunicorn – префорк
веб-­‐сервер
11
Архитектура веб-серверов. NGINX
12
Архитектура веб-серверов. Сравнение
производительности. Запросов в секунду
13
Архитектура веб-серверов. Сравнение
производительности. Память
14
Real-time web application
15
Real-time web application
16
Real-time web applications. Problem
17
Real-time web applications. Polling
Браузер
Сервер
Ajax запрос #1: есть новые события?
Ajax ответ #1: нет новых
Событие X
Задержка в отображении события X
Событие Y
Ajax запрос #2: есть новые события?
Ajax ответ #2: события X и Y
Время
Время
18
Real-time web applications. Problem
19
Real-time web applications. Solution
20
Real-time web applications. Comet
Java applets
Flash XMLSocket
Iframe/XHR/HTML streaming
Long polling
21
Real-time web applications. Comet. Long polling
Браузер
Сервер
Ajax запрос #1: есть новые события?
Ajax ответ #1: событие X
Событие X
Ajax запрос #2: есть новые события?
Ajax запрос #3: есть новые события?
Ajax ответ #3: событие Y
Время
Событие Y
Время
22
Real-time web applications. Push
Браузер
Сервер
Подпиши меня на новые события
Время
Событие X
Событие X
Событие Y
Событие Y
Время
23
Real-time web applications. Websockets
24
Real-time web applications. Websockets
http://caniuse.com/#feat=websockets
Литература: High Performance Browser Networking
socket.io
https://github.com/rauchg/chat-­‐example
https://github.com/centrifugal/centrifugo
25
Real-time web applications. Websockets. Django
26
Real-time web applications. Websockets. Django
27
Real-time web applications. SSE
http://caniuse.com/#feat=sse
Литература: High Performance Browser Networking
28
Real-time web applications. WebRTC
http://caniuse.com/#feat=webrtc
Литература: High Performance Browser Networking
29
Real-time web applications. WebRTC
30
Как послать email уведомления?
Юзер написал комментарий. Как уведомить об этом других юзеров?
31
Очереди сообщений
32
Очереди. Преимущества
•
•
•
•
•
•
Асинхронная обработка
Надежность
Масштабируемость
Гарантированный порядок доставки
Слабая связанность
Возможность держать пиковые нагрузки
33
Очереди сообщений. Брокеры
•
•
•
•
•
•
ZeroMQ
RabbitMQ
ActiveMQ
Qpid
Kafka
etc
34
Очереди сообщений
35
Очереди сообщений
36
Очереди. Юз-кейсы
— генерация thumbnails;
— сбор статистики;
— рассылка писем/сообщений;
— удаление данных с таблиц;
— индексация данных;
— импорт данных в базу.
37
Очереди. Проблемы
• Persistence
• Fault tolerance
• Усложнение
38
Очереди сообщений. AMQP
#send.py
import pika
#receive.py
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters(
host='localhost'))
connection = pika.BlockingConnection(pika.ConnectionParameters(
host='localhost'))
channel = connection.channel()
channel.queue_declare(queue='hello')
channel.basic_publish(exchange='',
routing_key='hello',
body='Hello World!')
channel = connection.channel()
channel.queue_declare(queue='hello’)
print " [x] Sent 'Hello World!'”
connection.close()
print ' [*] Waiting for messages. To exit press CTRL+C’
def callback(ch, method, properties, body):
print " [x] Received %r" % (body,)
channel.basic_consume(callback,
queue='hello',
no_ack=True)
channel.start_consuming()
39
Очереди заданий. Celery
#tasks.py
from celery import Celery
app = Celery('tasks', broker='amqp://guest@localhost//')
@app.task
def add(x, y):
return x + y
$ celery -­‐A tasks worker -­‐-­‐loglevel=info
>>> from tasks import add
>>> add.delay(4, 4)
40
Task queues. Celery and Django
#app/celery.py
from __future__ import absolute_import
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'app.settings')
from django.conf import settings
app = Celery('app')
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
#app/settings.py
BROKER_URL = 'django://’
import djcelery
djcelery.setup_loader()
#app/__init__.py
from __future__ import absolute_import
from .celery import app as celery_app
41
Task queues. Celery and Django
#
#
#
#
#
pip install
pip install
pip install
./manage.py
./manage.py
kombu
celery
django-celery
migrate
celery worker --loglevel=info
42
Task queues. Celery and Django
#qa/tasks.py
from __future__ import absolute_import
from celery import shared_task
from django.core.mail import send_mail
@shared_task
def send_email_notification(to, subject, text):
send_mail(subject, text, 'robot@disaev.ru', [to], fail_silently=False)
#qa/models.py
@receiver(models.signals.post_save, sender=Answer)
def on_answer_creation(sender, instance, *args, **kwargs):
if kwargs.get('created'):
answer = instance
from .tasks import send_email_notification
send_email_notification.delay(
'd.isaev@corp.mail.ru',
'New answer to question "{}"'.format(answer.question.title),
'You got answer with the text: "{}"'.format(answer.text)
)
43
Full text search. Naive implementation
def search(query):
return Question.objects.filter(
Q(title__icontains=query) |
Q(text__icontains=query) |
Q(answer__text__icontains=query)
)
44
Full text search. Django
# wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch |
sudo apt-key add # echo "deb http://packages.elastic.co/elasticsearch/2.x/debian
stable main" | sudo tee -a /etc/apt/sources.list.d/elasticsearch2.x.list
# sudo apt-get update
# sudo apt-get install –y openjdk-7-jre-headless elasticsearch
# pip install django-haystack elasticsearch
45
Full text search. Django
https://gist.github.com/jirfag/ad9668cba8516e3b8995
46
Full text search. Example of architecture
47
Кэш
48
Кэширование. Django
49
Кэширование. Django. cache_page
# qa/urls.py
from django.views.decorators.cache import cache_page
#...
urlpatterns = [
url(r'^(?P<pk>\d+)/$', cache_page(60)(views.QuestionDetail.as_view()), name='q-­‐detail'),
]
# qa/views.py
@cache_page(60*60)
def question_detail(ruquest):
#...
50
Кэширование. Django. HTTP headers
@cache_control(private=True)
def view(ruquest):
pass
@vary_on_headers('User-­‐Agent', 'Cookie')
def view(ruquest):
pass
@cache_control(must_revalidate=True, max_age=3600)
def view(request):
pass
51
Кэширование. Django. Per-site cache
MIDDLEWARE_CLASSES = (
'django.middleware.cache.UpdateCacheMiddleware',
#...
'django.middleware.cache.FetchFromCacheMiddleware',
)
52
Кэширование. Django. Шаблоны
{% load cache %}
{% cache 500 sidebar request.user.username %}
.. sidebar for logged in user ..
{% endcache %}
53
Проблемы с кэшами
1.Инвалидация
2.Прогрев кэша
3.Все ложится, когда кэш ложится
54
Преимущества кэша
1.Ускорение
2.Можно отдавать закэшированную
версию, если сайт лежит
55
CMS или framework?
1.Плюсы CMS
1.не нужно уметь программировать
2.быстрее разворачивается
3.правильно спроектировано
4.наборы готовых дизайнов богаче
2.Минусы CMS
1.сложнее тюнить и поддерживать
2.cms и расширения могут стоить денег
56
CMS или framework? Django CMS vs
framework
57
CMS или framework? Django CMS vs
framework
58
CMS или framework? Тренды
59
CMS или framework? Основные CMS
60
CMS или framework? Основные CMS
61
CMS или framework? Основные CMS
62
CMS или framework? Когда использовать
CMS?
1. Быстрый старт
2. Нужно работать не-­‐программистам
3. Не требуется тюнинг, например, блог (Wordpress)
63
CMS или framework? Выбор CMS
1. По задаче
1. блог – wordpress, blogcms
2. интернет-­‐магазин – magento, opencart, bitrix
3. корпоративный сайт – bitrix, joomla
2. По производительности – рейтинги
3. По цене
1. opensource – joomla, drupal
2. платные – bitrix, UMI.CMS
Отдельно можно отметить облачные CMS.
64
CMS или framework? Основные фреймворки
65
CMS или framework? PHP фреймворки
•
•
•
•
•
•
•
Zend
CakePHP
Code Igniter
Kohana
Symfony
Yii
прочие
66
CMS или framework? PHP фреймворки
67
CMS или framework? PHP фреймворки
• Низкий порог входа в язык
• Дизайн языка многие считают сомнительным
• Не модно
68
CMS или framework? Не PHP фреймворки
•
•
•
•
•
•
ASP.NET
Java frameworks
RoR
Django/Flask
Node.js frameworks
Прочее
69
CMS или framework? Критерии выбора
фреймворка. Сложность работы
Среди лидеров будет PHP
70
CMS или framework? Критерии выбора
фреймворка. Скорость разработки
Принципы фреймворков:
• DRY
• convention over configuration
• configuration over convention 71
CMS или framework? Критерии выбора
фреймворка. Скорость разработки
$ rails g model User first_name:string last_name:string
$ bin/rails generate controller welcome index
create app/controllers/welcome_controller.rb
route get 'welcome/index'
invoke erb
create app/views/welcome
create app/views/welcome/index.html.erb
invoke test_unit
create test/controllers/welcome_controller_test.rb
invoke helper
create app/helpers/welcome_helper.rb
invoke assets
invoke coffee
create app/assets/javascripts/welcome.js.coffee
invoke scss
create app/assets/stylesheets/welcome.css.scss
72
CMS или framework? Критерии выбора
фреймворка. Скорость разработки
73
CMS или framework? Критерии выбора
фреймворка. Скорость разработки
74
CMS или framework? Критерии выбора
фреймворка. Цена разработки
• Опыт команды
• Уже используемый стек технологий
75
CMS или framework? Критерии выбора
фреймворка. Задача
Node.js vs Django ?
76
CMS или framework? Критерии выбора
фреймворка. Язык разработки
•
•
•
•
Производительность кода
Скорость разработки
Опыт команды
Принципы проектирования
77
CMS или framework? Тренды
78
Автор
tekhnostrim
Документ
Категория
Без категории
Просмотров
221
Размер файла
13 022 Кб
Теги
лекция
1/--страниц
Пожаловаться на содержимое документа