SlideShare a Scribd company logo
1 of 29
Download to read offline
Делаем очередь поверх
Кассандры
Максим Кирюшкин
telecan.ru
12-я конференция .NET разработчиков
15 мая 2016
dotnetconf.ru
2
Постановка задачи
LPWAN
low-power wide-area network
3
Постановка задачи
• Множество источников сообщений
• Многоступенчатая обработка в реальном
времени
• Длительное хранение
• Выдача данных по запросу
• Подписка сторонних клиентов на события
• Высокая надёжность
4
Варианты решения
Очередь:
• RabbitMq
• ActiveMQ Apollo
• Kafka
Хранение:
• SQL
• NoSQL
5
Зачем искать альтернативы?
• Очереди удаляют сообщения после
обработки
• Гибкие правила обработки – сложно
• Повторная обработка => повторное
добавление в очередь
• Требуется очередь + хранение – иметь
две системы накладно
• Лишние операции копирования
6
Несколько слов про Кассандру
RowKey: { SuperColumnKey: { ColumKey: Value } }
Децентрализованная база (модель BigTable)
с настраиваемой целостностью для чтения и
записи.
7
Общая идея очереди в Кассандре
• Wide rows
• Обработка в один или несколько потоков
• Помечаем обрабатываемые сообщения
• Результат в той же или отдельной таблице
8
Очереди в Кассандре – антипаттерн
• Cassandra создана для хранения
• Выборка с условием не предусмотрена
• Удаление – сложная задача для
распределённого хранилища
• Нет системы подписки на события
(временно)
9
Решение проблемы с удалением
Использовать отложенное удаление (TTL)
INSERT INTO tab (rkey, clkey, val)
VALUES ('rawhash', 'cluster', 42)
USING TTL 86400;
UPDATE tab USING TTL 86400
SET val=42
WHERE rkey='some' AND clkey='any';
10
Полезная вещь: транзакции
INSERT INTO rawdata (row_date, moment, handled, message)
VALUES ('2016-05-15', '2016-05-15 11:23:00', 0, 'message')
IF NOT EXISTS;
UPDATE rawdata SET handled=2
WHERE row_date='2016-05-15' AND moment='2016-05-15 11:23:00'
IF handled=1;
[applied]
true
[applied] | raw_date | moment | handled | message
false | 2016-05-15 | '2016-05-15 11:23:00' | 0 | message
11
Общая идея очереди в Кассандре
• Wide rows
• Обработка в один или несколько потоков
• Помечаем обрабатываемые сообщения
• Результат в той же или отдельной таблице
12
Наполнение с переменной нагрузкой
CREATE TABLE IF NOT EXISTS rawdata (
row_date date, -- дата, определяющая строку, yyyy-mm-dd
moment timeUUID, -- момент поступления в систему, идентификатор
handled tinyint, -- 0 - unhandled, 1 - handling, 2 - handled, 3... – error
message blob, -- данные пакета
PRIMARY KEY (row_date, moment)
) WITH CLUSTERING ORDER BY (moment ASC);
13
Наполнение с переменной нагрузкой
CREATE TABLE IF NOT EXISTS rawdata (
row_date date, -- дата, определяющая строку, yyyy-mm-dd
row_sec int, -- начальная секунда строки, [0..86400)
moment timeUUID, -- момент поступления в систему, идентификатор
handled tinyint, -- 0 - unhandled, 1 - handling, 2 - handled, 3... - error
message blob, -- данные пакета
PRIMARY KEY ((row_date, row_sec), moment)
) WITH CLUSTERING ORDER BY (moment ASC);
CREATE TABLE IF NOT EXISTS rawdata_meta_rows (
row_date date, -- дата строки
row_sec int, -- начальная секунда строки, [0..86400)
PRIMARY KEY ((row_date), row_sec)
) WITH CLUSTERING ORDER BY (row_sec DESC);
CREATE TABLE IF NOT EXISTS rawdata_meta (
mkey text, -- варианты: csec (current second), nsec (next second)
msubkey text, -- ключ ячейки в строке (csec: yyyy-mm-dd)
mval text, -- значение
PRIMARY KEY ((mkey), msubkey)
);
хранит все ключи
партиций (строк)
из rawdata
кэш значений переменных
14
Наполнение с переменной нагрузкой
curS := ТекущаяСекундаДня( ) или 0
nextS := СекундаПерехода( )
ЦИКЛ добавления сообщений
msg := СформироватьСообщение( )
ЕСЛИ сработал таймер ТОГДА
nextS := СекундаПерехода( )
ЕСЛИ ТекущееВремя( ) >= nextS ТОГДА
curS := nextS
ЗаписатьСообщение(msg, curS)
15
Наполнение с переменной нагрузкой
ЦИКЛ проверки
curBlock := НаполняемыйБлок( )
cnt := КоличествоЗаписей(curBlock)
ЕСЛИ cnt > N ТОГДА
nextS := ТекущееВремя( ) + K
ЗадатьСекундуПерехода(nextS)
УснутьНа(Z) // Z <= K
16
Наполнение с переменной нагрузкой
Если не был задан переход nextS
Если был задан переход и посчитали новый
INSERT INTO rawdata_meta (mkey, msubkey, mval)
VALUES ('nsec', '2016-05-15', nextS)
IF NOT EXISTS USING TTL 86400;
UPDATE rawdata_meta USING TTL 86400
SET mval=nextS
WHERE mkey='nsec' AND msubkey='2016-05-15‘
IF mval=oldNextS;
17
Наполнение с переменной нагрузкой
18
Обработка сообщений
Однопоточная:
• Любой язык
выборка –> обработка –> сохранение
Многопоточная:
• Hadoop (MapReduce)
• Apache Spark
• Другое решение
19
Однопоточная обработка: выборка
1. Определение ключа партиции и кластера
по rawdata_meta_rows
2. Выборка из конкретной строки с условием
и сортировкой
3. Пагинация (LIMIT, OFFSET)
CREATE TABLE IF NOT EXISTS rawdata (
row_date date, -- дата, определяющая строку, yyyy-mm-dd
row_sec int, -- начальная секунда строки, [0..86400)
moment timeUUID, -- момент поступления в систему, идентификатор
handled tinyint, -- 0 - unhandled, 1 - handling, 2 - handled, 3... - error
message blob, -- данные пакета
PRIMARY KEY ((row_date, row_sec), moment)
) WITH CLUSTERING ORDER BY (moment ASC);
20
Неочевидные проблемы выборки
Сложности прямых запросов:
• Сортировка доступна только по ключу
• Нет понятия OFFSET
• Нельзя просто взять и применить условия
SELECT * FROM rawdata WHERE row_date='2016-05-10‘
AND row_sec=0 AND handled=0;
No supported secondary index found for the non primary key
columns restrictions
21
Неочевидные проблемы выборки
Можно применить индексы, но индекс по
флагу не эффективен
Each value in the index becomes a single row in the
index, resulting in a huge row for all the false values,
for example. Indexing a multitude of indexed columns
having foo = true and foo = false is not useful.
22
Неочевидные проблемы выборки
Есть в Кассандре materialized views, но их
функционал пока слишком слаб: нет условий
выборки, сортировки и т.д.
CREATE MATERIALIZED VIEW rawdata_unhandled AS
SELECT row_date, row_sec, handled, moment, message
FROM rawdata
WHERE row_date IS NOT NULL AND row_sec IS NOT NULL
AND moment IS NOT NULL AND handled IS NOT NULL
PRIMARY KEY ((row_date, row_sec), handled, moment);
23
Решение проблем с выборкой
Внешнее приложение должно взять полный
контроль на себя и точно знать, что запрашивать
SELECT row_date, row_sec, moment, handled FROM rawdata
WHERE row_date='2016-05-15' AND row_sec=0 LIMIT 100;
row_date | row_sec | moment | handled
...
2016-05-15 | 0 | d6686343-1804-11e6-bebe-87c17418206b | 0
SELECT row_date, row_sec, moment, handled FROM rawdata
WHERE row_date='2016-05-15' AND row_sec=0
AND moment > d6686343-1804-11e6-bebe-87c17418206b
LIMIT 100;
24
Многопоточная обработка
Hadoop, Apache Spark:
• Отлично подходят для Big Data Analytics
• Вся обработка через запуск обработчика на
одно или группу сообщений
• Возврат в очередь, смена
последовательности, отложенная обработка –
затруднены
• Много копирований в процессе разделения
и передачи сообщений
25
Многопоточная обработка
• Простой вариант – сколько угодно потоков,
читаем несколько записей вперёд, ставим
флаг обработки, обрабатываем, ставим флаг
готовности
• Сложный вариант – потоки договариваются
между собой, кто какие записи берёт;
разбивка по миллисекундам
• Сложный вариант улучшенный – очередь
изначально разбивается на уровне ключа,
потоки оповещают друг друга о вхождении в
работу
26
Оповещение о событиях
• Триггеры
• CDC (Change Data Capture)
• Внешний источник оповещений
CREATE TRIGGER IF NOT EXISTS trigger_name
ON table_name
USING 'java_class';
27
Когда Кассандра не подходит
• Низкая нагрузка и малое количество узлов
системы
• Сохранение сообщений не требуется
• Необходима гибкая подписка и система
оповещения
• Привычность решения важнее
производительности и отказоустойчивости
28
Когда решение имеет смысл
• Очень высокая нагрузка
• Децентрализованная распределённая
среда
• Сообщения сохраняются после обработки
• Необходима повторная обработка
сообщений
• Сложная зависимая обработка (например,
цепочки сообщений)
29
Спасибо за внимание
Максим Кирюшкин
catch@mail.ru
telecan.ru

More Related Content

What's hot

Лекция 10. Apache Mahout
Лекция 10. Apache MahoutЛекция 10. Apache Mahout
Лекция 10. Apache MahoutTechnopark
 
Call of Postgres: Advanced Operations (part 4)
Call of Postgres: Advanced Operations (part 4)Call of Postgres: Advanced Operations (part 4)
Call of Postgres: Advanced Operations (part 4)Alexey Lesovsky
 
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Time series data in a relational database. TimescaleDB and PipelineDB extensi...Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Time series data in a relational database. TimescaleDB and PipelineDB extensi...Ivan Muratov
 
Константин Осипов (Mail.Ru)
Константин Осипов (Mail.Ru)Константин Осипов (Mail.Ru)
Константин Осипов (Mail.Ru)Ontico
 
Bitrix clouds without_admins
Bitrix clouds without_adminsBitrix clouds without_admins
Bitrix clouds without_adminsAlexander Demidov
 
Сага о кластере. Все что вы хотели знать про горизонтальное масштабирование в...
Сага о кластере. Все что вы хотели знать про горизонтальное масштабирование в...Сага о кластере. Все что вы хотели знать про горизонтальное масштабирование в...
Сага о кластере. Все что вы хотели знать про горизонтальное масштабирование в...Ontico
 
3rd Moscow cassandra meetup (Fast In-memory Analytics Over Cassandra Data )
3rd Moscow cassandra meetup (Fast In-memory Analytics Over Cassandra Data )3rd Moscow cassandra meetup (Fast In-memory Analytics Over Cassandra Data )
3rd Moscow cassandra meetup (Fast In-memory Analytics Over Cassandra Data )Shamim bhuiyan
 
Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"
Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"
Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"Alexey Zinoviev
 
Строим сервисы на базе Nginx и Tarantool / Василий Сошников, Андрей Дроздов (...
Строим сервисы на базе Nginx и Tarantool / Василий Сошников, Андрей Дроздов (...Строим сервисы на базе Nginx и Tarantool / Василий Сошников, Андрей Дроздов (...
Строим сервисы на базе Nginx и Tarantool / Василий Сошников, Андрей Дроздов (...Ontico
 
Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...
Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...
Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...Ontico
 
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...Ontico
 
Hadoop > cascading -> cascalog (very short)
Hadoop  > cascading -> cascalog (very short)Hadoop  > cascading -> cascalog (very short)
Hadoop > cascading -> cascalog (very short)Andrew Panfilov
 
Лекция 13. YARN
Лекция 13. YARNЛекция 13. YARN
Лекция 13. YARNTechnopark
 
Лекция 2. Основы Hadoop
Лекция 2. Основы HadoopЛекция 2. Основы Hadoop
Лекция 2. Основы HadoopTechnopark
 
Apache cassandra (rus)
Apache cassandra (rus)Apache cassandra (rus)
Apache cassandra (rus)Dmitriy Gutman
 
"YT — новая платформа распределённых вычислений". Максим Бабенко, Яндекс.
"YT — новая платформа распределённых вычислений". Максим Бабенко, Яндекс. "YT — новая платформа распределённых вычислений". Максим Бабенко, Яндекс.
"YT — новая платформа распределённых вычислений". Максим Бабенко, Яндекс. Yandex
 
NoSQL - World IT Planet, Saint Petersburg 2015
NoSQL - World IT Planet, Saint Petersburg 2015NoSQL - World IT Planet, Saint Petersburg 2015
NoSQL - World IT Planet, Saint Petersburg 2015Shamim bhuiyan
 
Последние новости постгреса с PGCon / О.Бартунов, А.Коротков, Ф.Сигаев (Postg...
Последние новости постгреса с PGCon / О.Бартунов, А.Коротков, Ф.Сигаев (Postg...Последние новости постгреса с PGCon / О.Бартунов, А.Коротков, Ф.Сигаев (Postg...
Последние новости постгреса с PGCon / О.Бартунов, А.Коротков, Ф.Сигаев (Postg...Ontico
 
MongoDB в продакшен - миф или реальность?
MongoDB в продакшен - миф или реальность?MongoDB в продакшен - миф или реальность?
MongoDB в продакшен - миф или реальность?Alexey Tokar
 

What's hot (20)

Лекция 10. Apache Mahout
Лекция 10. Apache MahoutЛекция 10. Apache Mahout
Лекция 10. Apache Mahout
 
Call of Postgres: Advanced Operations (part 4)
Call of Postgres: Advanced Operations (part 4)Call of Postgres: Advanced Operations (part 4)
Call of Postgres: Advanced Operations (part 4)
 
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Time series data in a relational database. TimescaleDB and PipelineDB extensi...Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
 
Константин Осипов (Mail.Ru)
Константин Осипов (Mail.Ru)Константин Осипов (Mail.Ru)
Константин Осипов (Mail.Ru)
 
Highload++ 2015
Highload++ 2015Highload++ 2015
Highload++ 2015
 
Bitrix clouds without_admins
Bitrix clouds without_adminsBitrix clouds without_admins
Bitrix clouds without_admins
 
Сага о кластере. Все что вы хотели знать про горизонтальное масштабирование в...
Сага о кластере. Все что вы хотели знать про горизонтальное масштабирование в...Сага о кластере. Все что вы хотели знать про горизонтальное масштабирование в...
Сага о кластере. Все что вы хотели знать про горизонтальное масштабирование в...
 
3rd Moscow cassandra meetup (Fast In-memory Analytics Over Cassandra Data )
3rd Moscow cassandra meetup (Fast In-memory Analytics Over Cassandra Data )3rd Moscow cassandra meetup (Fast In-memory Analytics Over Cassandra Data )
3rd Moscow cassandra meetup (Fast In-memory Analytics Over Cassandra Data )
 
Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"
Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"
Выбор NoSQL базы данных для вашего проекта: "Не в свои сани не садись"
 
Строим сервисы на базе Nginx и Tarantool / Василий Сошников, Андрей Дроздов (...
Строим сервисы на базе Nginx и Tarantool / Василий Сошников, Андрей Дроздов (...Строим сервисы на базе Nginx и Tarantool / Василий Сошников, Андрей Дроздов (...
Строим сервисы на базе Nginx и Tarantool / Василий Сошников, Андрей Дроздов (...
 
Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...
Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...
Защита данных и датацентров от катастроф. Подход Nutanix / Максим Шапошников ...
 
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
 
Hadoop > cascading -> cascalog (very short)
Hadoop  > cascading -> cascalog (very short)Hadoop  > cascading -> cascalog (very short)
Hadoop > cascading -> cascalog (very short)
 
Лекция 13. YARN
Лекция 13. YARNЛекция 13. YARN
Лекция 13. YARN
 
Лекция 2. Основы Hadoop
Лекция 2. Основы HadoopЛекция 2. Основы Hadoop
Лекция 2. Основы Hadoop
 
Apache cassandra (rus)
Apache cassandra (rus)Apache cassandra (rus)
Apache cassandra (rus)
 
"YT — новая платформа распределённых вычислений". Максим Бабенко, Яндекс.
"YT — новая платформа распределённых вычислений". Максим Бабенко, Яндекс. "YT — новая платформа распределённых вычислений". Максим Бабенко, Яндекс.
"YT — новая платформа распределённых вычислений". Максим Бабенко, Яндекс.
 
NoSQL - World IT Planet, Saint Petersburg 2015
NoSQL - World IT Planet, Saint Petersburg 2015NoSQL - World IT Planet, Saint Petersburg 2015
NoSQL - World IT Planet, Saint Petersburg 2015
 
Последние новости постгреса с PGCon / О.Бартунов, А.Коротков, Ф.Сигаев (Postg...
Последние новости постгреса с PGCon / О.Бартунов, А.Коротков, Ф.Сигаев (Postg...Последние новости постгреса с PGCon / О.Бартунов, А.Коротков, Ф.Сигаев (Postg...
Последние новости постгреса с PGCon / О.Бартунов, А.Коротков, Ф.Сигаев (Postg...
 
MongoDB в продакшен - миф или реальность?
MongoDB в продакшен - миф или реальность?MongoDB в продакшен - миф или реальность?
MongoDB в продакшен - миф или реальность?
 

Viewers also liked

Trabajo electronica circuito integrado
Trabajo electronica circuito integradoTrabajo electronica circuito integrado
Trabajo electronica circuito integradoManuel Ortiz Rojo
 
Forotex 2011 info eng
Forotex 2011   info engForotex 2011   info eng
Forotex 2011 info engcamtex
 
Taller 3 janina borja
Taller 3 janina borjaTaller 3 janina borja
Taller 3 janina borjajaninaborja7
 
Hemorragias de-la-segunda-mitad-del-embarazo-presentacion
Hemorragias de-la-segunda-mitad-del-embarazo-presentacionHemorragias de-la-segunda-mitad-del-embarazo-presentacion
Hemorragias de-la-segunda-mitad-del-embarazo-presentacionleetiilahr09
 
Как грабить корованы
Как грабить корованыКак грабить корованы
Как грабить корованыDotNetConf
 
Test labs 2016. Пренебрежение лучшими практиками тестирования
Test labs 2016. Пренебрежение лучшими практиками тестированияTest labs 2016. Пренебрежение лучшими практиками тестирования
Test labs 2016. Пренебрежение лучшими практиками тестированияSasha Soleev
 
J como-ves-la-sociedad-dentro-de-10-anos
J como-ves-la-sociedad-dentro-de-10-anosJ como-ves-la-sociedad-dentro-de-10-anos
J como-ves-la-sociedad-dentro-de-10-anosRicardo Calvo
 
DEV Labs 2016. Искусство быстрого старта
DEV Labs 2016. Искусство быстрого стартаDEV Labs 2016. Искусство быстрого старта
DEV Labs 2016. Искусство быстрого стартаSasha Soleev
 
Ficha de Funza - Agenda Ciudadana por la Transparencia
Ficha de Funza - Agenda Ciudadana por la TransparenciaFicha de Funza - Agenda Ciudadana por la Transparencia
Ficha de Funza - Agenda Ciudadana por la TransparenciaTransparenciaporColombia
 
«Microservices. Как правильно делать и когда применять?»
«Microservices. Как правильно делать и когда применять?»«Microservices. Как правильно делать и когда применять?»
«Microservices. Как правильно делать и когда применять?»DataArt
 

Viewers also liked (17)

Trabajo electronica circuito integrado
Trabajo electronica circuito integradoTrabajo electronica circuito integrado
Trabajo electronica circuito integrado
 
Ficha tcnica
Ficha tcnicaFicha tcnica
Ficha tcnica
 
ARBOL DE Daniel
ARBOL DE DanielARBOL DE Daniel
ARBOL DE Daniel
 
Seg.Elec.
Seg.Elec.Seg.Elec.
Seg.Elec.
 
Forotex 2011 info eng
Forotex 2011   info engForotex 2011   info eng
Forotex 2011 info eng
 
2derecho informatico
2derecho informatico2derecho informatico
2derecho informatico
 
Taller 3 janina borja
Taller 3 janina borjaTaller 3 janina borja
Taller 3 janina borja
 
Gootika Itaalias
Gootika ItaaliasGootika Itaalias
Gootika Itaalias
 
Hemorragias de-la-segunda-mitad-del-embarazo-presentacion
Hemorragias de-la-segunda-mitad-del-embarazo-presentacionHemorragias de-la-segunda-mitad-del-embarazo-presentacion
Hemorragias de-la-segunda-mitad-del-embarazo-presentacion
 
Как грабить корованы
Как грабить корованыКак грабить корованы
Как грабить корованы
 
Test labs 2016. Пренебрежение лучшими практиками тестирования
Test labs 2016. Пренебрежение лучшими практиками тестированияTest labs 2016. Пренебрежение лучшими практиками тестирования
Test labs 2016. Пренебрежение лучшими практиками тестирования
 
Hola
HolaHola
Hola
 
J como-ves-la-sociedad-dentro-de-10-anos
J como-ves-la-sociedad-dentro-de-10-anosJ como-ves-la-sociedad-dentro-de-10-anos
J como-ves-la-sociedad-dentro-de-10-anos
 
DEV Labs 2016. Искусство быстрого старта
DEV Labs 2016. Искусство быстрого стартаDEV Labs 2016. Искусство быстрого старта
DEV Labs 2016. Искусство быстрого старта
 
Distocias fetales
Distocias fetalesDistocias fetales
Distocias fetales
 
Ficha de Funza - Agenda Ciudadana por la Transparencia
Ficha de Funza - Agenda Ciudadana por la TransparenciaFicha de Funza - Agenda Ciudadana por la Transparencia
Ficha de Funza - Agenda Ciudadana por la Transparencia
 
«Microservices. Как правильно делать и когда применять?»
«Microservices. Как правильно делать и когда применять?»«Microservices. Как правильно делать и когда применять?»
«Microservices. Как правильно делать и когда применять?»
 

Similar to Делаем очередь поверх Кассандры

ObjectManager, или как работать с большим количеством объектов на карте, Мари...
ObjectManager, или как работать с большим количеством объектов на карте, Мари...ObjectManager, или как работать с большим количеством объектов на карте, Мари...
ObjectManager, или как работать с большим количеством объектов на карте, Мари...Ontico
 
Big data moscow meetup
Big data moscow meetup Big data moscow meetup
Big data moscow meetup Shamim bhuiyan
 
Длинная транзакция или когда размер имеет значение / Михаил Балаян (Odin — In...
Длинная транзакция или когда размер имеет значение / Михаил Балаян (Odin — In...Длинная транзакция или когда размер имеет значение / Михаил Балаян (Odin — In...
Длинная транзакция или когда размер имеет значение / Михаил Балаян (Odin — In...Ontico
 
SQL-ник DevDay. Рубцов. Новое в Percona Server и MariaDB в сравнении с MySQL 5.5
SQL-ник DevDay. Рубцов. Новое в Percona Server и MariaDB в сравнении с MySQL 5.5SQL-ник DevDay. Рубцов. Новое в Percona Server и MariaDB в сравнении с MySQL 5.5
SQL-ник DevDay. Рубцов. Новое в Percona Server и MariaDB в сравнении с MySQL 5.5DevDay
 
Параллельные и распределенные вычисления
Параллельные и распределенные вычисленияПараллельные и распределенные вычисления
Параллельные и распределенные вычисленияMATLAB
 
Call of Postgres: Advanced Operations (part 3)
Call of Postgres: Advanced Operations (part 3)Call of Postgres: Advanced Operations (part 3)
Call of Postgres: Advanced Operations (part 3)Alexey Lesovsky
 
Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...
Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...
Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...Ontico
 
Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...
Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...
Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...corehard_by
 
Как читать и интерпретировать вывод команды EXPLAIN
Как читать и интерпретировать вывод команды EXPLAINКак читать и интерпретировать вывод команды EXPLAIN
Как читать и интерпретировать вывод команды EXPLAINAlexey Ermakov
 
#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросы#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросыNikolay Samokhvalov
 
Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)
Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)
Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)Ontico
 
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)Ontico
 
Open Source SQL-базы данных вступили в эру миллионов запросов в секунду / Фед...
Open Source SQL-базы данных вступили в эру миллионов запросов в секунду / Фед...Open Source SQL-базы данных вступили в эру миллионов запросов в секунду / Фед...
Open Source SQL-базы данных вступили в эру миллионов запросов в секунду / Фед...Ontico
 
OpenSource SQL Databases Enter Millions Queries per Second Era
OpenSource SQL Databases Enter Millions Queries per Second EraOpenSource SQL Databases Enter Millions Queries per Second Era
OpenSource SQL Databases Enter Millions Queries per Second EraSveta Smirnova
 
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...Alexey Paznikov
 
Netmap (by luigi rizzo) простой и удобный opensource фреймворк для обработк...
Netmap (by luigi rizzo)   простой и удобный opensource фреймворк для обработк...Netmap (by luigi rizzo)   простой и удобный opensource фреймворк для обработк...
Netmap (by luigi rizzo) простой и удобный opensource фреймворк для обработк...Ontico
 
как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...
как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...
как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...rit2011
 

Similar to Делаем очередь поверх Кассандры (20)

ObjectManager, или как работать с большим количеством объектов на карте, Мари...
ObjectManager, или как работать с большим количеством объектов на карте, Мари...ObjectManager, или как работать с большим количеством объектов на карте, Мари...
ObjectManager, или как работать с большим количеством объектов на карте, Мари...
 
Big data moscow meetup
Big data moscow meetup Big data moscow meetup
Big data moscow meetup
 
Длинная транзакция или когда размер имеет значение / Михаил Балаян (Odin — In...
Длинная транзакция или когда размер имеет значение / Михаил Балаян (Odin — In...Длинная транзакция или когда размер имеет значение / Михаил Балаян (Odin — In...
Длинная транзакция или когда размер имеет значение / Михаил Балаян (Odin — In...
 
SQL-ник DevDay. Рубцов. Новое в Percona Server и MariaDB в сравнении с MySQL 5.5
SQL-ник DevDay. Рубцов. Новое в Percona Server и MariaDB в сравнении с MySQL 5.5SQL-ник DevDay. Рубцов. Новое в Percona Server и MariaDB в сравнении с MySQL 5.5
SQL-ник DevDay. Рубцов. Новое в Percona Server и MariaDB в сравнении с MySQL 5.5
 
Cassandra db
Cassandra dbCassandra db
Cassandra db
 
Параллельные и распределенные вычисления
Параллельные и распределенные вычисленияПараллельные и распределенные вычисления
Параллельные и распределенные вычисления
 
Scorex framework
Scorex frameworkScorex framework
Scorex framework
 
Apache spark
Apache sparkApache spark
Apache spark
 
Call of Postgres: Advanced Operations (part 3)
Call of Postgres: Advanced Operations (part 3)Call of Postgres: Advanced Operations (part 3)
Call of Postgres: Advanced Operations (part 3)
 
Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...
Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...
Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...
 
Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...
Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...
Модульность и управляемая многопоточность встраиваемых С++ приложений - трудн...
 
Как читать и интерпретировать вывод команды EXPLAIN
Как читать и интерпретировать вывод команды EXPLAINКак читать и интерпретировать вывод команды EXPLAIN
Как читать и интерпретировать вывод команды EXPLAIN
 
#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросы#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросы
 
Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)
Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)
Денормализованное хранение данных в PostgreSQL 9.2 (Александр Коротков)
 
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
 
Open Source SQL-базы данных вступили в эру миллионов запросов в секунду / Фед...
Open Source SQL-базы данных вступили в эру миллионов запросов в секунду / Фед...Open Source SQL-базы данных вступили в эру миллионов запросов в секунду / Фед...
Open Source SQL-базы данных вступили в эру миллионов запросов в секунду / Фед...
 
OpenSource SQL Databases Enter Millions Queries per Second Era
OpenSource SQL Databases Enter Millions Queries per Second EraOpenSource SQL Databases Enter Millions Queries per Second Era
OpenSource SQL Databases Enter Millions Queries per Second Era
 
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
 
Netmap (by luigi rizzo) простой и удобный opensource фреймворк для обработк...
Netmap (by luigi rizzo)   простой и удобный opensource фреймворк для обработк...Netmap (by luigi rizzo)   простой и удобный opensource фреймворк для обработк...
Netmap (by luigi rizzo) простой и удобный opensource фреймворк для обработк...
 
как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...
как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...
как написать масштабируемую баннерокрутилку. денис бирюков, артем гавриченков...
 

More from DotNetConf

Как анимировать тысячи объектов на карте и не подвесить браузер
Как анимировать тысячи объектов на карте и не подвесить браузерКак анимировать тысячи объектов на карте и не подвесить браузер
Как анимировать тысячи объектов на карте и не подвесить браузерDotNetConf
 
Микросервисы: взгляд сверху и в бок
Микросервисы: взгляд сверху и в бокМикросервисы: взгляд сверху и в бок
Микросервисы: взгляд сверху и в бокDotNetConf
 
Разработка надежных параллельных, распределенных приложений: быстро и дешево
Разработка надежных параллельных, распределенных приложений: быстро и дешевоРазработка надежных параллельных, распределенных приложений: быстро и дешево
Разработка надежных параллельных, распределенных приложений: быстро и дешевоDotNetConf
 
Как приручить реактивное программирование
Как приручить реактивное программированиеКак приручить реактивное программирование
Как приручить реактивное программированиеDotNetConf
 
К искусству записи пользовательских историй
К искусству записи пользовательских историйК искусству записи пользовательских историй
К искусству записи пользовательских историйDotNetConf
 
Как это будет: ASP.NET Core
Как это будет: ASP.NET CoreКак это будет: ASP.NET Core
Как это будет: ASP.NET CoreDotNetConf
 
Continuous Delivery для ASP.NET MVC проекта под Linux
Continuous Delivery для ASP.NET MVC проекта под LinuxContinuous Delivery для ASP.NET MVC проекта под Linux
Continuous Delivery для ASP.NET MVC проекта под LinuxDotNetConf
 
Кроссплатформенная библиотека для Android и iOS: за и против
Кроссплатформенная библиотека для Android и iOS: за и противКроссплатформенная библиотека для Android и iOS: за и против
Кроссплатформенная библиотека для Android и iOS: за и противDotNetConf
 
Быстрый бэкенд с parse.com
Быстрый бэкенд с parse.comБыстрый бэкенд с parse.com
Быстрый бэкенд с parse.comDotNetConf
 
Kotlin в production. Как и зачем?
Kotlin в production. Как и зачем?Kotlin в production. Как и зачем?
Kotlin в production. Как и зачем?DotNetConf
 
Как жить в согласии с SOLID?
Как жить в согласии с SOLID?Как жить в согласии с SOLID?
Как жить в согласии с SOLID?DotNetConf
 
Многопоточное программирование на C#, путевые заметки
Многопоточное программирование на C#, путевые заметкиМногопоточное программирование на C#, путевые заметки
Многопоточное программирование на C#, путевые заметкиDotNetConf
 
Платформа Apache Hadoop
Платформа Apache HadoopПлатформа Apache Hadoop
Платформа Apache HadoopDotNetConf
 
Робототехника для прикладных программистов
Робототехника для прикладных программистовРобототехника для прикладных программистов
Робототехника для прикладных программистовDotNetConf
 
Разработка Windows 8 приложений глазами WPF/Silverlight программиста
Разработка Windows 8 приложений глазами WPF/Silverlight программистаРазработка Windows 8 приложений глазами WPF/Silverlight программиста
Разработка Windows 8 приложений глазами WPF/Silverlight программистаDotNetConf
 
Inversion of Control в .NET
Inversion of Control в .NETInversion of Control в .NET
Inversion of Control в .NETDotNetConf
 
Введение в реактивный .NET
Введение в реактивный .NETВведение в реактивный .NET
Введение в реактивный .NETDotNetConf
 
Особенности передачи и обработки видео данных. Приправа из кодеков или с чем ...
Особенности передачи и обработки видео данных. Приправа из кодеков или с чем ...Особенности передачи и обработки видео данных. Приправа из кодеков или с чем ...
Особенности передачи и обработки видео данных. Приправа из кодеков или с чем ...DotNetConf
 
Машинное обучение на платформе .NET
Машинное обучение на платформе .NETМашинное обучение на платформе .NET
Машинное обучение на платформе .NETDotNetConf
 

More from DotNetConf (19)

Как анимировать тысячи объектов на карте и не подвесить браузер
Как анимировать тысячи объектов на карте и не подвесить браузерКак анимировать тысячи объектов на карте и не подвесить браузер
Как анимировать тысячи объектов на карте и не подвесить браузер
 
Микросервисы: взгляд сверху и в бок
Микросервисы: взгляд сверху и в бокМикросервисы: взгляд сверху и в бок
Микросервисы: взгляд сверху и в бок
 
Разработка надежных параллельных, распределенных приложений: быстро и дешево
Разработка надежных параллельных, распределенных приложений: быстро и дешевоРазработка надежных параллельных, распределенных приложений: быстро и дешево
Разработка надежных параллельных, распределенных приложений: быстро и дешево
 
Как приручить реактивное программирование
Как приручить реактивное программированиеКак приручить реактивное программирование
Как приручить реактивное программирование
 
К искусству записи пользовательских историй
К искусству записи пользовательских историйК искусству записи пользовательских историй
К искусству записи пользовательских историй
 
Как это будет: ASP.NET Core
Как это будет: ASP.NET CoreКак это будет: ASP.NET Core
Как это будет: ASP.NET Core
 
Continuous Delivery для ASP.NET MVC проекта под Linux
Continuous Delivery для ASP.NET MVC проекта под LinuxContinuous Delivery для ASP.NET MVC проекта под Linux
Continuous Delivery для ASP.NET MVC проекта под Linux
 
Кроссплатформенная библиотека для Android и iOS: за и против
Кроссплатформенная библиотека для Android и iOS: за и противКроссплатформенная библиотека для Android и iOS: за и против
Кроссплатформенная библиотека для Android и iOS: за и против
 
Быстрый бэкенд с parse.com
Быстрый бэкенд с parse.comБыстрый бэкенд с parse.com
Быстрый бэкенд с parse.com
 
Kotlin в production. Как и зачем?
Kotlin в production. Как и зачем?Kotlin в production. Как и зачем?
Kotlin в production. Как и зачем?
 
Как жить в согласии с SOLID?
Как жить в согласии с SOLID?Как жить в согласии с SOLID?
Как жить в согласии с SOLID?
 
Многопоточное программирование на C#, путевые заметки
Многопоточное программирование на C#, путевые заметкиМногопоточное программирование на C#, путевые заметки
Многопоточное программирование на C#, путевые заметки
 
Платформа Apache Hadoop
Платформа Apache HadoopПлатформа Apache Hadoop
Платформа Apache Hadoop
 
Робототехника для прикладных программистов
Робототехника для прикладных программистовРобототехника для прикладных программистов
Робототехника для прикладных программистов
 
Разработка Windows 8 приложений глазами WPF/Silverlight программиста
Разработка Windows 8 приложений глазами WPF/Silverlight программистаРазработка Windows 8 приложений глазами WPF/Silverlight программиста
Разработка Windows 8 приложений глазами WPF/Silverlight программиста
 
Inversion of Control в .NET
Inversion of Control в .NETInversion of Control в .NET
Inversion of Control в .NET
 
Введение в реактивный .NET
Введение в реактивный .NETВведение в реактивный .NET
Введение в реактивный .NET
 
Особенности передачи и обработки видео данных. Приправа из кодеков или с чем ...
Особенности передачи и обработки видео данных. Приправа из кодеков или с чем ...Особенности передачи и обработки видео данных. Приправа из кодеков или с чем ...
Особенности передачи и обработки видео данных. Приправа из кодеков или с чем ...
 
Машинное обучение на платформе .NET
Машинное обучение на платформе .NETМашинное обучение на платформе .NET
Машинное обучение на платформе .NET
 

Делаем очередь поверх Кассандры

  • 1. Делаем очередь поверх Кассандры Максим Кирюшкин telecan.ru 12-я конференция .NET разработчиков 15 мая 2016 dotnetconf.ru
  • 3. 3 Постановка задачи • Множество источников сообщений • Многоступенчатая обработка в реальном времени • Длительное хранение • Выдача данных по запросу • Подписка сторонних клиентов на события • Высокая надёжность
  • 4. 4 Варианты решения Очередь: • RabbitMq • ActiveMQ Apollo • Kafka Хранение: • SQL • NoSQL
  • 5. 5 Зачем искать альтернативы? • Очереди удаляют сообщения после обработки • Гибкие правила обработки – сложно • Повторная обработка => повторное добавление в очередь • Требуется очередь + хранение – иметь две системы накладно • Лишние операции копирования
  • 6. 6 Несколько слов про Кассандру RowKey: { SuperColumnKey: { ColumKey: Value } } Децентрализованная база (модель BigTable) с настраиваемой целостностью для чтения и записи.
  • 7. 7 Общая идея очереди в Кассандре • Wide rows • Обработка в один или несколько потоков • Помечаем обрабатываемые сообщения • Результат в той же или отдельной таблице
  • 8. 8 Очереди в Кассандре – антипаттерн • Cassandra создана для хранения • Выборка с условием не предусмотрена • Удаление – сложная задача для распределённого хранилища • Нет системы подписки на события (временно)
  • 9. 9 Решение проблемы с удалением Использовать отложенное удаление (TTL) INSERT INTO tab (rkey, clkey, val) VALUES ('rawhash', 'cluster', 42) USING TTL 86400; UPDATE tab USING TTL 86400 SET val=42 WHERE rkey='some' AND clkey='any';
  • 10. 10 Полезная вещь: транзакции INSERT INTO rawdata (row_date, moment, handled, message) VALUES ('2016-05-15', '2016-05-15 11:23:00', 0, 'message') IF NOT EXISTS; UPDATE rawdata SET handled=2 WHERE row_date='2016-05-15' AND moment='2016-05-15 11:23:00' IF handled=1; [applied] true [applied] | raw_date | moment | handled | message false | 2016-05-15 | '2016-05-15 11:23:00' | 0 | message
  • 11. 11 Общая идея очереди в Кассандре • Wide rows • Обработка в один или несколько потоков • Помечаем обрабатываемые сообщения • Результат в той же или отдельной таблице
  • 12. 12 Наполнение с переменной нагрузкой CREATE TABLE IF NOT EXISTS rawdata ( row_date date, -- дата, определяющая строку, yyyy-mm-dd moment timeUUID, -- момент поступления в систему, идентификатор handled tinyint, -- 0 - unhandled, 1 - handling, 2 - handled, 3... – error message blob, -- данные пакета PRIMARY KEY (row_date, moment) ) WITH CLUSTERING ORDER BY (moment ASC);
  • 13. 13 Наполнение с переменной нагрузкой CREATE TABLE IF NOT EXISTS rawdata ( row_date date, -- дата, определяющая строку, yyyy-mm-dd row_sec int, -- начальная секунда строки, [0..86400) moment timeUUID, -- момент поступления в систему, идентификатор handled tinyint, -- 0 - unhandled, 1 - handling, 2 - handled, 3... - error message blob, -- данные пакета PRIMARY KEY ((row_date, row_sec), moment) ) WITH CLUSTERING ORDER BY (moment ASC); CREATE TABLE IF NOT EXISTS rawdata_meta_rows ( row_date date, -- дата строки row_sec int, -- начальная секунда строки, [0..86400) PRIMARY KEY ((row_date), row_sec) ) WITH CLUSTERING ORDER BY (row_sec DESC); CREATE TABLE IF NOT EXISTS rawdata_meta ( mkey text, -- варианты: csec (current second), nsec (next second) msubkey text, -- ключ ячейки в строке (csec: yyyy-mm-dd) mval text, -- значение PRIMARY KEY ((mkey), msubkey) ); хранит все ключи партиций (строк) из rawdata кэш значений переменных
  • 14. 14 Наполнение с переменной нагрузкой curS := ТекущаяСекундаДня( ) или 0 nextS := СекундаПерехода( ) ЦИКЛ добавления сообщений msg := СформироватьСообщение( ) ЕСЛИ сработал таймер ТОГДА nextS := СекундаПерехода( ) ЕСЛИ ТекущееВремя( ) >= nextS ТОГДА curS := nextS ЗаписатьСообщение(msg, curS)
  • 15. 15 Наполнение с переменной нагрузкой ЦИКЛ проверки curBlock := НаполняемыйБлок( ) cnt := КоличествоЗаписей(curBlock) ЕСЛИ cnt > N ТОГДА nextS := ТекущееВремя( ) + K ЗадатьСекундуПерехода(nextS) УснутьНа(Z) // Z <= K
  • 16. 16 Наполнение с переменной нагрузкой Если не был задан переход nextS Если был задан переход и посчитали новый INSERT INTO rawdata_meta (mkey, msubkey, mval) VALUES ('nsec', '2016-05-15', nextS) IF NOT EXISTS USING TTL 86400; UPDATE rawdata_meta USING TTL 86400 SET mval=nextS WHERE mkey='nsec' AND msubkey='2016-05-15‘ IF mval=oldNextS;
  • 18. 18 Обработка сообщений Однопоточная: • Любой язык выборка –> обработка –> сохранение Многопоточная: • Hadoop (MapReduce) • Apache Spark • Другое решение
  • 19. 19 Однопоточная обработка: выборка 1. Определение ключа партиции и кластера по rawdata_meta_rows 2. Выборка из конкретной строки с условием и сортировкой 3. Пагинация (LIMIT, OFFSET) CREATE TABLE IF NOT EXISTS rawdata ( row_date date, -- дата, определяющая строку, yyyy-mm-dd row_sec int, -- начальная секунда строки, [0..86400) moment timeUUID, -- момент поступления в систему, идентификатор handled tinyint, -- 0 - unhandled, 1 - handling, 2 - handled, 3... - error message blob, -- данные пакета PRIMARY KEY ((row_date, row_sec), moment) ) WITH CLUSTERING ORDER BY (moment ASC);
  • 20. 20 Неочевидные проблемы выборки Сложности прямых запросов: • Сортировка доступна только по ключу • Нет понятия OFFSET • Нельзя просто взять и применить условия SELECT * FROM rawdata WHERE row_date='2016-05-10‘ AND row_sec=0 AND handled=0; No supported secondary index found for the non primary key columns restrictions
  • 21. 21 Неочевидные проблемы выборки Можно применить индексы, но индекс по флагу не эффективен Each value in the index becomes a single row in the index, resulting in a huge row for all the false values, for example. Indexing a multitude of indexed columns having foo = true and foo = false is not useful.
  • 22. 22 Неочевидные проблемы выборки Есть в Кассандре materialized views, но их функционал пока слишком слаб: нет условий выборки, сортировки и т.д. CREATE MATERIALIZED VIEW rawdata_unhandled AS SELECT row_date, row_sec, handled, moment, message FROM rawdata WHERE row_date IS NOT NULL AND row_sec IS NOT NULL AND moment IS NOT NULL AND handled IS NOT NULL PRIMARY KEY ((row_date, row_sec), handled, moment);
  • 23. 23 Решение проблем с выборкой Внешнее приложение должно взять полный контроль на себя и точно знать, что запрашивать SELECT row_date, row_sec, moment, handled FROM rawdata WHERE row_date='2016-05-15' AND row_sec=0 LIMIT 100; row_date | row_sec | moment | handled ... 2016-05-15 | 0 | d6686343-1804-11e6-bebe-87c17418206b | 0 SELECT row_date, row_sec, moment, handled FROM rawdata WHERE row_date='2016-05-15' AND row_sec=0 AND moment > d6686343-1804-11e6-bebe-87c17418206b LIMIT 100;
  • 24. 24 Многопоточная обработка Hadoop, Apache Spark: • Отлично подходят для Big Data Analytics • Вся обработка через запуск обработчика на одно или группу сообщений • Возврат в очередь, смена последовательности, отложенная обработка – затруднены • Много копирований в процессе разделения и передачи сообщений
  • 25. 25 Многопоточная обработка • Простой вариант – сколько угодно потоков, читаем несколько записей вперёд, ставим флаг обработки, обрабатываем, ставим флаг готовности • Сложный вариант – потоки договариваются между собой, кто какие записи берёт; разбивка по миллисекундам • Сложный вариант улучшенный – очередь изначально разбивается на уровне ключа, потоки оповещают друг друга о вхождении в работу
  • 26. 26 Оповещение о событиях • Триггеры • CDC (Change Data Capture) • Внешний источник оповещений CREATE TRIGGER IF NOT EXISTS trigger_name ON table_name USING 'java_class';
  • 27. 27 Когда Кассандра не подходит • Низкая нагрузка и малое количество узлов системы • Сохранение сообщений не требуется • Необходима гибкая подписка и система оповещения • Привычность решения важнее производительности и отказоустойчивости
  • 28. 28 Когда решение имеет смысл • Очень высокая нагрузка • Децентрализованная распределённая среда • Сообщения сохраняются после обработки • Необходима повторная обработка сообщений • Сложная зависимая обработка (например, цепочки сообщений)
  • 29. 29 Спасибо за внимание Максим Кирюшкин catch@mail.ru telecan.ru