Инструменты высоконагруженных проектов - кэширование...

21
Инструменты высоконагруженных проектов: кеширование (Memcached, Redis), очереди (RabbitMQ) Вячеслав Москаленко

Upload: ontico

Post on 16-Jun-2015

834 views

Category:

Internet


1 download

DESCRIPTION

Доклад Вячеслава Москаленко на HighLoad++ 2014.

TRANSCRIPT

Page 1: Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Москаленко (Ленвендо)

Инструменты высоконагруженных проектов: кеширование (Memcached, Redis), очереди (RabbitMQ)

Вячеслав Москаленко

Page 2: Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Москаленко (Ленвендо)

СодержаниеИнструменты кеширования данных

• Memcached• Redis• Основные различия Memcached & Redis• Практическое использование Memcached и Redis

Очереди• RabbitMQ, основные понятия и принцип работы• Различные типы обменников – Direct, Fanout, Topic• Практическое применение очередей

Page 3: Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Москаленко (Ленвендо)

Memcached

• Memcached - сервис для кеширования данных в оперативной памяти, обладающий высокой производительностью.

• История – разработан Brad Fitzpatrick для Livejournal в 2003 г.

• Цели - кеширование часто запрашиваемых данных, для снижения нагрузки на БД

• Используют – Livejournal, Twitter, Youtube и др.

Page 4: Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Москаленко (Ленвендо)

Memcached. ВозможностиВозможности:1. Быстрая работа, нет зависимости от количества данных О(1)2. Простой интерфейс – set/get/del3. Атомарные операции – incr/decr, append/prepend4. Хранение ключей на нескольких серверах

Ограничения:5. Длина ключа – 250 байт6. Объём данных по одному ключу – 1Mb7. Потеря ключей – при лимите памяти, по ttl, отказ сервера

Page 5: Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Москаленко (Ленвендо)

Memcached. ПримерРеализация PHP:• расширение для libmemcached • расширение php-memcache

Использование: простой интерфейс set / get / delete

Page 6: Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Москаленко (Ленвендо)

Redis1. Поддержка различных типов данных – строки, хэши, списки,

множества, сортированные множества2. Сохранение на диск3. Поддержка LRU, различные стратегии очистки ключей4. master-slave репликация5. Реализация очередей Sub/Pub6. Транзакции MULTI/EXEC7. Поддержка LUA скриптов8. Отличная документация

Page 7: Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Москаленко (Ленвендо)

Redis. Типы данных1. Строки (String)

2. Хэши (Hash)

Page 8: Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Москаленко (Ленвендо)

Redis. Типы данных3. Множества (Sets)

4. Сортированные множества (Sorted Sets)

Page 9: Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Москаленко (Ленвендо)

Redis. Клиенты для PHP• phpredis – модуль для PHP, написан на С• Predis – библиотека, написанная на PHP• Rediska – PHP реализация• RedisServer – класс для работы с Redis, написанный на PHP• Resident – форк RedisServer, используется phpredis, если он

установлен

Рекомендации:использование расширения phpredis, написанного на C, по бенчмаркам - самый быстрый для работы с Redis

Page 10: Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Москаленко (Ленвендо)

Memcached или Redis?Redis:• больше возможностей:

очереди, транзакции, различные типы данных

• позволяет хранить до 512 Mb в значениях

• поддерживает master-slave репликацию, кластеризация с версии 3.0 (RC)

• можно использовать как постоянное хранилище данных

• производительность сравнима с Memcached

Memcached :• быстрее, чем Redis, но на

практике эта разница практически не заметна

• хорош в качестве кеша, но есть множество задач с которыми Redis справится не хуже, а для некоторых задач и лучше чем Memcached в силу своих возможностей

Page 11: Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Москаленко (Ленвендо)

Пример 1. Кеш карточки товараЗадача: реализация быстрого просмотра в Popup карточки товара, с минимальным обращением в бэкенд.

Page 12: Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Москаленко (Ленвендо)

Пример 1. Кеш карточки товара

На графике:1 - данные из Memcached2 - данных в Memcached нет2a - но есть в Redis2b - запрос в MySQL +

сохранение в Redis/Memcached

Page 13: Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Москаленко (Ленвендо)

Пример 2. Параметрический поиск

Реализация: • хранение заранее

обсчитанных множеств товаров (ID) для каждого варианта фильтра в Redis

Используемы типы данных:• Hashes (информация о

фильтрах)• Sets (множества товаров)• Sorted Sets (список

фильтров и их вариантов)

Page 14: Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Москаленко (Ленвендо)

Пример 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: Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Москаленко (Ленвендо)

Очереди. RabbitMQПлатформа, реализующая систему обмена сообщениями посредством протокола AQMP (Advanced Messaging Queue Protocol)

Особенности:• надежность• гибкая система маршрутов сообщений • поддержка кластеризации• поддержка плагинов (мониторинг системы, кастомное

поведение, и др.)• написан на Erlang• клиенты для большинства языков: Java, Ruby, Python, .NET,

PHP, Perl, C/C++ и др

Page 16: Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Москаленко (Ленвендо)

RabbitMQ. Основные термины

Producer – программа, которая посылает сообщения

Queue – очередь, хранится в «кролике», может содержать сколь угодно много сообщений (бесконечный буфер). Сообщения лежат именно в очередях. Посылать сообщения может один и более producer-ов, читать их тожеConsumer – программа получатель сообщений

Exchange – обменник, все сообщения проходят через обменник

Простейший workflow:

Page 17: Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Москаленко (Ленвендо)

Обменник с типом Direct• для задания маршрута

необходимо «забиндить» очередь с обменником используя binding_key

• сообщения попадают в очередь согласно правилу равенства ключей: routing_key = binding_key

Page 18: Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Москаленко (Ленвендо)

Обменник с типом Fanout

• сообщения попадают во все очереди связанные с обменником

• не важно какой routing_key у сообщения

Page 19: Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Москаленко (Ленвендо)

Обменник с типом 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: Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Москаленко (Ленвендо)

RabbitMQ на практике• Использование брокера сообщений RabbitMQ для выполнения

отложенных трудоемких задач• Пересчет множеств хранящихся в Redis при изменениях

сущностей системы

• Консьюмеры пишут в master• Фронтэнд читает со slave

Page 21: Инструменты высоконагруженных проектов - кэширование и очереди, Вячеслав Москаленко (Ленвендо)

Спасибо за внимание!