SlideShare a Scribd company logo
1 of 90
Download to read offline
Реактивные микросервисы
с Apache Kafka
Денис Иванов
denis@ivanovdenis.ru
@denisivanov
1
Обо мне
2
Код и презентация
https://github.com/denisivan0v/highload-2017
3
План
4
5
Терминология
6
Терминология
7
Откуда берутся микросервисы?
8
Откуда берутся микросервисы?
Advertising Management System
в
9
10
Storage API
S3 Storage
High-level API
Frontend App
Откуда берутся микросервисы?
11
Storage API
S3 Storage
High-level API
Frontend App
Откуда берутся микросервисы?
Challenges
•Синхронное/асинхронное взаимодействие
компонентов
12
Challenges
•Синхронное/асинхронное взаимодействие
компонентов
•Гарантированная доставка данных с
минимальными задержками
13
Challenges
•Синхронное/асинхронное взаимодействие
компонентов
•Гарантированная доставка данных с
минимальными задержками
•Распределенные изменения и согласованность
14
Challenges
•Синхронное/асинхронное взаимодействие
компонентов
•Гарантированная доставка данных с
минимальными задержками
•Распределенные изменения и согласованность
15
Распределенные изменения
Распределенные изменения
•Блокирующие
•Неблокирующие (отложенные)
17
Распределенные изменения
18
Storage API
High-level API
S3 Storage
Распределенные изменения
19
Storage API
High-level API
S3 Storage
Распределенные изменения
20
Storage API
High-level API
S3 Storage
Распределенные изменения
21
Storage API
High-level API
S3 Storage
Распределенные изменения
22
Storage API
High-level API
S3 Storage
Распределенные изменения
23
Storage API
High-level API
S3 Storage
24
/
Background workers
Frontend App
REST API
Storage
Фоновые процессы
/
25
26Kafka: The Definitive Guide by Neha Narkhede, Gwen Shapira, and Todd Palino (O’Reilly).
Распределенный лог
Kafka .NET Client
•Обертка над C-библиотекой librdkafka
•Реализовано подмножество API (open source)
•Использует managed и unmanaged память и
потоки
•xplat, .NET Core
27
Batched Kafka Consumer Wrapper
28
var consumer = new Consumer<Null, string>(
config, new NullDeserializer(), new StringDeserializer(Encoding.UTF8));
29
var consumer = new Consumer<Null, string>(
config, new NullDeserializer(), new StringDeserializer(Encoding.UTF8));
var messages = new List<Message<Null, string>>();
var isEof = false;
30
var consumer = new Consumer<Null, string>(
config, new NullDeserializer(), new StringDeserializer(Encoding.UTF8));
var messages = new List<Message<Null, string>>();
var isEof = false;
void OnMessage(object sender, Message<Null, string> message) =>
messages.Add(message);
void OnEof(object sender, TopicPartitionOffset offset) => isEof = true;
31
var consumer = new Consumer<Null, string>(
config, new NullDeserializer(), new StringDeserializer(Encoding.UTF8));
var messages = new List<Message<Null, string>>();
var isEof = false;
void OnMessage(object sender, Message<Null, string> message) =>
messages.Add(message);
void OnEof(object sender, TopicPartitionOffset offset) => isEof = true;
consumer.OnMessage += OnMessage;
consumer.OnPartitionEOF += OnEof;
consumer.Subscribe(topics);
32
var consumer = new Consumer<Null, string>(
config, new NullDeserializer(), new StringDeserializer(Encoding.UTF8));
var messages = new List<Message<Null, string>>();
var isEof = false;
void OnMessage(object sender, Message<Null, string> message) =>
messages.Add(message);
void OnEof(object sender, TopicPartitionOffset offset) => isEof = true;
consumer.OnMessage += OnMessage;
consumer.OnPartitionEOF += OnEof;
consumer.Subscribe(topics);
while (messages.Count < batchSize && !isEof &&
!cancellationToken.IsCancellationRequested)
{
consumer.Poll(TimeSpan.FromMilliseconds(100));
}
33
var consumer = new Consumer<Null, string>(
config, new NullDeserializer(), new StringDeserializer(Encoding.UTF8));
var messages = new List<Message<Null, string>>();
var isEof = false;
void OnMessage(object sender, Message<Null, string> message) =>
messages.Add(message);
void OnEof(object sender, TopicPartitionOffset offset) => isEof = true;
consumer.OnMessage += OnMessage;
consumer.OnPartitionEOF += OnEof;
consumer.Subscribe(topics);
while (messages.Count < batchSize && !isEof &&
!cancellationToken.IsCancellationRequested)
{
consumer.Poll(TimeSpan.FromMilliseconds(100));
}
consumer.Unsubscribe(topics);
34
var consumerWrapper = new ConsumerWrapper(brokerEndpoints, groupId);
35
var consumerWrapper = new ConsumerWrapper(brokerEndpoints, groupId);
while (!cancellationToken.IsCancellationRequested)
{
var messages = consumerWrapper.Consume(
topics, batchSize, cancellationToken);
}
36
var consumerWrapper = new ConsumerWrapper(brokerEndpoints, groupId);
while (!cancellationToken.IsCancellationRequested)
{
var messages = consumerWrapper.Consume(
topics, batchSize, cancellationToken);
}
37
var consumerWrapper = new ConsumerWrapper(brokerEndpoints, groupId);
while (!cancellationToken.IsCancellationRequested)
{
var messages = consumerWrapper.Consume(
topics, batchSize, cancellationToken);
foreach (var message in messages)
{
Console.WriteLine(
$"{message.Topic}/{message.Partition} @" +
$"{message.Offset}: '{message.Value}'");
}
}
38
var consumerWrapper = new ConsumerWrapper(brokerEndpoints, groupId);
while (!cancellationToken.IsCancellationRequested)
{
var messages = consumerWrapper.Consume(
topics, batchSize, cancellationToken);
foreach (var message in messages)
{
Console.WriteLine(
$"{message.Topic}/{message.Partition} @" +
$"{message.Offset}: '{message.Value}'");
await consumerWrapper.CommitAsync(message);
}
}
DEMO:
Kafka + Docker + .NET Core
40
More challenges
•Легко написать неправильно
41
More challenges
•Легко написать неправильно
•Частые перебалансировки consumer group
42
More challenges
•Легко написать неправильно
•Частые перебалансировки consumer group
•Управление распределенными consumer-ами
43
More challenges
•Легко написать неправильно
•Частые перебалансировки consumer group
•Управление распределенными consumer-ами
•Задержки, синхронизация, утилизация ресурсов
44
45
Реактивные приложения
46
https://www.reactivemanifesto.org/
http://reactivex.io/
Реактивные приложения
•Событийно-ориентированные
47
https://www.reactivemanifesto.org/
http://reactivex.io/
Реактивные приложения
•Событийно-ориентированные
•Масштабируемые
48
https://www.reactivemanifesto.org/
http://reactivex.io/
Реактивные приложения
•Событийно-ориентированные
•Масштабируемые
•Отказоустойчивые
49
https://www.reactivemanifesto.org/
http://reactivex.io/
Реактивные приложения
•Событийно-ориентированные
•Масштабируемые
•Отказоустойчивые
•Отзывчивые
50
https://www.reactivemanifesto.org/
http://reactivex.io/
Pull-модель
51
public interface IEnumerable
{
IEnumerator GetEnumerator();
}
public interface IEnumerator
{
bool MoveNext();
object Current { get; }
void Reset();
}
Push-модель
52
public interface IObservable<out T>
{
IDisposable Subscribe(IObserver<T> observer);
}
public interface IObserver<in T>
{
void OnCompleted();
void OnError(Exception error);
void OnNext(T value);
}
…
void OnMessage(object sender, Message<Null, string> message) =>
messages.Add(message);
void OnEof(object sender, TopicPartitionOffset offset) => isEof = true;
consumer.OnMessage += OnMessage;
consumer.OnPartitionEOF += OnEof;
…
53
IEnumerable<string> topics;
var observable =
Observable.FromEventPattern<Message<Null, string>>(
x =>
{
consumer.OnMessage += x;
consumer.Subscribe(topics);
},
x =>
{
consumer.Unsubscribe();
consumer.OnMessage -= x;
})
.Select(x => x.EventArgs);
54
IEnumerable<string> topics;
var observable =
Observable.FromEventPattern<Message<Null, string>>(
x =>
{
consumer.OnMessage += x;
consumer.Subscribe(topics);
},
x =>
{
consumer.Unsubscribe();
consumer.OnMessage -= x;
})
.Select(x => x.EventArgs);
55
IEnumerable<string> topics;
var observable =
Observable.FromEventPattern<Message<Null, string>>(
x =>
{
consumer.OnMessage += x;
consumer.Subscribe(topics);
},
x =>
{
consumer.Unsubscribe();
consumer.OnMessage -= x;
})
.Select(x => x.EventArgs);
56
Rx Kafka Consumer Wrapper
57
var observable = consumerWrapper.Consume(token);
58
var observable = consumerWrapper.Consume(token);
59
var observable = consumerWrapper.Consume(token);
var subscription = observable
.Buffer(batchSize)
.Subscribe(
messages =>
{
foreach (var message in messages)
{
Console.WriteLine(message.Value);
consumerWrapper.CommitAsync(message)
.GetAwaiter().GetResult();
}
});
60
var observable = consumerWrapper.Consume(token);
var subscription = observable
.Buffer(batchSize)
.Subscribe(
messages =>
{
foreach (var message in messages)
{
Console.WriteLine(message.Value);
consumerWrapper.CommitAsync(message)
.GetAwaiter().GetResult();
}
});
61
var observable = consumerWrapper.Consume(token);
var subscription = observable
.Buffer(batchSize)
.Subscribe(
messages =>
{
foreach (var message in messages)
{
Console.WriteLine(message.Value);
consumerWrapper.CommitAsync(message)
.GetAwaiter().GetResult();
}
});
62
DEMO: Kafka + Rx
63
64
Распределенные изменения
65
Распределенные изменения
66
Storage API
High-level API
S3 Storage
Распределенные изменения
67
Storage API
High-level API
S3 Storage
Распределенные изменения
68
Storage API
High-level API
S3 Storage
Распределенные изменения
69
Storage API
High-level API
S3 Storage
Распределенные изменения
70
Storage API
High-level API
S3 Storage
Распределенные изменения
Неизменяемость (immutability)
71
Распределенные изменения
Неизменяемость (immutability)
•Версионирование данных
72
Распределенные изменения
Неизменяемость (immutability)
•Версионирование данных
•Данные + события
73
Распределенные изменения
Неизменяемость (immutability)
•Версионирование данных
•Данные + события
•Данные = события (event sourcing)
74
75
Storage API
High-level API
S3 Storage
76
Storage API
High-level API
S3 Storage
77
Storage API
High-level API
S3 Storage
Неблокирующие изменения
78
Неблокирующие изменения
79
Storage API
High-level API
S3 Storage
Неблокирующие изменения
80
Storage API
High-level API
StorageQueue
Неблокирующие изменения
81
Worker
StorageQueue
/
Неблокирующие изменения
82
StorageQueue
Worker /
Неблокирующие изменения
83
StorageQueue
Worker /
Краткие итоги
84
Краткие итоги
•Микросервисы не появляются сами по себе
85
Краткие итоги
•Микросервисы не появляются сами по себе
•Управление изменениями в приложении
значительно усложняется
86
Краткие итоги
•Микросервисы не появляются сами по себе
•Управление изменениями в приложении
значительно усложняется
•Apache Kafka упрощает асинхронные
взаимодействия
87
Краткие итоги
•Микросервисы не появляются сами по себе
•Управление изменениями в приложении
значительно усложняется
•Apache Kafka упрощает асинхронные
взаимодействия
•Реактивный подход убирает границы между
компонентами приложения
88
Полезные ссылки
https://github.com/denisivan0v/highload-2017
https://github.com/2gis/nuclear-vstore
89
Спасибо! Вопросы?
Денис Иванов
@denisivanov
denis@ivanovdenis.ru
https://github.com/denisivan0v
90

More Related Content

Similar to Реактивные микросервисы с Apache Kafka / Денис Иванов (2ГИС)

PVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийPVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийTatyanazaxarova
 
Как приручить реактивное программирование в XAML приложениях
Как приручить реактивное программирование в XAML приложенияхКак приручить реактивное программирование в XAML приложениях
Как приручить реактивное программирование в XAML приложенияхDenis Tsvettsih
 
AgileDays 2016. Внедрение Agile в Банке
AgileDays 2016. Внедрение Agile в БанкеAgileDays 2016. Внедрение Agile в Банке
AgileDays 2016. Внедрение Agile в БанкеМихаил Кононов
 
Владимир Еремин. Extending Openstack. PyCon Belarus 2015
Владимир Еремин. Extending Openstack. PyCon Belarus 2015Владимир Еремин. Extending Openstack. PyCon Belarus 2015
Владимир Еремин. Extending Openstack. PyCon Belarus 2015Alina Dolgikh
 
Rambler.iOS #2: Практика применения BaaS в мобильных сервисах
Rambler.iOS #2: Практика применения BaaS в мобильных сервисахRambler.iOS #2: Практика применения BaaS в мобильных сервисах
Rambler.iOS #2: Практика применения BaaS в мобильных сервисахRAMBLER&Co
 
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)AvitoTech
 
C# Desktop. Занятие 16.
C# Desktop. Занятие 16.C# Desktop. Занятие 16.
C# Desktop. Занятие 16.Igor Shkulipa
 
Философия Application Security
Философия Application SecurityФилософия Application Security
Философия Application SecurityVladimir Kochetkov
 
Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС
Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИСРеактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС
Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС2ГИС Технологии
 
Реактивный двигатель вашего Android приложения
Реактивный двигатель вашего Android приложенияРеактивный двигатель вашего Android приложения
Реактивный двигатель вашего Android приложенияMatvey Malkov
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке СиPositive Development User Group
 
Formal verification of C code
Formal verification of C codeFormal verification of C code
Formal verification of C codeDenis Efremov
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке СиPositive Hack Days
 
Reactive Extensions
Reactive ExtensionsReactive Extensions
Reactive ExtensionsGetDev.NET
 
Микросервисная архитектура на базе CoreOS и Kubernetes
Микросервисная архитектура на базе CoreOS и KubernetesМикросервисная архитектура на базе CoreOS и Kubernetes
Микросервисная архитектура на базе CoreOS и KubernetesDenis Izmaylov
 
Денис Иванов
Денис ИвановДенис Иванов
Денис ИвановCodeFest
 
Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»MskDotNet Community
 
Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»Yulia Tsisyk
 
Как приручить реактивное программирование
Как приручить реактивное программированиеКак приручить реактивное программирование
Как приручить реактивное программированиеDenis Tsvettsih
 

Similar to Реактивные микросервисы с Apache Kafka / Денис Иванов (2ГИС) (20)

PVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийPVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложений
 
Как приручить реактивное программирование в XAML приложениях
Как приручить реактивное программирование в XAML приложенияхКак приручить реактивное программирование в XAML приложениях
Как приручить реактивное программирование в XAML приложениях
 
AgileDays 2016. Внедрение Agile в Банке
AgileDays 2016. Внедрение Agile в БанкеAgileDays 2016. Внедрение Agile в Банке
AgileDays 2016. Внедрение Agile в Банке
 
Владимир Еремин. Extending Openstack. PyCon Belarus 2015
Владимир Еремин. Extending Openstack. PyCon Belarus 2015Владимир Еремин. Extending Openstack. PyCon Belarus 2015
Владимир Еремин. Extending Openstack. PyCon Belarus 2015
 
Rambler.iOS #2: Практика применения BaaS в мобильных сервисах
Rambler.iOS #2: Практика применения BaaS в мобильных сервисахRambler.iOS #2: Практика применения BaaS в мобильных сервисах
Rambler.iOS #2: Практика применения BaaS в мобильных сервисах
 
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
Rempl — крутая платформа для крутых инструментов - Роман Дворнов (Avito)
 
C# Desktop. Занятие 16.
C# Desktop. Занятие 16.C# Desktop. Занятие 16.
C# Desktop. Занятие 16.
 
Философия Application Security
Философия Application SecurityФилософия Application Security
Философия Application Security
 
Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС
Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИСРеактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС
Реактивный двигатель для вашего Android-приложения — Матвей Мальков, 2ГИС
 
Реактивный двигатель вашего Android приложения
Реактивный двигатель вашего Android приложенияРеактивный двигатель вашего Android приложения
Реактивный двигатель вашего Android приложения
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке Си
 
Formal verification of C code
Formal verification of C codeFormal verification of C code
Formal verification of C code
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке Си
 
Reactive Extensions
Reactive ExtensionsReactive Extensions
Reactive Extensions
 
Микросервисная архитектура на базе CoreOS и Kubernetes
Микросервисная архитектура на базе CoreOS и KubernetesМикросервисная архитектура на базе CoreOS и Kubernetes
Микросервисная архитектура на базе CoreOS и Kubernetes
 
Денис Иванов
Денис ИвановДенис Иванов
Денис Иванов
 
Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»
 
Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»
 
Rx
RxRx
Rx
 
Как приручить реактивное программирование
Как приручить реактивное программированиеКак приручить реактивное программирование
Как приручить реактивное программирование
 

More from Ontico

One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...Ontico
 
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Ontico
 
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Ontico
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Ontico
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Ontico
 
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)Ontico
 
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Ontico
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Ontico
 
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)Ontico
 
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)Ontico
 
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Ontico
 
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Ontico
 
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Ontico
 
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Ontico
 
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)Ontico
 
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Ontico
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Ontico
 
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...Ontico
 
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Ontico
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Ontico
 

More from Ontico (20)

One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
 
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
 
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
 
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
 
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
 
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
 
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
 
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
 
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
 
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
 
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
 
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
 
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
 
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
 
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
 

Реактивные микросервисы с Apache Kafka / Денис Иванов (2ГИС)