Массовые операции над письмами в Яндекс.Почте — Денис...

27
1 Асинхронные операции над письмами в Я.Почте Денис Кутуков, разработчик Я.Субботник в Минске, 30.08.2014

Upload: yandex

Post on 15-Jan-2015

2.039 views

Category:

Technology


5 download

DESCRIPTION

Операции над письмами (пометка спамовым, удаление или перемещение) — неотъемлемая часть почтового сервиса, которая создает заметную нагрузку на бэкенд и может сильно увеличить время отклика системы. В докладе я расскажу, как эволюционировал наш модуль операций над письмами, как мы сделали его асинхронным, на какие грабли мы наступили с Zookeeper’ом и какие выводы сделали.

TRANSCRIPT

Page 1: Массовые операции над письмами в Яндекс.Почте — Денис Кутуков

1

Асинхронные операции

над письмами в Я.Почте

Денис Кутуков, разработчик

Я.Субботник в Минске, 30.08.2014

Page 2: Массовые операции над письмами в Яндекс.Почте — Денис Кутуков

2

Операции над письмами

• Пометить прочитанным

• Удалить

• Переместить в другую папку

• Пометить как спам/хам

Page 3: Массовые операции над письмами в Яндекс.Почте — Денис Кутуков

3

Единичные операции

Page 4: Массовые операции над письмами в Яндекс.Почте — Денис Кутуков

4

Массовые операции

Типичные операции:

• Удалить весь INBOX

• Пометить всю папку прочитанной

Page 5: Массовые операции над письмами в Яндекс.Почте — Денис Кутуков

5

Массовые операции: проблемы

долгие запросы забивают БД

отваливаются по таймауту

user-experience ухудшается

пользователи жалуются

Page 6: Массовые операции над письмами в Яндекс.Почте — Денис Кутуков

6

Массовые операции: решение

msg_id_{1..6}

msg_id_{1,2}

msg_id_{3,4}

msg_id_{5,6} Нужен механизм асинхронной обработки

Page 7: Массовые операции над письмами в Яндекс.Почте — Денис Кутуков

7

Oracle Scheduler

http://bit.ly/yasb-orasch

Достоинства:

• Работает

Недостатки:

• Сложная логика в БД

• Неприятно для DBA

• Трудно выкатывать изменения

• Oracle = $$$

Page 8: Массовые операции над письмами в Яндекс.Почте — Денис Кутуков

8

Операции в middle-tier

Task Chunks

Storage

Workers

Page 9: Массовые операции над письмами в Яндекс.Почте — Денис Кутуков

9

Что надо реализовать

• Хранение данных о тасках

• Синхронизация воркеров

Page 10: Массовые операции над письмами в Яндекс.Почте — Денис Кутуков

10

Apache Zookeeper

http://bit.ly/yasb-zk

• Файловая система

• Локи

• Координация

Все это - распределенное

Page 11: Массовые операции над письмами в Яндекс.Почте — Денис Кутуков

11

Почему Zookeeper?

• Переживает потерю ДЦ

• Хорошо задокументирован, активное сообщество

• Есть примеры успешного использования в Яндексе

Page 12: Массовые операции над письмами в Яндекс.Почте — Денис Кутуков

12

Данные в Zookeeper-е /

user1 user2 userN

chunk1 chunk2 chunkM

{“task”: {“id”:”task123”,

…}, “msgs”:[1,2,3,…]}

Page 13: Массовые операции над письмами в Яндекс.Почте — Денис Кутуков

13

Конфликты Пользователь:

• сначала удаляет большую папку

• затем перемещает одно письмо

Система:

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

Требование:

• быстро искать конфликты

Page 14: Массовые операции над письмами в Яндекс.Почте — Денис Кутуков

14

Добавление задания

void push(Task task) {

lock(task.user);

resolve(task.user, task.mids);

chunks = divide(task);

storage.push(chunks);

storage.push(task.params);

unlock(task.user);

}

Page 15: Массовые операции над письмами в Яндекс.Почте — Денис Кутуков

15

Обработка чанка

void processChunk(Handler handler) {

while (true) {

chunk = storage.nextChunk();

if (tryLock(chunk)) {

handler(chunk);

storage.remove(chunk);

unlock(chunk);

break;

}

}

}

Page 16: Массовые операции над письмами в Яндекс.Почте — Денис Кутуков

16

Разрешение конфликтов

void resolve(Request req) {

lock(req.user);

conf = storage.intersect(req.mids);

for (chunk: conf.chunks) {

msgs = conflictMsgs(conf, req);

chunk.remove(msgs);

}

unlock(req.user);

}

Page 17: Массовые операции над письмами в Яндекс.Почте — Денис Кутуков

17

Проблема с конфликтами

Chunk1

delete

msg1

msg2

msg3

msg4

Chunk2

spam

msg5

msg6

msg7

msg8

Chunk3

move

msg9

msg10

msg11

msg12

Chunk4

markRead

msg13

msg14

msg15

msg16

Zookeeper Storage

spam

msg3

msg10

move

msg2

~ 600 RPS

Page 18: Массовые операции над письмами в Яндекс.Почте — Денис Кутуков

18

Блум-фильтр

Pfp > 0

http://bit.ly/yasb-bloom

Page 19: Массовые операции над письмами в Яндекс.Почте — Денис Кутуков

19

Фильтр чанка

Предфильтруем поиск письма в чанке.

user2 4f594a90_6730b0b7b951 / /

Название Z-ноды с чанком:

Chunk Id Bloom Filter Pfp=0.001

Page 20: Массовые операции над письмами в Яндекс.Почте — Денис Кутуков

20

Zookeeper и несколько машин

• Leader-follower

• Синхронные записи в кворум

• Чтение с любой ноды

Page 21: Массовые операции над письмами в Яндекс.Почте — Денис Кутуков

21

Наши эксперименты

Leader

Followers

Перевыборы 7 мин (кластер недоступен)

Объем 10Gb

Долгая синхронизация данных

Page 22: Массовые операции над письмами в Яндекс.Почте — Денис Кутуков

22

Что делать?

Облегчаем Zookeeper, выносим данные.

Хранилище – Postgresql (http://bit.ly/yasb-pg)

• Реляционная структура

• OpenSource

• У админов и разработчиков

есть библиотеки и инструменты

• Нормально переживает потерю мастера

Page 23: Массовые операции над письмами в Яндекс.Почте — Денис Кутуков

23

Схема данных

Page 24: Массовые операции над письмами в Яндекс.Почте — Денис Кутуков

24

Данные в Zookeeper-е

/

user1 user2 userN

chunk_1_0110 chunk_2_1100 сhunk_M_0100

Page 25: Массовые операции над письмами в Яндекс.Почте — Денис Кутуков

25

В итоге

• Zookeeper подходит для блокировки, но не очень – для данных

• Запускаем массовые операции над письмами в Я.Почте

Page 26: Массовые операции над письмами в Яндекс.Почте — Денис Кутуков

26

Ссылки

• Oracle Scheduler

http://bit.ly/yasb-orasch

• Zookeeper

http://bit.ly/yasb-zk

• Bloom Filter

http://bit.ly/yasb-bloom

• Postgresql

http://bit.ly/yasb-pg

Page 27: Массовые операции над письмами в Яндекс.Почте — Денис Кутуков

27

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

Вопросы?

[email protected]