SlideShare a Scribd company logo
CQRS на практике.
В поиске точки
масштабирования и новых
метафор
Александр Бындю
ByndyuSoft
2
Обо мне
1. Владелец компании ByndyuSoft
http://byndyusoft.com
2. Консультант по вопросам разработки приложений и организации работы IT
компаний
3. Внештатный сотрудник Академии АйТи
4. Технический блог http://blog.byndyu.ru
5. Преподаю в ЮУрГУ и ЧелГУ
6. Тренер на AgileCamp
7. Организую конференции .NET-разработчиков
http://dotnetconf.ru
8. Веду группу по проблемам разработки приложений
https://groups.google.com/forum/?hl=ru&fromgroups#!forum/dotnetconf
3
План
1. Основная теория CQRS
2. Эволюция кода
3. Эволюция архитектуры
4. Event Sourcing
5. Ограничения
6. Примеры реализации и подходы
4
1. Основная
теория CQRS
5
Bertrand Meyer
«Object Oriented Software Construction»
1994 г.
6
Command-query separation (CQS)
Методы объекта нужно разделить на:
1. Queries: Возвращают результат, не
изменяя состояние объекта
2. Commands: Изменяют состояние, не
возвращая значение.
free of side
effects
7
Что значит Command?
Более корректно называть:
1. Modifiers
2. Mutators
8
public class User
{
public string Email { get; private set; }
public bool IsEmailValid(string email)
{
bool isMatch = Regex.IsMatch("email pattern", email);
if (isMatch)
{
Email = email;
}
return isMatch;
}
}
Query
Command
9
public class User
{
public string Email { get; private set; }
public bool IsEmailValid(string email)
{
return Regex.IsMatch("email pattern", email);
}
public void ChangeEmail(string email)
{
if (IsEmailValid(email) == false)
throw new ArgumentOutOfRangeException(email);
Email = email;
}
}
Query
Command
10
Приложение
База
данных
Presenter
UI
Domain Model
Validation
...
O
R
M
11
Command-query responsibility segregation
(CQRS)
Приложение
База
данных
Command
UI
Domain Model
Validation
...
Query Query Model
O
R
M
12
Command
• Изменяет состояние системы
• Контекст команды хранит нужные для ее
выполнения данные
• Ничего не возвращает
• Хорошо описывает предметную область
13
public class DeleteUserHandler : ICommandHandler<DeleteUser>
{
private readonly ISession session;
public DeleteUserHandler(ISession session)
{
this.session = session;
}
public void Execute(DeleteUser context)
{
session.Delete<User>(context.UserId);
}
}
14
Query
1. Не изменяет состояние системы
2. Контекст запроса хранит нужные для ее
выполнения данные (пейджинг, фильтры
и т.п.)
3. Возвращает результат
free of side
effects
15
public class FindUserByIdQuery : IQuery<FindById, User>
{
private readonly ISession session;
public FindUserByIdQuery(ISession session)
{
this.session = session;
}
public User Ask(FindById context)
{
return session.Query<User>()
.SingleOrDefault(x => x.Id == context.Id);
}
}
16
2. Эволюция кода
17
UI
Services/BusinessRules/Managers...
Repository
DB
18
Repository v1.0
public interface IRepository<TEntity>
{
void Create(TEntity entity);
TEntity Get(int id);
void Update(TEntity entity);
void Delete(TEntity entity);
}
19
Repository v2.0
Нужно больше методов
public class AccountRepository : IRepository<Account>
{
public IEnumerable<Account> GetActiveAccounts()
{
// ...
}
public void ChangeAccountAddress(int id, string newAddress)
{
// ...
}
public IEnumerable<Account> GetPremiumAccountsByManager()
{
// ...
20
Repository v2.0
Нужно больше зависимостей
public class AccountRepository : IRepository<Account>
{
public AccountRepository(
IPriceCalculator priceCalculator,
IMessageDispatcher messageDispatcher,
IEmailSender emailSender,
IDataContext dataContext,
IAwsProvider awsProvider,
ISphinxProvider sphinxProvider,
IMongoDbProvider mongoDbProvider
/* ... */)
{
21
Repository v3.0
Даешь IQueryable!
public class AccountRepository : IRepository<Account>
{
public IQueryable<Account> GetActiveAccounts()
{
// ...
}
public IQueryable<Account> GetPremiumAccountsByManager()
{
// ...
}
public Account GetAccountWithRoleInformation(int id)
{
// ...
}
22
Дублирование условий
1. session.Query<User>()
.Where(x => x.Activated);
2. session.Query<User>()
.Where(x => x.Activated &&
x.Balance > 0);
3. session.Query<User>()
.Where(x => x.Activated &&
x.Balance > 0 &&
...);
23
Дублирование подгрузок
1. session.Query<User>()
.Fetch(x => x.Bills);
2. session.Query<User>()
.Fetch(x => x.Bills)
.Fetch(x => x.Roles);
3. session.Query<User>()
.Fetch(x => x.Bills)
.Fetch(x => x.Roles)
.Fetch(...);
24
Repository v4.0
Предикаты условий выборки
public class ActiveAccountSpecification : ISpecification<Account>
{
public Func<Account, bool> IsSatisfiedBy()
{
return x => x.IsActive && x.Credit > 0;
}
}
25
Repository v4.0
Стратегии подгрузки в отдельные классы
public class AccountCommentFetchStrategy : IFetchStrategy<Account>
{
public Action<Account> Apply()
{
return x => x.Posts.Select(p => p.Comments);
}
}
26
Repository v4.0
public class AccountRepository : IRepository<Account>
{
public IEnumerable<Account> GetAccounts(
IFetchStrategy<Account>[] fetchStrategies,
ISpecification<Account>[] specifications)
{
// ...
}
Еще круче собирать их через
IoC-контейнер по конвенции
27
Repository v5.0
Для изменения состояния системы работаем
с корнями агрегации.
Выборка данных для отображения собирает
DTO из разных частей данных.
28
Repository v5.0
public class AccountRepository : IRepository<Account>
{
public IEnumerable<Account> GetActiveAccounts()
{
// ...
}
public void ChangeAccountAddress(int id, string newAddress)
{
// ...
}
public IEnumerable<Account> GetPremiumAccountsByManager()
{
// ...
}
ChangeAccountAddressCommand
GetActiveAccountsQuery
GetPremiumAccountsByManagerQuery
29
public class FindPremiumAccountsByManagerQuery :
IQuery<FindPremiumAccountsByManager, User>
{
private readonly ISession session;
public FindPremiumAccountsByManagerQuery(ISession session)
{
this.session = session;
}
public User Ask(FindPremiumAccountsByManager context)
{
return session.Query<User>()…;
}
}
Отдельный класс из метода
30
Services/Managers/BusinessRules
Такая же история:
1. Растет количество классов такого типа
2. Растет количество методов
3. Растет количество зависимостей каждого
класса
4. Разбиваем сервисы на Command и Query
31
Маленькие объекты
1. Меньше зависимостей в каждом классе
2. SRP
3. Проще заменить
4. Проще тестировать
5. Делают дизайн кода однотипным
6. При расширении функциональности
системы сложность увеличивается (почти)
линейно
32
3. Эволюция
архитектуры
33
Website Сервис1 Сервис2
Shared DB
CA*
* Теорема CAP
34
DB
Get data Set data
Set data Get data
35
36
Что делать?
1. Оптимизировать скрипты выборки
2. Убираем ORM для лучшей оптимизации
3. Убираем весь код выборки в хранимки
4. Оптимизируем индексы
5. Денормализуем данные
37
Денормализация v1.0
Создать дополнительные колонки в текущих таблицах
SELECT count(*)
FROM Comments c
WHERE c.PostID = 20
vs
SELECT p.CommentCount
FROM Posts p
WHERE p.ID = 20
38
Денормализация v2.0
Создать отдельные таблицы/view для
денормализованных данных
39
Денормализация v3.0
Создать еще одну БД (хранилище) c
«плоскими» данными для чтения
1. Отдельная реляционная БД с «плоскими»
данными без связей
2. Различные NoSQL
3. Поисковые системы
40
cRud
1. «Плоский» SQL
2. NoSQL
3. Поисковые системы
4. Кэши
5. …
«Плоские» данные
UI
Только
выборка
41
CrUD
1. Domain-driven design (DDD)
2. N- tier, onion,… architecture
3. ORM (NHibernate, Entity Framework,…)
Приложение
База
данных
Presenter
UI
Domain Model
Validation
...
42
Отделяем чтение от записи
Приложение
MongoDB
Command
UI
Domain Model
Validation
...
Query Query Model
База
данных
Redis
Sphinx
...
43
Приложение
MongoDB
Command
UI
Domain Model
Validation
...
Query Query Model
База
данных
Redis
Sphinx
...
Где живет DDD?
DDD
44
ложение
MongoDB
Domain Model
Validation
...
Query Model
База
данных
?
Redis
Sphinx
...
Как синхронизировать
хранилища?
45
Обновляем синхронно
Приложение
MongoDB
mand
Domain Model
Validation
...
uery Query Model
База
данных
Redis
Sphinx
...
Преобразование данных
46
Приложение
MongoDB
mmand
Domain Model
Validation
...
uery Query Model
База
данных
Redis
Sphinx
...
С
о
б
ы
т
и
е
С
о
б
ы
т
и
е
Ш
и
н
а
д
а
н
н
ы
х
Обновляем асинхронно
47
Eventually consistent
Какое время уйдет
на синхронизацию?
48
Вам это не нужно
1. Усложнение архитектуры
2. Обоснование Eventually Consistent
49
4. Event Sourcing
50
Event Sourcing
CQRS
51
Предпосылки к Event Sourcing
1. Каким было состояние системы 2 недели
назад?
2. Имеете ли вы право затереть данные в
ячейке новыми?
3. Переходы между состояниями являются
частью бизнеса
52
User Story
реализована
Оценка
изменена на
21 SP
Оценка
изменена на
1 SP
Выставлена
оценка 8 SP
User Story
создана
Сохраняем историю изменений
53
Event Sourcing
1. Все изменения записывать в виде дельты
2. Текущее состояние домена – это
проигрывание «журнала транзакций»
3. Построение проекций для выборок
4. Snapshot как оптимизация
54
Приложение
Read Model
nd
Write Event
Domain Model
Validation
...
Query Model
Event
Store
Event
Publisher
Update
Load Aggregate
55
Надо ли мне Event Sourcing?
• Есть проблемы, которые не просто решить
– Как проектировать агрегаты?
– Как рефакторить агрегаты?
– Как изменять уже произошедшие события?
– Как накатываем события, которые зависели от
данных стороннего сервиса?
• Заказчики из разных прототипов не
выбирали ES
• Бизнесу не надо хранить всю историю
56
5. Ограничения
1. Нужна подготовка, возможен bus
factor
2. Кто-то не любит много классов
3. Дублирование в маленьких классах
4. Сложно целиком придерживаться
CQS
5. Не всегда Eventually persisted
подходит UX в системе
57
6. Примеры
реализации и
подходы
58
Пример вызова Query
public class FindUserById
{
public int Id { get; set; }
}
public class UserController : Controller
{
[HttpGet]
public ActionResult UserDetails(FindUserById context)
{
var dto = queryBuilder
.For<UserForEditDto>()
.With(context);
return View(dto);
}
59
Пример вызова Command
public class EditUser
{
public int UserId { get; set; }
public string Name { get; set; }
}
public class UserController : Controller
{
[HttpPost]
public ActionResult Edit(EditUser context)
{
commandHander.Execute(context);
return this.RedirectToAction(x => x.List());
}
60
Command Handler
public interface ICommandHandler<T> where T : ICommand
{
void Handle(T command);
}
public class EditUserCommandHandler : ICommandHandler<EditUser>
{
public void Execute(EditUser context)
{
// обновление данных
}
}
61
IoC-контейнер с абстрактной фабрикой
container.AddFacility<TypedFactoryFacility>();
var queries = AllTypes.FromAssemblyNamed("Infrastructure")
.BasedOn(typeof (IQuery<,>))
.WithService.AllInterfaces()
.Configure(x => x.LifeStyle.Transient);
container.Register(
queries,
Component.For<IQueryBuilder>()
.AsFactory().LifeStyle.Transient,
Component.For(typeof (IQueryFor<>))
.ImplementedBy(typeof (QueryFor<>)));
62
Диспетчеризация через шину
public class HomeController : Controller
{
[HttpPost]
public ActionResult ChangeName(Guid id, string name, int version)
{
var command = new RenameInventoryItem(id, name, version);
bus.Send(command);
return RedirectToAction("Index");
}
63
Диспетчеризация через шину
public class FakeBus : ICommandSender, IEventPublisher
{
public void Send<T>(T command) where T : Command
{
List<Action<Message>> handlers;
if (_routes.TryGetValue(typeof(T), out handlers))
{
if (handlers.Count != 1)
throw new InvalidOperationException();
handlers[0](command);
}
else
{
throw new InvalidOperationException("no handler registered");
}
}
64
Промежуточный Dispatcher
Command
Dispatcher
Аутентификация
Логирование
...
Command
Handler
65
Готовая инфраструктура CQRS на
примере .NET приложений
1. https://github.com/gnschenker/cqrs-introduction
2. https://github.com/gregoryyoung/m-r
3. http://lokad.github.io/lokad-cqrs/
4. https://github.com/AlexanderByndyu/ByndyuSoft.Infrastructure/t
ree/master/samples/aspnetmvc
5. http://msdn.microsoft.com/en-us/library/jj554200
6. https://github.com/ncqrs/ncqrs
66
Полезные ссылки
1. http://cqrs.files.wordpress.com/2010/11/cqrs_documents.pdf
2. http://www.udidahan.com/2009/12/09/clarified-cqrs
3. http://martinfowler.com/bliki/CQRS.html
4. http://martinfowler.com/bliki/CommandQuerySeparation.html
5. http://abdullin.com/cqrs
6. http://richarddingwall.name/2010/06/15/brownfield-cqrs-part-1-commands
7. http://msdn.microsoft.com/en-us/library/dn568103.aspx
67
Спасибо за внимание!
Буду рад ответить на ваши
вопросы лично или через:
blog.byndyu.ru
alexanderbyndyu
alexander.byndyu@gmail.com

More Related Content

What's hot

6. oracle exadata security trend ecs (final)
6. oracle exadata security   trend ecs (final)6. oracle exadata security   trend ecs (final)
6. oracle exadata security trend ecs (final)
Doina Draganescu
 
MLlib: Spark's Machine Learning Library
MLlib: Spark's Machine Learning LibraryMLlib: Spark's Machine Learning Library
MLlib: Spark's Machine Learning Library
jeykottalam
 
High availability virtualization with proxmox
High availability virtualization with proxmoxHigh availability virtualization with proxmox
High availability virtualization with proxmox
Oriol Izquierdo Vibalda
 
[pgday.Seoul 2022] PostgreSQL with Google Cloud
[pgday.Seoul 2022] PostgreSQL with Google Cloud[pgday.Seoul 2022] PostgreSQL with Google Cloud
[pgday.Seoul 2022] PostgreSQL with Google Cloud
PgDay.Seoul
 
Docker presentation
Docker presentationDocker presentation
Docker presentation
Shankar Chaudhary
 
Redis and it's data types
Redis and it's data typesRedis and it's data types
Redis and it's data types
Aniruddha Chakrabarti
 
[Android] Web services
[Android] Web services[Android] Web services
[Android] Web services
Nikmesoft Ltd
 
Deep Dive into Docker Swarm Mode
Deep Dive into Docker Swarm ModeDeep Dive into Docker Swarm Mode
Deep Dive into Docker Swarm Mode
Ajeet Singh Raina
 
An intro to Docker, Terraform, and Amazon ECS
An intro to Docker, Terraform, and Amazon ECSAn intro to Docker, Terraform, and Amazon ECS
An intro to Docker, Terraform, and Amazon ECS
Yevgeniy Brikman
 
Android Internals at Linaro Connect Asia 2013
Android Internals at Linaro Connect Asia 2013Android Internals at Linaro Connect Asia 2013
Android Internals at Linaro Connect Asia 2013
Opersys inc.
 
도커 컨테이너 활용 사례 Codigm - 남 유석 개발팀장 :: AWS Container Day
도커 컨테이너 활용 사례 Codigm - 남 유석 개발팀장 :: AWS Container Day도커 컨테이너 활용 사례 Codigm - 남 유석 개발팀장 :: AWS Container Day
도커 컨테이너 활용 사례 Codigm - 남 유석 개발팀장 :: AWS Container Day
Amazon Web Services Korea
 
Lua: the world's most infuriating language
Lua: the world's most infuriating languageLua: the world's most infuriating language
Lua: the world's most infuriating language
jgrahamc
 
[GuideDoc] Deploy EKS thru eksctl - v1.22_v0.105.0.pdf
[GuideDoc] Deploy EKS thru eksctl - v1.22_v0.105.0.pdf[GuideDoc] Deploy EKS thru eksctl - v1.22_v0.105.0.pdf
[GuideDoc] Deploy EKS thru eksctl - v1.22_v0.105.0.pdf
Jo Hoon
 
MongoDB- Crud Operation
MongoDB- Crud OperationMongoDB- Crud Operation
MongoDB- Crud OperationEdureka!
 
What is Docker Architecture | Edureka
What is Docker Architecture | EdurekaWhat is Docker Architecture | Edureka
What is Docker Architecture | Edureka
Edureka!
 
Multi Stage Docker Build
Multi Stage Docker Build Multi Stage Docker Build
Multi Stage Docker Build
Prasenjit Sarkar
 
Docker 101 - Getting started
Docker 101 - Getting startedDocker 101 - Getting started
Docker 101 - Getting started
Matheus Marabesi
 
Introduction to Docker Compose | Docker Intermediate Workshop
Introduction to Docker Compose | Docker Intermediate WorkshopIntroduction to Docker Compose | Docker Intermediate Workshop
Introduction to Docker Compose | Docker Intermediate Workshop
Ajeet Singh Raina
 
INTRODUCTION TO FLUTTER BASICS.pptx
INTRODUCTION TO FLUTTER BASICS.pptxINTRODUCTION TO FLUTTER BASICS.pptx
INTRODUCTION TO FLUTTER BASICS.pptx
20TUCS033DHAMODHARAK
 

What's hot (20)

6. oracle exadata security trend ecs (final)
6. oracle exadata security   trend ecs (final)6. oracle exadata security   trend ecs (final)
6. oracle exadata security trend ecs (final)
 
MLlib: Spark's Machine Learning Library
MLlib: Spark's Machine Learning LibraryMLlib: Spark's Machine Learning Library
MLlib: Spark's Machine Learning Library
 
Was ist Docker?
Was ist Docker?Was ist Docker?
Was ist Docker?
 
High availability virtualization with proxmox
High availability virtualization with proxmoxHigh availability virtualization with proxmox
High availability virtualization with proxmox
 
[pgday.Seoul 2022] PostgreSQL with Google Cloud
[pgday.Seoul 2022] PostgreSQL with Google Cloud[pgday.Seoul 2022] PostgreSQL with Google Cloud
[pgday.Seoul 2022] PostgreSQL with Google Cloud
 
Docker presentation
Docker presentationDocker presentation
Docker presentation
 
Redis and it's data types
Redis and it's data typesRedis and it's data types
Redis and it's data types
 
[Android] Web services
[Android] Web services[Android] Web services
[Android] Web services
 
Deep Dive into Docker Swarm Mode
Deep Dive into Docker Swarm ModeDeep Dive into Docker Swarm Mode
Deep Dive into Docker Swarm Mode
 
An intro to Docker, Terraform, and Amazon ECS
An intro to Docker, Terraform, and Amazon ECSAn intro to Docker, Terraform, and Amazon ECS
An intro to Docker, Terraform, and Amazon ECS
 
Android Internals at Linaro Connect Asia 2013
Android Internals at Linaro Connect Asia 2013Android Internals at Linaro Connect Asia 2013
Android Internals at Linaro Connect Asia 2013
 
도커 컨테이너 활용 사례 Codigm - 남 유석 개발팀장 :: AWS Container Day
도커 컨테이너 활용 사례 Codigm - 남 유석 개발팀장 :: AWS Container Day도커 컨테이너 활용 사례 Codigm - 남 유석 개발팀장 :: AWS Container Day
도커 컨테이너 활용 사례 Codigm - 남 유석 개발팀장 :: AWS Container Day
 
Lua: the world's most infuriating language
Lua: the world's most infuriating languageLua: the world's most infuriating language
Lua: the world's most infuriating language
 
[GuideDoc] Deploy EKS thru eksctl - v1.22_v0.105.0.pdf
[GuideDoc] Deploy EKS thru eksctl - v1.22_v0.105.0.pdf[GuideDoc] Deploy EKS thru eksctl - v1.22_v0.105.0.pdf
[GuideDoc] Deploy EKS thru eksctl - v1.22_v0.105.0.pdf
 
MongoDB- Crud Operation
MongoDB- Crud OperationMongoDB- Crud Operation
MongoDB- Crud Operation
 
What is Docker Architecture | Edureka
What is Docker Architecture | EdurekaWhat is Docker Architecture | Edureka
What is Docker Architecture | Edureka
 
Multi Stage Docker Build
Multi Stage Docker Build Multi Stage Docker Build
Multi Stage Docker Build
 
Docker 101 - Getting started
Docker 101 - Getting startedDocker 101 - Getting started
Docker 101 - Getting started
 
Introduction to Docker Compose | Docker Intermediate Workshop
Introduction to Docker Compose | Docker Intermediate WorkshopIntroduction to Docker Compose | Docker Intermediate Workshop
Introduction to Docker Compose | Docker Intermediate Workshop
 
INTRODUCTION TO FLUTTER BASICS.pptx
INTRODUCTION TO FLUTTER BASICS.pptxINTRODUCTION TO FLUTTER BASICS.pptx
INTRODUCTION TO FLUTTER BASICS.pptx
 

Similar to CQRS на практике. В поиске точки масштабирования и новых метафор

SECON'2014 - Александр Бындю - Переход от монолитной архитектуры к распределе...
SECON'2014 - Александр Бындю - Переход от монолитной архитектуры к распределе...SECON'2014 - Александр Бындю - Переход от монолитной архитектуры к распределе...
SECON'2014 - Александр Бындю - Переход от монолитной архитектуры к распределе...
Конференция разработчиков программного обеспечения SECON'2014
 
Переход от монолитной архитектуры к распределенной
Переход от монолитной архитектуры к распределеннойПереход от монолитной архитектуры к распределенной
Переход от монолитной архитектуры к распределенной
Alexander Byndyu
 
Модульная структура
Модульная структураМодульная структура
Модульная структура
Denis Tsvettsih
 
Модульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NETМодульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NET
Dev2Dev
 
Aspect Oriented Approach
Aspect Oriented ApproachAspect Oriented Approach
Aspect Oriented Approach
Dmytro Chyzhykov
 
Переход от монолитной архитектуры к распределенной
Переход от монолитной архитектуры к распределеннойПереход от монолитной архитектуры к распределенной
Переход от монолитной архитектуры к распределенной
Alexander Byndyu
 
Аспектно-Ориентированный Подход
Аспектно-Ориентированный ПодходАспектно-Ориентированный Подход
Аспектно-Ориентированный Подходakopium
 
И снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел ТайкалоИ снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел ТайкалоStanfy
 
Конструктор / Денис Паясь (Яндекс)
Конструктор / Денис Паясь (Яндекс)Конструктор / Денис Паясь (Яндекс)
Конструктор / Денис Паясь (Яндекс)
Ontico
 
Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»
Yulia Tsisyk
 
Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»
MskDotNet Community
 
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
MoscowJS
 
6 кареев киров
6 кареев киров6 кареев киров
6 кареев кировqasib
 
владивосток форум Deep_see
владивосток форум Deep_seeвладивосток форум Deep_see
владивосток форум Deep_see
Elena Ometova
 
Алексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кодаАлексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кода
Yandex
 
Микросервисы в .NET Core
Микросервисы в .NET CoreМикросервисы в .NET Core
Микросервисы в .NET Core
Andrew Gubskiy
 
Delegates and events in C#
Delegates and events in C#Delegates and events in C#
Delegates and events in C#
Mikhail Shcherbakov
 
Как это будет: ASP.NET Core
Как это будет: ASP.NET CoreКак это будет: ASP.NET Core
Как это будет: ASP.NET Core
DotNetConf
 
Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"
Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"
Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"
LogeekNightUkraine
 
Mobile Fest#spb 2012
Mobile Fest#spb 2012Mobile Fest#spb 2012
Mobile Fest#spb 2012
dmalykhanov
 

Similar to CQRS на практике. В поиске точки масштабирования и новых метафор (20)

SECON'2014 - Александр Бындю - Переход от монолитной архитектуры к распределе...
SECON'2014 - Александр Бындю - Переход от монолитной архитектуры к распределе...SECON'2014 - Александр Бындю - Переход от монолитной архитектуры к распределе...
SECON'2014 - Александр Бындю - Переход от монолитной архитектуры к распределе...
 
Переход от монолитной архитектуры к распределенной
Переход от монолитной архитектуры к распределеннойПереход от монолитной архитектуры к распределенной
Переход от монолитной архитектуры к распределенной
 
Модульная структура
Модульная структураМодульная структура
Модульная структура
 
Модульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NETМодульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NET
 
Aspect Oriented Approach
Aspect Oriented ApproachAspect Oriented Approach
Aspect Oriented Approach
 
Переход от монолитной архитектуры к распределенной
Переход от монолитной архитектуры к распределеннойПереход от монолитной архитектуры к распределенной
Переход от монолитной архитектуры к распределенной
 
Аспектно-Ориентированный Подход
Аспектно-Ориентированный ПодходАспектно-Ориентированный Подход
Аспектно-Ориентированный Подход
 
И снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел ТайкалоИ снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел Тайкало
 
Конструктор / Денис Паясь (Яндекс)
Конструктор / Денис Паясь (Яндекс)Конструктор / Денис Паясь (Яндекс)
Конструктор / Денис Паясь (Яндекс)
 
Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»
 
Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»Илья Ефимов «IoC/DI на примере Autofac»
Илья Ефимов «IoC/DI на примере Autofac»
 
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
 
6 кареев киров
6 кареев киров6 кареев киров
6 кареев киров
 
владивосток форум Deep_see
владивосток форум Deep_seeвладивосток форум Deep_see
владивосток форум Deep_see
 
Алексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кодаАлексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кода
 
Микросервисы в .NET Core
Микросервисы в .NET CoreМикросервисы в .NET Core
Микросервисы в .NET Core
 
Delegates and events in C#
Delegates and events in C#Delegates and events in C#
Delegates and events in C#
 
Как это будет: ASP.NET Core
Как это будет: ASP.NET CoreКак это будет: ASP.NET Core
Как это будет: ASP.NET Core
 
Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"
Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"
Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"
 
Mobile Fest#spb 2012
Mobile Fest#spb 2012Mobile Fest#spb 2012
Mobile Fest#spb 2012
 

More from Alexander Byndyu

Инфраструктура для совместной предпроктной работы IT-компаний и реального ...
Инфраструктура для совместной предпроктной работы IT-компаний и реального ...Инфраструктура для совместной предпроктной работы IT-компаний и реального ...
Инфраструктура для совместной предпроктной работы IT-компаний и реального ...
Alexander Byndyu
 
Применение low-code платформ в энтерпрайзе
Применение low-code платформ в энтерпрайзеПрименение low-code платформ в энтерпрайзе
Применение low-code платформ в энтерпрайзе
Alexander Byndyu
 
Антихрупкость в IT или как полюбить изменения
Антихрупкость в IT или как полюбить измененияАнтихрупкость в IT или как полюбить изменения
Антихрупкость в IT или как полюбить изменения
Alexander Byndyu
 
Карта гипотез как метод стратегического планирования
Карта гипотез как метод стратегического планированияКарта гипотез как метод стратегического планирования
Карта гипотез как метод стратегического планирования
Alexander Byndyu
 
Как перейти от проектного мышления к продуктовому. Опыт из заказной разработки
Как перейти от проектного мышления к продуктовому. Опыт из заказной разработкиКак перейти от проектного мышления к продуктовому. Опыт из заказной разработки
Как перейти от проектного мышления к продуктовому. Опыт из заказной разработки
Alexander Byndyu
 
История о том, как техническое задание подменяет цель проекта
История о том, как техническое задание подменяет цель проектаИстория о том, как техническое задание подменяет цель проекта
История о том, как техническое задание подменяет цель проекта
Alexander Byndyu
 
Шпаргалка по IT-миру для предпринимателя
Шпаргалка по IT-миру для предпринимателяШпаргалка по IT-миру для предпринимателя
Шпаргалка по IT-миру для предпринимателя
Alexander Byndyu
 
Микросервисы, чистый PaaS и конкурс Мисс Россия
Микросервисы, чистый PaaS и конкурс Мисс РоссияМикросервисы, чистый PaaS и конкурс Мисс Россия
Микросервисы, чистый PaaS и конкурс Мисс Россия
Alexander Byndyu
 
IT-директор на аутсорсе
IT-директор на аутсорсеIT-директор на аутсорсе
IT-директор на аутсорсе
Alexander Byndyu
 
Бизнес-гибкость через микросервисную архитектуру
Бизнес-гибкость через микросервисную архитектуруБизнес-гибкость через микросервисную архитектуру
Бизнес-гибкость через микросервисную архитектуру
Alexander Byndyu
 
Impact Mapping на практике v2
Impact Mapping на практике v2Impact Mapping на практике v2
Impact Mapping на практике v2
Alexander Byndyu
 
Кнопочное мышление против целостного IT-продукта
Кнопочное мышление против целостного IT-продуктаКнопочное мышление против целостного IT-продукта
Кнопочное мышление против целостного IT-продукта
Alexander Byndyu
 
Пять самых важных составляющих процесса выпуска продуктов
Пять самых важных составляющих процесса выпуска продуктовПять самых важных составляющих процесса выпуска продуктов
Пять самых важных составляющих процесса выпуска продуктов
Alexander Byndyu
 
Пять самых важных составляющих процесса выпуска проектов
Пять самых важных составляющих процесса выпуска проектовПять самых важных составляющих процесса выпуска проектов
Пять самых важных составляющих процесса выпуска проектов
Alexander Byndyu
 
Час Кода 2015
Час Кода 2015Час Кода 2015
Час Кода 2015
Alexander Byndyu
 
Impact mapping in practice
Impact mapping in practiceImpact mapping in practice
Impact mapping in practice
Alexander Byndyu
 
Impact Mapping на практике
Impact Mapping на практикеImpact Mapping на практике
Impact Mapping на практике
Alexander Byndyu
 
Customer satisfaction для программистов
Customer satisfaction для программистовCustomer satisfaction для программистов
Customer satisfaction для программистов
Alexander Byndyu
 
Как размножается Sphinx
Как размножается SphinxКак размножается Sphinx
Как размножается Sphinx
Alexander Byndyu
 
ElasticSearch: Найдется все... и быстро!
ElasticSearch: Найдется все... и быстро!ElasticSearch: Найдется все... и быстро!
ElasticSearch: Найдется все... и быстро!
Alexander Byndyu
 

More from Alexander Byndyu (20)

Инфраструктура для совместной предпроктной работы IT-компаний и реального ...
Инфраструктура для совместной предпроктной работы IT-компаний и реального ...Инфраструктура для совместной предпроктной работы IT-компаний и реального ...
Инфраструктура для совместной предпроктной работы IT-компаний и реального ...
 
Применение low-code платформ в энтерпрайзе
Применение low-code платформ в энтерпрайзеПрименение low-code платформ в энтерпрайзе
Применение low-code платформ в энтерпрайзе
 
Антихрупкость в IT или как полюбить изменения
Антихрупкость в IT или как полюбить измененияАнтихрупкость в IT или как полюбить изменения
Антихрупкость в IT или как полюбить изменения
 
Карта гипотез как метод стратегического планирования
Карта гипотез как метод стратегического планированияКарта гипотез как метод стратегического планирования
Карта гипотез как метод стратегического планирования
 
Как перейти от проектного мышления к продуктовому. Опыт из заказной разработки
Как перейти от проектного мышления к продуктовому. Опыт из заказной разработкиКак перейти от проектного мышления к продуктовому. Опыт из заказной разработки
Как перейти от проектного мышления к продуктовому. Опыт из заказной разработки
 
История о том, как техническое задание подменяет цель проекта
История о том, как техническое задание подменяет цель проектаИстория о том, как техническое задание подменяет цель проекта
История о том, как техническое задание подменяет цель проекта
 
Шпаргалка по IT-миру для предпринимателя
Шпаргалка по IT-миру для предпринимателяШпаргалка по IT-миру для предпринимателя
Шпаргалка по IT-миру для предпринимателя
 
Микросервисы, чистый PaaS и конкурс Мисс Россия
Микросервисы, чистый PaaS и конкурс Мисс РоссияМикросервисы, чистый PaaS и конкурс Мисс Россия
Микросервисы, чистый PaaS и конкурс Мисс Россия
 
IT-директор на аутсорсе
IT-директор на аутсорсеIT-директор на аутсорсе
IT-директор на аутсорсе
 
Бизнес-гибкость через микросервисную архитектуру
Бизнес-гибкость через микросервисную архитектуруБизнес-гибкость через микросервисную архитектуру
Бизнес-гибкость через микросервисную архитектуру
 
Impact Mapping на практике v2
Impact Mapping на практике v2Impact Mapping на практике v2
Impact Mapping на практике v2
 
Кнопочное мышление против целостного IT-продукта
Кнопочное мышление против целостного IT-продуктаКнопочное мышление против целостного IT-продукта
Кнопочное мышление против целостного IT-продукта
 
Пять самых важных составляющих процесса выпуска продуктов
Пять самых важных составляющих процесса выпуска продуктовПять самых важных составляющих процесса выпуска продуктов
Пять самых важных составляющих процесса выпуска продуктов
 
Пять самых важных составляющих процесса выпуска проектов
Пять самых важных составляющих процесса выпуска проектовПять самых важных составляющих процесса выпуска проектов
Пять самых важных составляющих процесса выпуска проектов
 
Час Кода 2015
Час Кода 2015Час Кода 2015
Час Кода 2015
 
Impact mapping in practice
Impact mapping in practiceImpact mapping in practice
Impact mapping in practice
 
Impact Mapping на практике
Impact Mapping на практикеImpact Mapping на практике
Impact Mapping на практике
 
Customer satisfaction для программистов
Customer satisfaction для программистовCustomer satisfaction для программистов
Customer satisfaction для программистов
 
Как размножается Sphinx
Как размножается SphinxКак размножается Sphinx
Как размножается Sphinx
 
ElasticSearch: Найдется все... и быстро!
ElasticSearch: Найдется все... и быстро!ElasticSearch: Найдется все... и быстро!
ElasticSearch: Найдется все... и быстро!
 

CQRS на практике. В поиске точки масштабирования и новых метафор