Top Banner
Архитектура Apache Ignite.NET Владимир Озеров GridGain
55

Архитектура Apache Ignite .NET

Feb 11, 2017

Download

Technology

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Архитектура Apache Ignite .NET

Архитектура Apache Ignite.NET

Владимир ОзеровGridGain

Page 2: Архитектура Apache Ignite .NET

2

План

• Почему

• Interop

• Native

Page 3: Архитектура Apache Ignite .NET

3

Кто?

Page 4: Архитектура Apache Ignite .NET

4

План

• Почему

• Interop

• Native

Page 5: Архитектура Apache Ignite .NET

5

Почему: тонкие клиенты

Page 6: Архитектура Apache Ignite .NET

6

Почему: тонкие клиенты

За:• Легко сделать

Против:• Ограниченный

Page 7: Архитектура Apache Ignite .NET

7

Почему: объединить Java client и server

Page 8: Архитектура Apache Ignite .NET

8

Почему: объединить Java client и server

За:• Полноценный

Против:• Тяжелее

Page 9: Архитектура Apache Ignite .NET

9

Почему: создание с нуля

Page 10: Архитектура Apache Ignite .NET

10

Почему: создание с нуля

За:• Естественно• Перфоманс• Полноценный

Против:• С нуля• Надо менять Java• Поддержка

Page 11: Архитектура Apache Ignite .NET

11

Создание с нуля: поддержка

Page 12: Архитектура Apache Ignite .NET

12

Создание с нуля: поддержка

Page 13: Архитектура Apache Ignite .NET

13

Создание с нуля: поддержка

Page 14: Архитектура Apache Ignite .NET

14

Создание с нуля: поддержка

Page 15: Архитектура Apache Ignite .NET

15

Почему: переиспользование Java core

Page 16: Архитектура Apache Ignite .NET

16

Почему: переиспользование Java core

За:• Общий код• Легко сделать• Полноценный

Против:• Странно!• Медленнее

нативного

Page 17: Архитектура Apache Ignite .NET

17

Переиспользование Java core

Page 18: Архитектура Apache Ignite .NET

18

Переиспользование Java core

OVERHEAD!

Page 19: Архитектура Apache Ignite .NET

19

План

• Почему

• Interop

• Native

Page 20: Архитектура Apache Ignite .NET

20

Сериализация

Page 21: Архитектура Apache Ignite .NET

21

Сериализация

За:•Нет классов

Page 22: Архитектура Apache Ignite .NET

22

Сериализация

Page 23: Архитектура Apache Ignite .NET

23

Сериализация

За:•Нет классов!

Против:•Не десериализовать

Page 24: Архитектура Apache Ignite .NET

24

Идентификаторы: TYPE_ID и FIELD_ID

1: class DotNetPerson { 2: string Name { ... } 3: 4: ... 5: }

1: class JavaPerson { 2: private String name; 3: 4: ... 5: }

TYPE_ID(DotNetPerson) == TYPE_ID(JavaPerson)

FIELD_ID(DotNetPerson.Name) == FIELD_ID(JavaPerson.name)

Page 25: Архитектура Apache Ignite .NET

25

Формат сериализации

Header• Type ID – тип объекта• Hash code – для быстрого поиска в кэше• Length – для «пропусков»• Flags – внутренности

Page 26: Архитектура Apache Ignite .NET

26

GetField("name") => OKHasField("name") => OK

Формат сериализации

Page 27: Архитектура Apache Ignite .NET

27

GetField("name") => OKHasField("name") => OK

O(N)!

Формат сериализации

Page 28: Архитектура Apache Ignite .NET

28

Поиск полей за O(1)

Header• Schema ID – «отпечаток» полей• Footer offset – быстрая навигация в футерFooter• Идентификаторы полей и их смещения

Page 29: Архитектура Apache Ignite .NET

29

int fieldId = GetFieldId("name");

Поиск полей за O(1)

Page 30: Архитектура Apache Ignite .NET

30

int fieldId = GetFieldId("name");int order = GetOrder(schemaId, fieldId);

Поиск полей за O(1)

Page 31: Архитектура Apache Ignite .NET

31

int fieldId = GetFieldId("name");int order = GetOrder(schemaId, fieldId);int offsetPos = footerPos + [X] * order;

Поиск полей за O(1)

Page 32: Архитектура Apache Ignite .NET

32

int fieldId = GetFieldId("name");int order = GetOrder(schemaId, fieldId);int offsetPos = footerPos + [X] * order;int offset = Read(offsetPos);

Поиск полей за O(1)

Page 33: Архитектура Apache Ignite .NET

33

Interop: metadata

Page 34: Архитектура Apache Ignite .NET

34

Interop: metadata

Page 35: Архитектура Apache Ignite .NET

35

Interop: metadata

Page 36: Архитектура Apache Ignite .NET

36

Interop: metadata

Page 37: Архитектура Apache Ignite .NET

37

Interop: metadata

Page 38: Архитектура Apache Ignite .NET

38

План

• Почему

• Interop

• Native

Page 39: Архитектура Apache Ignite .NET

39

Embedded JVM

Page 40: Архитектура Apache Ignite .NET

40

Embedded JVM

Page 41: Архитектура Apache Ignite .NET

41

Embedded JVM

Page 42: Архитектура Apache Ignite .NET

42

External JVM

Page 43: Архитектура Apache Ignite .NET

43

Проблемы GC

Page 44: Архитектура Apache Ignite .NET

44

Проблемы GC

Page 45: Архитектура Apache Ignite .NET

45

Проблемы GC

Page 46: Архитектура Apache Ignite .NET

46

.NET -> Java: полагаемся на финализацию

1: unsafe class UnmanagedTarget : CriticalHandle 2: { 3: public UnmanagedTarget(void* target) 4: { 5: SetHandle(new IntPtr(target)); 6: } 7: 8: protected override bool ReleaseHandle() { 9: UnmanagerUtils.Release(this);10: }11: }

Page 47: Архитектура Apache Ignite .NET

47

Java -> .NET: освобождаем явно 1: class PlatformListener { 2: private long ptr; 3: private boolean released; 4: 5: public void use() { 6: READ_LOCK { 7: if (!released) 8: NativeUtils.use(ptr); 9: }10: }11:12: public void release() {13: WRITE_LOCK {14: NativeUtils.use(ptr); 15: released = true;16: }17: }18: }

Page 48: Архитектура Apache Ignite .NET

48

Native: unique pointers

1: HandleRegistry registry; 2: 3: T Get<T>(long ptr) { 4: T target = (T)registry.Get(ptr); 5: 6: if (target == null) 7: throw new ResourceReleasedException(); 8: 9: return target;10: }

Page 49: Архитектура Apache Ignite .NET

49

Java -> .NET: освобождаем явно 1: class PlatformListener { 2: private long ptr; 3: 4: public void use() { 5: NativeUtils.use(ptr); 6: } 7: 8: public void release() { 9: NativeUtils.use(ptr); 10: }11: }

Page 50: Архитектура Apache Ignite .NET

50

Уникальные указатели

0 < ptr < X• Это индекс в массиве• Для долгоживущих объектов (cache store, listeners, etc.)

ptr >= X• Это ключ в ConcurrentDictionary• Для короткоживущих объектов (jobs, etc.)

Page 51: Архитектура Apache Ignite .NET

51

Передаем данные

Особенности:• Храним пре-аллоцированные куски в thread-local• Флаги кодируют «природу» памяти (пул или нет, Java или .Net)

Page 52: Архитектура Apache Ignite .NET

52

Передаем данные

1: using (long inPtr = MemoryManager.Allocate()) { 2: using (long outPtr = MemoryManager.Allocate()) { 3: Marshal(input, inPtr); 4: 5: Invoke(inPtr, outPtr); 6: 7: return Unmarshal<T>(outPtr); 8: } 9: }

Page 53: Архитектура Apache Ignite .NET

53

Уменьшаем оверхедКэширование• Если объект read-only, то сериализуем его 1 раз, а далее

передаем только «хэндл»

Coalescense• Один большой вызов вместо нескольких мелких

Отложенная сериализация• Если подозреваем, что сериализация не понадобиться, то

пытаемся обойтись GCHandle

Page 54: Архитектура Apache Ignite .NET

54

Контакты

Twitter:• https://twitter.com/devozerov

LinkedIn:• https://www.linkedin.com/in/devozerov

Page 55: Архитектура Apache Ignite .NET

55

Вопросы?