HighLoad++ 2017
Зал «Дели + Калькутта», 7 ноября, 14:00
Тезисы:
http://www.highload.ru/2017/abstracts/3031.html
Apache Kafka - довольно популярная опенсорс-платформа для обработки потоков сообщений. Абстракция распределенного лога, лежащая в основе Kafka, дает возможность использовать ее в качестве системы очередей, но при этом дает некоторые очень полезные преимущества, недоступные даже решениям ESB-уровня.
...
26. 26Kafka: The Definitive Guide by Neha Narkhede, Gwen Shapira, and Todd Palino (O’Reilly).
Распределенный лог
27. Kafka .NET Client
•Обертка над C-библиотекой librdkafka
•Реализовано подмножество API (open source)
•Использует managed и unmanaged память и
потоки
•xplat, .NET Core
27
29. var consumer = new Consumer<Null, string>(
config, new NullDeserializer(), new StringDeserializer(Encoding.UTF8));
29
30. var consumer = new Consumer<Null, string>(
config, new NullDeserializer(), new StringDeserializer(Encoding.UTF8));
var messages = new List<Message<Null, string>>();
var isEof = false;
30
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;
31
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);
32
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));
}
33
34. 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
36. var consumerWrapper = new ConsumerWrapper(brokerEndpoints, groupId);
while (!cancellationToken.IsCancellationRequested)
{
var messages = consumerWrapper.Consume(
topics, batchSize, cancellationToken);
}
36
37. var consumerWrapper = new ConsumerWrapper(brokerEndpoints, groupId);
while (!cancellationToken.IsCancellationRequested)
{
var messages = consumerWrapper.Consume(
topics, batchSize, cancellationToken);
}
37
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}'");
}
}
38
39. 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);
}
}
87. Краткие итоги
•Микросервисы не появляются сами по себе
•Управление изменениями в приложении
значительно усложняется
•Apache Kafka упрощает асинхронные
взаимодействия
87
88. Краткие итоги
•Микросервисы не появляются сами по себе
•Управление изменениями в приложении
значительно усложняется
•Apache Kafka упрощает асинхронные
взаимодействия
•Реактивный подход убирает границы между
компонентами приложения
88