Инструменты высоконагруженных проектов - кэширование...
DESCRIPTION
Доклад Вячеслава Москаленко на HighLoad++ 2014.TRANSCRIPT
![Page 1: Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Москаленко (Ленвендо)](https://reader036.vdocuments.site/reader036/viewer/2022062514/557f553bd8b42a822f8b4a64/html5/thumbnails/1.jpg)
Инструменты высоконагруженных проектов: кеширование (Memcached, Redis), очереди (RabbitMQ)
Вячеслав Москаленко
![Page 2: Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Москаленко (Ленвендо)](https://reader036.vdocuments.site/reader036/viewer/2022062514/557f553bd8b42a822f8b4a64/html5/thumbnails/2.jpg)
СодержаниеИнструменты кеширования данных
• Memcached• Redis• Основные различия Memcached & Redis• Практическое использование Memcached и Redis
Очереди• RabbitMQ, основные понятия и принцип работы• Различные типы обменников – Direct, Fanout, Topic• Практическое применение очередей
![Page 3: Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Москаленко (Ленвендо)](https://reader036.vdocuments.site/reader036/viewer/2022062514/557f553bd8b42a822f8b4a64/html5/thumbnails/3.jpg)
Memcached
• Memcached - сервис для кеширования данных в оперативной памяти, обладающий высокой производительностью.
• История – разработан Brad Fitzpatrick для Livejournal в 2003 г.
• Цели - кеширование часто запрашиваемых данных, для снижения нагрузки на БД
• Используют – Livejournal, Twitter, Youtube и др.
![Page 4: Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Москаленко (Ленвендо)](https://reader036.vdocuments.site/reader036/viewer/2022062514/557f553bd8b42a822f8b4a64/html5/thumbnails/4.jpg)
Memcached. ВозможностиВозможности:1. Быстрая работа, нет зависимости от количества данных О(1)2. Простой интерфейс – set/get/del3. Атомарные операции – incr/decr, append/prepend4. Хранение ключей на нескольких серверах
Ограничения:5. Длина ключа – 250 байт6. Объём данных по одному ключу – 1Mb7. Потеря ключей – при лимите памяти, по ttl, отказ сервера
![Page 5: Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Москаленко (Ленвендо)](https://reader036.vdocuments.site/reader036/viewer/2022062514/557f553bd8b42a822f8b4a64/html5/thumbnails/5.jpg)
Memcached. ПримерРеализация PHP:• расширение для libmemcached • расширение php-memcache
Использование: простой интерфейс set / get / delete
![Page 6: Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Москаленко (Ленвендо)](https://reader036.vdocuments.site/reader036/viewer/2022062514/557f553bd8b42a822f8b4a64/html5/thumbnails/6.jpg)
Redis1. Поддержка различных типов данных – строки, хэши, списки,
множества, сортированные множества2. Сохранение на диск3. Поддержка LRU, различные стратегии очистки ключей4. master-slave репликация5. Реализация очередей Sub/Pub6. Транзакции MULTI/EXEC7. Поддержка LUA скриптов8. Отличная документация
![Page 7: Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Москаленко (Ленвендо)](https://reader036.vdocuments.site/reader036/viewer/2022062514/557f553bd8b42a822f8b4a64/html5/thumbnails/7.jpg)
Redis. Типы данных1. Строки (String)
2. Хэши (Hash)
![Page 8: Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Москаленко (Ленвендо)](https://reader036.vdocuments.site/reader036/viewer/2022062514/557f553bd8b42a822f8b4a64/html5/thumbnails/8.jpg)
Redis. Типы данных3. Множества (Sets)
4. Сортированные множества (Sorted Sets)
![Page 9: Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Москаленко (Ленвендо)](https://reader036.vdocuments.site/reader036/viewer/2022062514/557f553bd8b42a822f8b4a64/html5/thumbnails/9.jpg)
Redis. Клиенты для PHP• phpredis – модуль для PHP, написан на С• Predis – библиотека, написанная на PHP• Rediska – PHP реализация• RedisServer – класс для работы с Redis, написанный на PHP• Resident – форк RedisServer, используется phpredis, если он
установлен
Рекомендации:использование расширения phpredis, написанного на C, по бенчмаркам - самый быстрый для работы с Redis
![Page 10: Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Москаленко (Ленвендо)](https://reader036.vdocuments.site/reader036/viewer/2022062514/557f553bd8b42a822f8b4a64/html5/thumbnails/10.jpg)
Memcached или Redis?Redis:• больше возможностей:
очереди, транзакции, различные типы данных
• позволяет хранить до 512 Mb в значениях
• поддерживает master-slave репликацию, кластеризация с версии 3.0 (RC)
• можно использовать как постоянное хранилище данных
• производительность сравнима с Memcached
Memcached :• быстрее, чем Redis, но на
практике эта разница практически не заметна
• хорош в качестве кеша, но есть множество задач с которыми Redis справится не хуже, а для некоторых задач и лучше чем Memcached в силу своих возможностей
![Page 11: Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Москаленко (Ленвендо)](https://reader036.vdocuments.site/reader036/viewer/2022062514/557f553bd8b42a822f8b4a64/html5/thumbnails/11.jpg)
Пример 1. Кеш карточки товараЗадача: реализация быстрого просмотра в Popup карточки товара, с минимальным обращением в бэкенд.
![Page 12: Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Москаленко (Ленвендо)](https://reader036.vdocuments.site/reader036/viewer/2022062514/557f553bd8b42a822f8b4a64/html5/thumbnails/12.jpg)
Пример 1. Кеш карточки товара
На графике:1 - данные из Memcached2 - данных в Memcached нет2a - но есть в Redis2b - запрос в MySQL +
сохранение в Redis/Memcached
![Page 13: Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Москаленко (Ленвендо)](https://reader036.vdocuments.site/reader036/viewer/2022062514/557f553bd8b42a822f8b4a64/html5/thumbnails/13.jpg)
Пример 2. Параметрический поиск
Реализация: • хранение заранее
обсчитанных множеств товаров (ID) для каждого варианта фильтра в Redis
Используемы типы данных:• Hashes (информация о
фильтрах)• Sets (множества товаров)• Sorted Sets (список
фильтров и их вариантов)
![Page 14: Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Москаленко (Ленвендо)](https://reader036.vdocuments.site/reader036/viewer/2022062514/557f553bd8b42a822f8b4a64/html5/thumbnails/14.jpg)
Пример 2. Параметрический поискДанные по фильтрам в категории “Телефоны” (id = 100):Фильтр / Вариант ID товаров Ключ в Redis
1. Производитель / SAMSUNG { 201, 202, 203, 204 }
plist:c:100:f:producer:v:samsung
2. Производитель / PHILIPS { 301, 302, 303 }
plist:c:100:f:producer:v:philips
3. Цвет / Красный { 202, 303, 701 } plist:c:100:f:color:v:redКонкретные выборки:Телефоны Samsung + Philips (7 эл.): { 201, 202, 203, 204, 301, 302, 303 }Телефоны Samsung + Philips / красные (2 эл.): { 202, 303 }
Особенности реализации:• существенно быстрее, чем сложные выборки из MySQLНО: необходимо обновлять необходимые множества при каждом изменении сущностей, которые могут повлиять на состав фильтров
![Page 15: Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Москаленко (Ленвендо)](https://reader036.vdocuments.site/reader036/viewer/2022062514/557f553bd8b42a822f8b4a64/html5/thumbnails/15.jpg)
Очереди. RabbitMQПлатформа, реализующая систему обмена сообщениями посредством протокола AQMP (Advanced Messaging Queue Protocol)
Особенности:• надежность• гибкая система маршрутов сообщений • поддержка кластеризации• поддержка плагинов (мониторинг системы, кастомное
поведение, и др.)• написан на Erlang• клиенты для большинства языков: Java, Ruby, Python, .NET,
PHP, Perl, C/C++ и др
![Page 16: Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Москаленко (Ленвендо)](https://reader036.vdocuments.site/reader036/viewer/2022062514/557f553bd8b42a822f8b4a64/html5/thumbnails/16.jpg)
RabbitMQ. Основные термины
Producer – программа, которая посылает сообщения
Queue – очередь, хранится в «кролике», может содержать сколь угодно много сообщений (бесконечный буфер). Сообщения лежат именно в очередях. Посылать сообщения может один и более producer-ов, читать их тожеConsumer – программа получатель сообщений
Exchange – обменник, все сообщения проходят через обменник
Простейший workflow:
![Page 17: Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Москаленко (Ленвендо)](https://reader036.vdocuments.site/reader036/viewer/2022062514/557f553bd8b42a822f8b4a64/html5/thumbnails/17.jpg)
Обменник с типом Direct• для задания маршрута
необходимо «забиндить» очередь с обменником используя binding_key
• сообщения попадают в очередь согласно правилу равенства ключей: routing_key = binding_key
![Page 18: Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Москаленко (Ленвендо)](https://reader036.vdocuments.site/reader036/viewer/2022062514/557f553bd8b42a822f8b4a64/html5/thumbnails/18.jpg)
Обменник с типом Fanout
• сообщения попадают во все очереди связанные с обменником
• не важно какой routing_key у сообщения
![Page 19: Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Москаленко (Ленвендо)](https://reader036.vdocuments.site/reader036/viewer/2022062514/557f553bd8b42a822f8b4a64/html5/thumbnails/19.jpg)
Обменник с типом TopicПравила для binding_key:1. * (звездочка) может быть
заменена на ровно на одно слово
2. # (решетка) может быть заменена на 0 и более слов
Routing Key Queuequick.orange.rabbit (*.orange.*, *.*.rabbit) Q1, Q2lazy.orange.elephant (lazy.#, *.orange.*) Q1, Q2quick.orange.fox (*.orange.*) Q1 lazy.red.fox (lazy.#) Q2
![Page 20: Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Москаленко (Ленвендо)](https://reader036.vdocuments.site/reader036/viewer/2022062514/557f553bd8b42a822f8b4a64/html5/thumbnails/20.jpg)
RabbitMQ на практике• Использование брокера сообщений RabbitMQ для выполнения
отложенных трудоемких задач• Пересчет множеств хранящихся в Redis при изменениях
сущностей системы
• Консьюмеры пишут в master• Фронтэнд читает со slave
![Page 21: Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Москаленко (Ленвендо)](https://reader036.vdocuments.site/reader036/viewer/2022062514/557f553bd8b42a822f8b4a64/html5/thumbnails/21.jpg)
Спасибо за внимание!