Архитектура apache ignite .net

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

Upload: mikhail-shcherbakov

Post on 11-Feb-2017

109 views

Category:

Technology


5 download

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

Вопросы?