SlideShare une entreprise Scribd logo
1  sur  67
Télécharger pour lire hors ligne
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

Contenu connexe

Tendances

Business Intelligence
Business IntelligenceBusiness Intelligence
Business Intelligences.poles
 
Projet BI - 2 - Conception base de données
Projet BI - 2 - Conception base de donnéesProjet BI - 2 - Conception base de données
Projet BI - 2 - Conception base de donnéesJean-Marc Dupont
 
Référentiel d'architecture avec TOGAF
Référentiel d'architecture avec TOGAFRéférentiel d'architecture avec TOGAF
Référentiel d'architecture avec TOGAFPierre-Xavier Fouillé
 
【14-B-2】グリーを支えるデータ分析基盤の過去と現在(橋本泰一〔グリー〕)
【14-B-2】グリーを支えるデータ分析基盤の過去と現在(橋本泰一〔グリー〕)【14-B-2】グリーを支えるデータ分析基盤の過去と現在(橋本泰一〔グリー〕)
【14-B-2】グリーを支えるデータ分析基盤の過去と現在(橋本泰一〔グリー〕)Developers Summit
 
2022/03/23 AITCオープンラボ第1回「メタ―バース入門」
2022/03/23 AITCオープンラボ第1回「メタ―バース入門」2022/03/23 AITCオープンラボ第1回「メタ―バース入門」
2022/03/23 AITCオープンラボ第1回「メタ―バース入門」aitc_jp
 
Architectures microservices
Architectures microservicesArchitectures microservices
Architectures microservicesRiadh MNASRI
 
Système Information - ETL et EAI - Décisionnel et Opérationnel
Système Information - ETL et EAI - Décisionnel et OpérationnelSystème Information - ETL et EAI - Décisionnel et Opérationnel
Système Information - ETL et EAI - Décisionnel et OpérationnelFrédéric FAURE
 
Dama - Protecting Sensitive Data on a Database
Dama - Protecting Sensitive Data on a DatabaseDama - Protecting Sensitive Data on a Database
Dama - Protecting Sensitive Data on a Databasejohanswart1234
 
Basic patterns for capability map level 0
Basic patterns for capability map level 0Basic patterns for capability map level 0
Basic patterns for capability map level 0Jörgen Dahlberg
 
OpenLineage による Airflow のデータ来歴の収集と可視化(Airflow Meetup Tokyo #3 発表資料)
OpenLineage による Airflow のデータ来歴の収集と可視化(Airflow Meetup Tokyo #3 発表資料)OpenLineage による Airflow のデータ来歴の収集と可視化(Airflow Meetup Tokyo #3 発表資料)
OpenLineage による Airflow のデータ来歴の収集と可視化(Airflow Meetup Tokyo #3 発表資料)NTT DATA Technology & Innovation
 
Projet Bi - 3 - Alimentation des données
Projet Bi - 3 - Alimentation des donnéesProjet Bi - 3 - Alimentation des données
Projet Bi - 3 - Alimentation des donnéesJean-Marc Dupont
 
Chap I : Cours de Modélisation & Simulation des processus
Chap I : Cours de Modélisation & Simulation des processusChap I : Cours de Modélisation & Simulation des processus
Chap I : Cours de Modélisation & Simulation des processusMohammed TAMALI
 
Big Data... Big Analytics à travers les âges, les industries et les technologies
Big Data... Big Analytics à travers les âges, les industries et les technologiesBig Data... Big Analytics à travers les âges, les industries et les technologies
Big Data... Big Analytics à travers les âges, les industries et les technologiesHassan Lâasri
 
Demain - Guillaume Musso.pdf
Demain - Guillaume Musso.pdfDemain - Guillaume Musso.pdf
Demain - Guillaume Musso.pdfloukman3
 
Devops Adoption Roadmap v 2.7 Agiles Colombia 2020
Devops Adoption Roadmap v 2.7 Agiles Colombia 2020Devops Adoption Roadmap v 2.7 Agiles Colombia 2020
Devops Adoption Roadmap v 2.7 Agiles Colombia 2020Javier Dominguez
 
Transformation organisationnelle - Plan de transformation basé sur l’architec...
Transformation organisationnelle - Plan de transformation basé sur l’architec...Transformation organisationnelle - Plan de transformation basé sur l’architec...
Transformation organisationnelle - Plan de transformation basé sur l’architec...Miguel Iriart
 
MLOps and Data Quality: Deploying Reliable ML Models in Production
MLOps and Data Quality: Deploying Reliable ML Models in ProductionMLOps and Data Quality: Deploying Reliable ML Models in Production
MLOps and Data Quality: Deploying Reliable ML Models in ProductionProvectus
 
Ml ops past_present_future
Ml ops past_present_futureMl ops past_present_future
Ml ops past_present_futureNisha Talagala
 

Tendances (20)

Business Intelligence
Business IntelligenceBusiness Intelligence
Business Intelligence
 
Projet BI - 2 - Conception base de données
Projet BI - 2 - Conception base de donnéesProjet BI - 2 - Conception base de données
Projet BI - 2 - Conception base de données
 
Référentiel d'architecture avec TOGAF
Référentiel d'architecture avec TOGAFRéférentiel d'architecture avec TOGAF
Référentiel d'architecture avec TOGAF
 
【14-B-2】グリーを支えるデータ分析基盤の過去と現在(橋本泰一〔グリー〕)
【14-B-2】グリーを支えるデータ分析基盤の過去と現在(橋本泰一〔グリー〕)【14-B-2】グリーを支えるデータ分析基盤の過去と現在(橋本泰一〔グリー〕)
【14-B-2】グリーを支えるデータ分析基盤の過去と現在(橋本泰一〔グリー〕)
 
2022/03/23 AITCオープンラボ第1回「メタ―バース入門」
2022/03/23 AITCオープンラボ第1回「メタ―バース入門」2022/03/23 AITCオープンラボ第1回「メタ―バース入門」
2022/03/23 AITCオープンラボ第1回「メタ―バース入門」
 
Architectures microservices
Architectures microservicesArchitectures microservices
Architectures microservices
 
Système Information - ETL et EAI - Décisionnel et Opérationnel
Système Information - ETL et EAI - Décisionnel et OpérationnelSystème Information - ETL et EAI - Décisionnel et Opérationnel
Système Information - ETL et EAI - Décisionnel et Opérationnel
 
Dama - Protecting Sensitive Data on a Database
Dama - Protecting Sensitive Data on a DatabaseDama - Protecting Sensitive Data on a Database
Dama - Protecting Sensitive Data on a Database
 
Basic patterns for capability map level 0
Basic patterns for capability map level 0Basic patterns for capability map level 0
Basic patterns for capability map level 0
 
OpenLineage による Airflow のデータ来歴の収集と可視化(Airflow Meetup Tokyo #3 発表資料)
OpenLineage による Airflow のデータ来歴の収集と可視化(Airflow Meetup Tokyo #3 発表資料)OpenLineage による Airflow のデータ来歴の収集と可視化(Airflow Meetup Tokyo #3 発表資料)
OpenLineage による Airflow のデータ来歴の収集と可視化(Airflow Meetup Tokyo #3 発表資料)
 
Projet Bi - 3 - Alimentation des données
Projet Bi - 3 - Alimentation des donnéesProjet Bi - 3 - Alimentation des données
Projet Bi - 3 - Alimentation des données
 
Big Data Architecture 全体概要
Big Data Architecture 全体概要Big Data Architecture 全体概要
Big Data Architecture 全体概要
 
Chap I : Cours de Modélisation & Simulation des processus
Chap I : Cours de Modélisation & Simulation des processusChap I : Cours de Modélisation & Simulation des processus
Chap I : Cours de Modélisation & Simulation des processus
 
Big Data... Big Analytics à travers les âges, les industries et les technologies
Big Data... Big Analytics à travers les âges, les industries et les technologiesBig Data... Big Analytics à travers les âges, les industries et les technologies
Big Data... Big Analytics à travers les âges, les industries et les technologies
 
Demain - Guillaume Musso.pdf
Demain - Guillaume Musso.pdfDemain - Guillaume Musso.pdf
Demain - Guillaume Musso.pdf
 
Devops Adoption Roadmap v 2.7 Agiles Colombia 2020
Devops Adoption Roadmap v 2.7 Agiles Colombia 2020Devops Adoption Roadmap v 2.7 Agiles Colombia 2020
Devops Adoption Roadmap v 2.7 Agiles Colombia 2020
 
Transformation organisationnelle - Plan de transformation basé sur l’architec...
Transformation organisationnelle - Plan de transformation basé sur l’architec...Transformation organisationnelle - Plan de transformation basé sur l’architec...
Transformation organisationnelle - Plan de transformation basé sur l’architec...
 
MLOps and Data Quality: Deploying Reliable ML Models in Production
MLOps and Data Quality: Deploying Reliable ML Models in ProductionMLOps and Data Quality: Deploying Reliable ML Models in Production
MLOps and Data Quality: Deploying Reliable ML Models in Production
 
The Journey to DevSecOps
The Journey to DevSecOpsThe Journey to DevSecOps
The Journey to DevSecOps
 
Ml ops past_present_future
Ml ops past_present_futureMl ops past_present_future
Ml ops past_present_future
 

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

Переход от монолитной архитектуры к распределенной
Переход от монолитной архитектуры к распределеннойПереход от монолитной архитектуры к распределенной
Переход от монолитной архитектуры к распределеннойAlexander Byndyu
 
Модульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NETМодульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NETDev2Dev
 
Модульная структура
Модульная структураМодульная структура
Модульная структураDenis Tsvettsih
 
Переход от монолитной архитектуры к распределенной
Переход от монолитной архитектуры к распределеннойПереход от монолитной архитектуры к распределенной
Переход от монолитной архитектуры к распределеннойAlexander Byndyu
 
Аспектно-Ориентированный Подход
Аспектно-Ориентированный ПодходАспектно-Ориентированный Подход
Аспектно-Ориентированный Подходakopium
 
И снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел ТайкалоИ снова разработка под iOS. Павел Тайкало
И снова разработка под iOS. Павел ТайкалоStanfy
 
Конструктор / Денис Паясь (Яндекс)
Конструктор / Денис Паясь (Яндекс)Конструктор / Денис Паясь (Яндекс)
Конструктор / Денис Паясь (Яндекс)Ontico
 
Илья Ефимов «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
 
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17
"Webpack: 7 бед — один ответ" — Денис Измайлов, MoscowJS 17MoscowJS
 
6 кареев киров
6 кареев киров6 кареев киров
6 кареев кировqasib
 
владивосток форум Deep_see
владивосток форум Deep_seeвладивосток форум Deep_see
владивосток форум Deep_seeElena Ometova
 
Алексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кодаАлексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кодаYandex
 
Микросервисы в .NET Core
Микросервисы в .NET CoreМикросервисы в .NET Core
Микросервисы в .NET CoreAndrew Gubskiy
 
Как это будет: ASP.NET Core
Как это будет: ASP.NET CoreКак это будет: ASP.NET Core
Как это будет: ASP.NET CoreDotNetConf
 
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 2012dmalykhanov
 

Similaire à 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
 

Plus de 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 на практике v2Alexander Byndyu
 
Кнопочное мышление против целостного IT-продукта
Кнопочное мышление против целостного IT-продуктаКнопочное мышление против целостного IT-продукта
Кнопочное мышление против целостного IT-продуктаAlexander Byndyu
 
Пять самых важных составляющих процесса выпуска продуктов
Пять самых важных составляющих процесса выпуска продуктовПять самых важных составляющих процесса выпуска продуктов
Пять самых важных составляющих процесса выпуска продуктовAlexander Byndyu
 
Пять самых важных составляющих процесса выпуска проектов
Пять самых важных составляющих процесса выпуска проектовПять самых важных составляющих процесса выпуска проектов
Пять самых важных составляющих процесса выпуска проектовAlexander Byndyu
 
Impact mapping in practice
Impact mapping in practiceImpact mapping in practice
Impact mapping in practiceAlexander Byndyu
 
Impact Mapping на практике
Impact Mapping на практикеImpact Mapping на практике
Impact Mapping на практикеAlexander Byndyu
 
Customer satisfaction для программистов
Customer satisfaction для программистовCustomer satisfaction для программистов
Customer satisfaction для программистовAlexander Byndyu
 
Как размножается Sphinx
Как размножается SphinxКак размножается Sphinx
Как размножается SphinxAlexander Byndyu
 
ElasticSearch: Найдется все... и быстро!
ElasticSearch: Найдется все... и быстро!ElasticSearch: Найдется все... и быстро!
ElasticSearch: Найдется все... и быстро!Alexander Byndyu
 

Plus de 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 на практике. В поиске точки масштабирования и новых метафор