40

Строим простые и масштабируемые бекэнды

Embed Size (px)

Citation preview

Page 1: Строим простые и масштабируемые бекэнды
Page 2: Строим простые и масштабируемые бекэнды

#msdevcon

Community Track

Строим простые и масшабируемые бекэндыДенис ИвановРуководитель группы разработки, 2ГИСhttps://github.com/denisivan0v

Page 3: Строим простые и масштабируемые бекэнды

#msdevcon

Обо мне

Page 4: Строим простые и масштабируемые бекэнды

#msdevcon

Цели

Простота vs сложность

БекэндыПодходы к

проектированиюОткуда берется

сложность?

Page 5: Строим простые и масштабируемые бекэнды

#msdevcon

Цели

Простота vs сложность

Инженерные практикиПринципы и паттерны

Анализ предметной области

Как правильно применять?

БекэндыПодходы к

проектированиюОткуда берется

сложность?

Page 6: Строим простые и масштабируемые бекэнды

#msdevcon

Цели

Простота vs сложность

Инженерные практики

Практический опыт

Принципы и паттерныАнализ предметной

областиКак правильно

применять?

Разделение ответственностей

Event-driven architectureМодели чтения и записи

БекэндыПодходы к

проектированиюОткуда берется

сложность?

Page 7: Строим простые и масштабируемые бекэнды

#msdevcon

Простота vs сложностьСлоистая архитектура

Page 8: Строим простые и масштабируемые бекэнды

Слоистая архитектураUI

API

BL

DAL

DB

Page 9: Строим простые и масштабируемые бекэнды

Слоистая архитектура

Разделение ответственностей

UI

API

BL

DAL

DB

Page 10: Строим простые и масштабируемые бекэнды

Слоистая архитектура

Разделение ответственностейРасположение слоевПерегруженность слоевПоявление cross-layer абстракцийСложность поддержания границБольшое число абстракцийТрудоемкая композиция приложенияМонолит

UI

API

BL

DAL

DB

Logg

ing

Audi

t

Page 11: Строим простые и масштабируемые бекэнды

Компонентная модель

UI

Read Model

DB DB

Domain Model

Storage

AdminBackend

DB

Read Model API

Page 12: Строим простые и масштабируемые бекэнды

#msdevcon

Инженерные практикиПринципы и паттерны

Page 13: Строим простые и масштабируемые бекэнды

Принципы, паттерны и подходыS.O.L.I.DПять базовых принципов ООП/ООД

Page 14: Строим простые и масштабируемые бекэнды

Принципы, паттерны и подходыS.O.L.I.DПять базовых принципов ООП/ООД

CQSМетод – либо запрос, либо команда

Page 15: Строим простые и масштабируемые бекэнды

CQSpublic interface IEnumerator{ object Current { get; }

bool MoveNext();

void Reset();}

Page 16: Строим простые и масштабируемые бекэнды

Принципы, паттерны и подходыS.O.L.I.DПять базовых принципов ООП/ООД

CQSМетод – либо запрос, либо команда

Page 17: Строим простые и масштабируемые бекэнды

Принципы, паттерны и подходыS.O.L.I.DПять базовых принципов ООП/ООД

CQSМетод – либо запрос, либо команда

Domain-Driven DesignГлубоко проработанная модель и максимально точная реализация

Page 18: Строим простые и масштабируемые бекэнды

Принципы, паттерны и подходыS.O.L.I.DПять базовых принципов ООП/ООД

CQSМетод – либо запрос, либо команда

Domain-Driven DesignГлубоко проработанная модель и максимально точная реализация

Event-Driven ApproachРегистрация, отправка, роутинг, приём и реакция на события

Page 19: Строим простые и масштабируемые бекэнды

CQRS

User Interface

Write Model Read Model

Page 20: Строим простые и масштабируемые бекэнды

#msdevcon

Практический опытhttps://github.com/2gis/nuclear-river

Page 21: Строим простые и масштабируемые бекэнды

Модель чтения как компонент

UI

Read Model

DB DB

Domain Model

Storage

AdminBackend

DB

Read Model API

Page 22: Строим простые и масштабируемые бекэнды
Page 23: Строим простые и масштабируемые бекэнды

Модель чтения как компонент

UI

Read Model

DB DB

Domain Model

Storage

AdminBackend

DB

Read Model API

Page 24: Строим простые и масштабируемые бекэнды

CQRS

User Interface

Write Model Read Model

Page 25: Строим простые и масштабируемые бекэнды

Модели чтения (Read Model)

User Interface

Write Model Read Model

Read Model

Read Model

Page 26: Строим простые и масштабируемые бекэнды

Модель предметной области

Root1

Entity1 Entity2

ValueObject

ValueObject

ValueObject

ValueObject

Entity3

Page 27: Строим простые и масштабируемые бекэнды

Построение Read Model-и

User Interface

Business Logic

Database

Events Querying

API

Database

Observer

Page 28: Строим простые и масштабируемые бекэнды

Бекэнд выполнения запросов на чтение

HTTP (OData)

Querying Host

(NuClear River)

OData Controller(dynamic)

query (request)

EF(dynamic)

query (IQueryable)

Database

query (SQL)

dataobjects

jsonHTTP (json)

UI

Page 29: Строим простые и масштабируемые бекэнды

Обработка событий

events

Handler 1 Handler 2 … Handler N

Page 30: Строим простые и масштабируемые бекэнды

Акторная модель

public interface IActor{

IReadOnlyCollection<IEvent> ExecuteCommands(IReadOnlyCollection<ICommand> commands);

}

Page 31: Строим простые и масштабируемые бекэнды

Акторная модельevent

s

Actor 1

events

events

commands

events

Actor 2 … Actor N

Page 32: Строим простые и масштабируемые бекэнды

Акторная модельType1

Type1`

Type2

Type2`

Type3

Type3`

Type4

Type4`

Type5

Type5`

Page 33: Строим простые и масштабируемые бекэнды

Акторная модельType1

Type1`

Root1

Entity1 Entity2

Type2

Type2`

Type3

Type3`

Type4

Type4`

Type5

Type5`

ValueObject

ValueObject

Page 34: Строим простые и масштабируемые бекэнды

Акторная модельCreateDataObjectActorDeleteDataObjectActorReplaceDataObjectActorSyncDataObjectActor

Type1

Type1`

Type2

Type2`

Type3

Type3`

Type4

Type4`

Type5

Type5`

Page 35: Строим простые и масштабируемые бекэнды

Акторная модельEntityActorValueObjectObjectActorRootToLeafActorLeafToRootActorSubrootToLeafActor

Root1

Entity1 Entity2

ValueObject

ValueObject

Page 36: Строим простые и масштабируемые бекэнды

Eventual consistency

Event happened

Event sent Event received

Consistency

t

t2-t1

Page 37: Строим простые и масштабируемые бекэнды

#msdevcon

Что дальше

Контролируйте

сложность

Используйте разные подходы Участвуйте!

Разделяйте отвественности

Выбирайте подходящую архитектуру

Применяйте лучшие практики

Используйте NuClear River

Делитесь фидбекомСтановитесь

контрибьютором

Границы контекстовПростые абстракции

Понятная модель приложения

Page 38: Строим простые и масштабируемые бекэнды

#msdevcon

Ресурсы

NuClear Riverhttps://github.com/2gis/nuclear-riverODatahttp://www.odata.org/

Actor programming modelhttps://en.wikipedia.org/wiki/Actor_model

Page 39: Строим простые и масштабируемые бекэнды

#msdevcon

Q&A

Строим простые и масшабируемые бекэндыДенис Ивановhttps://github.com/denisivan0vhttp://dev.ivanovdenis.ru

Page 40: Строим простые и масштабируемые бекэнды

© 2016 Microsoft Corporation. All rights reserved.