SlideShare uma empresa Scribd logo
1 de 17
Conflict-free Replicated
Data Type
Функциональный подход к распределённым системам
Сергей Укустов
«Умные структуры данных и
тупой код работают куда
лучше, чем наоборот»
Эрик Раймонд
Распределённые системы
• Много общающихся машин
• Общее состояние
• Бывает разное
• CAP теорема
• Consistency, Availability, Partitioning – выберите любые два
• CALM теорема
• Consistency as logical monotonicity – система может быть распределённой,
если она не удаляет исторические факты
CRDT
• Тип структур данных для eventually consistent систем
• Формально доказано: состояние системы сходится
• CAP теорема: выкидываем строгую consistency
• CALM теорема: строгая гарантия eventual consistency
CRDT: State-based
• Множество <A, combine>
• a combine (b combine c) == (a combine b) combine c
• a combine b == b combine a
• a combine a == a
• Необходимо есть нулевой элемент
• Ограниченная полурешетка AKA коммутативный идемпотентный моноид
• Частичный порядок
G-Counter
• Можно только увеличивать счётчик
case class GCounter[R, E](state: Map[R, E])(implicit num: Numeric[E])
import com.machinomy.crdt.state._
import cats.syntax.all._
import cats._
val counter = Monoid[GCounter[Int, Int]].empty // empty G-Counter
val firstReplica = counter + (1 -> 1) // increment replica 1
val secondReplica = counter + (2 -> 2) // increment replica 2
val firstReplicacombined = firstReplica |+| secondReplica // combine
val secondReplicacombined = secondReplica |+| firstReplica // combine
firstReplicacombined == secondReplicacombined // the result is independent of combine order
PN-Counter
• Можно делать инкремент и декремент
class PNCounter[K, E: Numeric](increments: GCounter[K, E], decrements: GCounter[K, E])
import com.machinomy.crdt.state._
import cats.syntax.all._
import cats._
val counter = Monoid[PNCounter[Int, Int]].empty
val firstReplica = counter + (1 -> 1) // increment replica 1
val secondReplica = counter + (2 -> -2) // decrement replica 2
val firstReplicacombined = firstReplica |+| secondReplica // combine
val secondReplicacombined = secondReplica |+| firstReplica // combine
firstReplicacombined == secondReplicacombined // the result is independent of combine
order
G-Set
• Только добавление, `combine` объединяет множества
• class GSet[E](val state: Set[E])
import com.machinomy.crdt.state._
import cats.syntax.all._
import cats._
val counter = Monoid[GSet[Int]].empty // empty G-Set
val firstReplica = counter + 1 // add element
val secondReplica = counter + 2 // add element
val firstReplicacombined = firstReplica |+| secondReplica // combine
val secondReplicacombined = secondReplica |+| firstReplica // combine
firstReplicacombined == secondReplicacombined // the result is independent of
combine order
И ещё…
• GT-Set
• MC-Set
• OR-Set
• TP-Set
• LWW-Element-Set
• LWW-Register
• …
CRDT: Op-based
• Передаём операции по сети, а не состояние
S · f · g = S · g · f
• Можно эмулировать поверх state-based, и наоборот
Op-based Counter
case class Counter[E: Numeric](value: E)
def update[E: Numeric](counter: Counter[E], update: Update[E]):
Counter[E] = update match {
case Counter.Increment(i) => Counter(num.plus(counter.value, i))
case Counter.Decrement(i) => Counter(num.minus(counter.value, i))
}
Op-based ORSet
case class ORSet[E, T: TombStone](state: Map[E, Set[T]])
2P2P-Graph
case class TPTPGraph[A, V <: VertexLike[A], E <: EdgeLike[A, V]]
(va: Set[V], vr: Set[V], ea: Set[E], er: Set[E])
• Можно добавлять и удалять элементы
• Но никаких гарантий!
Monotonic DAG
Monotonic DAG
case class MonotonicDag[V, E[X] <: DiEdgeLikeIn[X], G <: Graph[V, E]](graph: G)
type UpdateResult[V, E[X] <: DiEdgeLikeIn[X], G <: Graph[V, E]] = (MonotonicDag[V, E, G],
Option[Update[V, E, G]])
def add(e: E[V] with OuterEdge[V, E]): MonotonicDag.UpdateResult[V, E, G] = {
val from = graphLike.fromVertex(graph, e)
val to = graphLike.toVertex(value, e)
val containsSource = graphLike.contains(value, from)
val containsDestination = graphLike.contains(value, to)
val effective = graphLike.addEdge(value, e)
if (containsSource && containsDestination && graphLike.existsPath(effective, from, to)) {
(MonotonicDag[V, E, G](effective), Some(MonotonicDag.AddEdge[V, E, G](e)))
} else {
(this, None)
}
}
Pro et Contra
• Простая логика
• Стабильное теоретическое
обоснование
• Лучше, чем OT
• Социальное доказательство
• Непонятно, что делать с BFT
• Необходимо обеспечить
стабильный канал
• Сложно найти подходящую
реализацию
https://github.com/machinomy/crdt
https://www.mendeley.com/groups/9275881/crdt/papers/
sergey.ukustov@machinomy.com

Mais conteúdo relacionado

Destaque

883 THISTLE DOWN CIRCLE - Sept 10 (EXISTING)
883 THISTLE DOWN CIRCLE - Sept 10 (EXISTING)883 THISTLE DOWN CIRCLE - Sept 10 (EXISTING)
883 THISTLE DOWN CIRCLE - Sept 10 (EXISTING)
Jonathan Mohabir
 
Андрей Сильчук для QA Expert Day
Андрей Сильчук для QA Expert DayАндрей Сильчук для QA Expert Day
Андрей Сильчук для QA Expert Day
Provectus
 
Станислав Иващенко: “Kubernetes как облако для CI”
Станислав Иващенко: “Kubernetes как облако для CI” Станислав Иващенко: “Kubernetes как облако для CI”
Станислав Иващенко: “Kubernetes как облако для CI”
Provectus
 
Ринат Ахметов: "Восстановление модели трехмерного объекта по видеопотоку"
Ринат Ахметов: "Восстановление модели трехмерного объекта по видеопотоку"Ринат Ахметов: "Восстановление модели трехмерного объекта по видеопотоку"
Ринат Ахметов: "Восстановление модели трехмерного объекта по видеопотоку"
Provectus
 
Social@Scale Summit Hosted by Nestle Purina Agenda
Social@Scale Summit Hosted by Nestle Purina AgendaSocial@Scale Summit Hosted by Nestle Purina Agenda
Social@Scale Summit Hosted by Nestle Purina Agenda
Jennifer Clemente
 
QA MeetUp - Тимур Батыршин: "Тестирование серверной конфигурации"
QA MeetUp - Тимур Батыршин: "Тестирование серверной конфигурации"QA MeetUp - Тимур Батыршин: "Тестирование серверной конфигурации"
QA MeetUp - Тимур Батыршин: "Тестирование серверной конфигурации"
Provectus
 
Константин Макарычев (Provectus) - "Про Open Source"
Константин Макарычев (Provectus) - "Про Open Source"Константин Макарычев (Provectus) - "Про Open Source"
Константин Макарычев (Provectus) - "Про Open Source"
Provectus
 

Destaque (9)

Climate change
Climate changeClimate change
Climate change
 
883 THISTLE DOWN CIRCLE - Sept 10 (EXISTING)
883 THISTLE DOWN CIRCLE - Sept 10 (EXISTING)883 THISTLE DOWN CIRCLE - Sept 10 (EXISTING)
883 THISTLE DOWN CIRCLE - Sept 10 (EXISTING)
 
Андрей Сильчук для QA Expert Day
Андрей Сильчук для QA Expert DayАндрей Сильчук для QA Expert Day
Андрей Сильчук для QA Expert Day
 
Станислав Иващенко: “Kubernetes как облако для CI”
Станислав Иващенко: “Kubernetes как облако для CI” Станислав Иващенко: “Kubernetes как облако для CI”
Станислав Иващенко: “Kubernetes как облако для CI”
 
Ринат Ахметов: "Восстановление модели трехмерного объекта по видеопотоку"
Ринат Ахметов: "Восстановление модели трехмерного объекта по видеопотоку"Ринат Ахметов: "Восстановление модели трехмерного объекта по видеопотоку"
Ринат Ахметов: "Восстановление модели трехмерного объекта по видеопотоку"
 
Social@Scale Summit Hosted by Nestle Purina Agenda
Social@Scale Summit Hosted by Nestle Purina AgendaSocial@Scale Summit Hosted by Nestle Purina Agenda
Social@Scale Summit Hosted by Nestle Purina Agenda
 
QA MeetUp - Тимур Батыршин: "Тестирование серверной конфигурации"
QA MeetUp - Тимур Батыршин: "Тестирование серверной конфигурации"QA MeetUp - Тимур Батыршин: "Тестирование серверной конфигурации"
QA MeetUp - Тимур Батыршин: "Тестирование серверной конфигурации"
 
Альмеев Азат - создание коллажа из фотографий в iOS приложении
Альмеев Азат - создание коллажа из фотографий в iOS приложенииАльмеев Азат - создание коллажа из фотографий в iOS приложении
Альмеев Азат - создание коллажа из фотографий в iOS приложении
 
Константин Макарычев (Provectus) - "Про Open Source"
Константин Макарычев (Provectus) - "Про Open Source"Константин Макарычев (Provectus) - "Про Open Source"
Константин Макарычев (Provectus) - "Про Open Source"
 

Semelhante a Expert Fridays - Сергей Укустов: "CRDT"

Опыт разработки статического анализатора кода
Опыт разработки статического анализатора кодаОпыт разработки статического анализатора кода
Опыт разработки статического анализатора кода
Andrey Karpov
 
Ekb 2013 artemkin(1)
Ekb 2013 artemkin(1)Ekb 2013 artemkin(1)
Ekb 2013 artemkin(1)
Optima-PROMO
 

Semelhante a Expert Fridays - Сергей Укустов: "CRDT" (9)

разработка бизнес приложений (8)
разработка бизнес приложений (8)разработка бизнес приложений (8)
разработка бизнес приложений (8)
 
KharkivJS 2017: Коллаборативные системы и CRDT
KharkivJS 2017: Коллаборативные системы и CRDTKharkivJS 2017: Коллаборативные системы и CRDT
KharkivJS 2017: Коллаборативные системы и CRDT
 
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
 
Опыт разработки статического анализатора кода
Опыт разработки статического анализатора кодаОпыт разработки статического анализатора кода
Опыт разработки статического анализатора кода
 
Павел Артёмкин — Разработка C++ API для реализации алгоритмов на больших графах
Павел Артёмкин — Разработка C++ API для реализации алгоритмов на больших графахПавел Артёмкин — Разработка C++ API для реализации алгоритмов на больших графах
Павел Артёмкин — Разработка C++ API для реализации алгоритмов на больших графах
 
Ekb 2013 artemkin(1)
Ekb 2013 artemkin(1)Ekb 2013 artemkin(1)
Ekb 2013 artemkin(1)
 
Всеволод Поляков "История одного мониторинга"
Всеволод Поляков "История одного мониторинга"Всеволод Поляков "История одного мониторинга"
Всеволод Поляков "История одного мониторинга"
 
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
 
Сборка мусора в .NET
Сборка мусора в .NETСборка мусора в .NET
Сборка мусора в .NET
 

Mais de Provectus

AI Stack on AWS: Amazon SageMaker and Beyond
AI Stack on AWS: Amazon SageMaker and BeyondAI Stack on AWS: Amazon SageMaker and Beyond
AI Stack on AWS: Amazon SageMaker and Beyond
Provectus
 
Feature Store as a Data Foundation for Machine Learning
Feature Store as a Data Foundation for Machine LearningFeature Store as a Data Foundation for Machine Learning
Feature Store as a Data Foundation for Machine Learning
Provectus
 
MLOps and Reproducible ML on AWS with Kubeflow and SageMaker
MLOps and Reproducible ML on AWS with Kubeflow and SageMakerMLOps and Reproducible ML on AWS with Kubeflow and SageMaker
MLOps and Reproducible ML on AWS with Kubeflow and SageMaker
Provectus
 

Mais de Provectus (20)

Choosing the right IDP Solution
Choosing the right IDP SolutionChoosing the right IDP Solution
Choosing the right IDP Solution
 
Intelligent Document Processing in Healthcare. Choosing the Right Solutions.
Intelligent Document Processing in Healthcare. Choosing the Right Solutions.Intelligent Document Processing in Healthcare. Choosing the Right Solutions.
Intelligent Document Processing in Healthcare. Choosing the Right Solutions.
 
Choosing the Right Document Processing Solution for Healthcare Organizations
Choosing the Right Document Processing Solution for Healthcare OrganizationsChoosing the Right Document Processing Solution for Healthcare Organizations
Choosing the Right Document Processing Solution for Healthcare Organizations
 
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
 
AI Stack on AWS: Amazon SageMaker and Beyond
AI Stack on AWS: Amazon SageMaker and BeyondAI Stack on AWS: Amazon SageMaker and Beyond
AI Stack on AWS: Amazon SageMaker and Beyond
 
Feature Store as a Data Foundation for Machine Learning
Feature Store as a Data Foundation for Machine LearningFeature Store as a Data Foundation for Machine Learning
Feature Store as a Data Foundation for Machine Learning
 
MLOps and Reproducible ML on AWS with Kubeflow and SageMaker
MLOps and Reproducible ML on AWS with Kubeflow and SageMakerMLOps and Reproducible ML on AWS with Kubeflow and SageMaker
MLOps and Reproducible ML on AWS with Kubeflow and SageMaker
 
Cost Optimization for Apache Hadoop/Spark Workloads with Amazon EMR
Cost Optimization for Apache Hadoop/Spark Workloads with Amazon EMRCost Optimization for Apache Hadoop/Spark Workloads with Amazon EMR
Cost Optimization for Apache Hadoop/Spark Workloads with Amazon EMR
 
ODSC webinar "Kubeflow, MLFlow and Beyond — augmenting ML delivery" Stepan Pu...
ODSC webinar "Kubeflow, MLFlow and Beyond — augmenting ML delivery" Stepan Pu...ODSC webinar "Kubeflow, MLFlow and Beyond — augmenting ML delivery" Stepan Pu...
ODSC webinar "Kubeflow, MLFlow and Beyond — augmenting ML delivery" Stepan Pu...
 
"Building a Modern Data platform in the Cloud", Alex Casalboni, AWS Dev Day K...
"Building a Modern Data platform in the Cloud", Alex Casalboni, AWS Dev Day K..."Building a Modern Data platform in the Cloud", Alex Casalboni, AWS Dev Day K...
"Building a Modern Data platform in the Cloud", Alex Casalboni, AWS Dev Day K...
 
"How to build a global serverless service", Alex Casalboni, AWS Dev Day Kyiv ...
"How to build a global serverless service", Alex Casalboni, AWS Dev Day Kyiv ..."How to build a global serverless service", Alex Casalboni, AWS Dev Day Kyiv ...
"How to build a global serverless service", Alex Casalboni, AWS Dev Day Kyiv ...
 
"Automating AWS Infrastructure with PowerShell", Martin Beeby, AWS Dev Day Ky...
"Automating AWS Infrastructure with PowerShell", Martin Beeby, AWS Dev Day Ky..."Automating AWS Infrastructure with PowerShell", Martin Beeby, AWS Dev Day Ky...
"Automating AWS Infrastructure with PowerShell", Martin Beeby, AWS Dev Day Ky...
 
"Analyzing your web and application logs", Javier Ramirez, AWS Dev Day Kyiv 2...
"Analyzing your web and application logs", Javier Ramirez, AWS Dev Day Kyiv 2..."Analyzing your web and application logs", Javier Ramirez, AWS Dev Day Kyiv 2...
"Analyzing your web and application logs", Javier Ramirez, AWS Dev Day Kyiv 2...
 
"Resiliency and Availability Design Patterns for the Cloud", Sebastien Storma...
"Resiliency and Availability Design Patterns for the Cloud", Sebastien Storma..."Resiliency and Availability Design Patterns for the Cloud", Sebastien Storma...
"Resiliency and Availability Design Patterns for the Cloud", Sebastien Storma...
 
"Architecting SaaS solutions on AWS", Oleksandr Mykhalchuk, AWS Dev Day Kyiv ...
"Architecting SaaS solutions on AWS", Oleksandr Mykhalchuk, AWS Dev Day Kyiv ..."Architecting SaaS solutions on AWS", Oleksandr Mykhalchuk, AWS Dev Day Kyiv ...
"Architecting SaaS solutions on AWS", Oleksandr Mykhalchuk, AWS Dev Day Kyiv ...
 
"Developing with .NET Core on AWS", Martin Beeby, AWS Dev Day Kyiv 2019
"Developing with .NET Core on AWS", Martin Beeby, AWS Dev Day Kyiv 2019"Developing with .NET Core on AWS", Martin Beeby, AWS Dev Day Kyiv 2019
"Developing with .NET Core on AWS", Martin Beeby, AWS Dev Day Kyiv 2019
 
"How to build real-time backends", Martin Beeby, AWS Dev Day Kyiv 2019
"How to build real-time backends", Martin Beeby, AWS Dev Day Kyiv 2019"How to build real-time backends", Martin Beeby, AWS Dev Day Kyiv 2019
"How to build real-time backends", Martin Beeby, AWS Dev Day Kyiv 2019
 
"Integrate your front end apps with serverless backend in the cloud", Sebasti...
"Integrate your front end apps with serverless backend in the cloud", Sebasti..."Integrate your front end apps with serverless backend in the cloud", Sebasti...
"Integrate your front end apps with serverless backend in the cloud", Sebasti...
 
"Scaling ML from 0 to millions of users", Julien Simon, AWS Dev Day Kyiv 2019
"Scaling ML from 0 to millions of users", Julien Simon, AWS Dev Day Kyiv 2019"Scaling ML from 0 to millions of users", Julien Simon, AWS Dev Day Kyiv 2019
"Scaling ML from 0 to millions of users", Julien Simon, AWS Dev Day Kyiv 2019
 
How to implement authorization in your backend with AWS IAM
How to implement authorization in your backend with AWS IAMHow to implement authorization in your backend with AWS IAM
How to implement authorization in your backend with AWS IAM
 

Expert Fridays - Сергей Укустов: "CRDT"

  • 1. Conflict-free Replicated Data Type Функциональный подход к распределённым системам Сергей Укустов
  • 2. «Умные структуры данных и тупой код работают куда лучше, чем наоборот» Эрик Раймонд
  • 3. Распределённые системы • Много общающихся машин • Общее состояние • Бывает разное • CAP теорема • Consistency, Availability, Partitioning – выберите любые два • CALM теорема • Consistency as logical monotonicity – система может быть распределённой, если она не удаляет исторические факты
  • 4.
  • 5. CRDT • Тип структур данных для eventually consistent систем • Формально доказано: состояние системы сходится • CAP теорема: выкидываем строгую consistency • CALM теорема: строгая гарантия eventual consistency
  • 6. CRDT: State-based • Множество <A, combine> • a combine (b combine c) == (a combine b) combine c • a combine b == b combine a • a combine a == a • Необходимо есть нулевой элемент • Ограниченная полурешетка AKA коммутативный идемпотентный моноид • Частичный порядок
  • 7. G-Counter • Можно только увеличивать счётчик case class GCounter[R, E](state: Map[R, E])(implicit num: Numeric[E]) import com.machinomy.crdt.state._ import cats.syntax.all._ import cats._ val counter = Monoid[GCounter[Int, Int]].empty // empty G-Counter val firstReplica = counter + (1 -> 1) // increment replica 1 val secondReplica = counter + (2 -> 2) // increment replica 2 val firstReplicacombined = firstReplica |+| secondReplica // combine val secondReplicacombined = secondReplica |+| firstReplica // combine firstReplicacombined == secondReplicacombined // the result is independent of combine order
  • 8. PN-Counter • Можно делать инкремент и декремент class PNCounter[K, E: Numeric](increments: GCounter[K, E], decrements: GCounter[K, E]) import com.machinomy.crdt.state._ import cats.syntax.all._ import cats._ val counter = Monoid[PNCounter[Int, Int]].empty val firstReplica = counter + (1 -> 1) // increment replica 1 val secondReplica = counter + (2 -> -2) // decrement replica 2 val firstReplicacombined = firstReplica |+| secondReplica // combine val secondReplicacombined = secondReplica |+| firstReplica // combine firstReplicacombined == secondReplicacombined // the result is independent of combine order
  • 9. G-Set • Только добавление, `combine` объединяет множества • class GSet[E](val state: Set[E]) import com.machinomy.crdt.state._ import cats.syntax.all._ import cats._ val counter = Monoid[GSet[Int]].empty // empty G-Set val firstReplica = counter + 1 // add element val secondReplica = counter + 2 // add element val firstReplicacombined = firstReplica |+| secondReplica // combine val secondReplicacombined = secondReplica |+| firstReplica // combine firstReplicacombined == secondReplicacombined // the result is independent of combine order
  • 10. И ещё… • GT-Set • MC-Set • OR-Set • TP-Set • LWW-Element-Set • LWW-Register • …
  • 11. CRDT: Op-based • Передаём операции по сети, а не состояние S · f · g = S · g · f • Можно эмулировать поверх state-based, и наоборот
  • 12. Op-based Counter case class Counter[E: Numeric](value: E) def update[E: Numeric](counter: Counter[E], update: Update[E]): Counter[E] = update match { case Counter.Increment(i) => Counter(num.plus(counter.value, i)) case Counter.Decrement(i) => Counter(num.minus(counter.value, i)) }
  • 13. Op-based ORSet case class ORSet[E, T: TombStone](state: Map[E, Set[T]])
  • 14. 2P2P-Graph case class TPTPGraph[A, V <: VertexLike[A], E <: EdgeLike[A, V]] (va: Set[V], vr: Set[V], ea: Set[E], er: Set[E]) • Можно добавлять и удалять элементы • Но никаких гарантий!
  • 16. Monotonic DAG case class MonotonicDag[V, E[X] <: DiEdgeLikeIn[X], G <: Graph[V, E]](graph: G) type UpdateResult[V, E[X] <: DiEdgeLikeIn[X], G <: Graph[V, E]] = (MonotonicDag[V, E, G], Option[Update[V, E, G]]) def add(e: E[V] with OuterEdge[V, E]): MonotonicDag.UpdateResult[V, E, G] = { val from = graphLike.fromVertex(graph, e) val to = graphLike.toVertex(value, e) val containsSource = graphLike.contains(value, from) val containsDestination = graphLike.contains(value, to) val effective = graphLike.addEdge(value, e) if (containsSource && containsDestination && graphLike.existsPath(effective, from, to)) { (MonotonicDag[V, E, G](effective), Some(MonotonicDag.AddEdge[V, E, G](e))) } else { (this, None) } }
  • 17. Pro et Contra • Простая логика • Стабильное теоретическое обоснование • Лучше, чем OT • Социальное доказательство • Непонятно, что делать с BFT • Необходимо обеспечить стабильный канал • Сложно найти подходящую реализацию https://github.com/machinomy/crdt https://www.mendeley.com/groups/9275881/crdt/papers/ sergey.ukustov@machinomy.com