no sql unsuccessful_story. Владимир Зеленкевич

80
NoSQL unSUCCESSFUL story. Выбор и интеграция NoSQL решения в Enterprise систему Email: [email protected] Skype: uladzimir_ziankevich Владимир Зенькевич ведущий разработчик

Upload: alina-dolgikh

Post on 12-Aug-2015

2.453 views

Category:

Software


1 download

TRANSCRIPT

Page 1: No sql unsuccessful_story. Владимир Зеленкевич

NoSQL unSUCCESSFUL story. Выбор и интеграция NoSQL решения в Enterprise систему

Email: [email protected]

Skype: uladzimir_ziankevich

Владимир Зенькевич

ведущий разработчик

Page 2: No sql unsuccessful_story. Владимир Зеленкевич

Кто я?

Page 3: No sql unsuccessful_story. Владимир Зеленкевич

Чем хочу поделиться

Experience > NoSQL

Page 4: No sql unsuccessful_story. Владимир Зеленкевич

Завязка

Page 5: No sql unsuccessful_story. Владимир Зеленкевич

Завязка

Republic of Byelarus

Republic of Belarus

Belarus

Page 6: No sql unsuccessful_story. Владимир Зеленкевич

Завязка

Republic of Byelarus

Republic of Belarus

Belarus

Weißrussland

Page 7: No sql unsuccessful_story. Владимир Зеленкевич

Завязка

Bélarus

Biélorussie

Bielorussie

Republic of Byelarus

Republic of Belarus

Belarus

Weißrussland

Page 8: No sql unsuccessful_story. Владимир Зеленкевич

Завязка

Bélarus

Biélorussie

Bielorussie

Republic of Byelarus

Republic of Belarus

Belarus

Weißrussland

白俄羅斯

Page 9: No sql unsuccessful_story. Владимир Зеленкевич

Задача

1. Производительность

2. Custom Locations

Page 10: No sql unsuccessful_story. Владимир Зеленкевич

Look around

Google

Yahoo

Yandex

MapQuest/O

SM

Bing

Page 11: No sql unsuccessful_story. Владимир Зеленкевич

Look around

Google

Yahoo

Yandex

MapQuest/O

SM

Bing

Page 12: No sql unsuccessful_story. Владимир Зеленкевич

Как?

Page 13: No sql unsuccessful_story. Владимир Зеленкевич

Как?

MS SQL expert знания

legacy, риски

Page 14: No sql unsuccessful_story. Владимир Зеленкевич

Как?

MS SQL expert знания

legacy, риски SOLR

advanced знания

гарантированная скорость

успешное использование

реиндексация

Page 15: No sql unsuccessful_story. Владимир Зеленкевич

Как?

MS SQL expert знания

legacy, риски SOLR

advanced знания

гарантированная скорость

успешное использование

реиндексация

NoSQL novice знания

креативность

Page 16: No sql unsuccessful_story. Владимир Зеленкевич

Document

KeyValue

Object

BlaBlaBla

... Column

Based

Graph

Page 17: No sql unsuccessful_story. Владимир Зеленкевич

Document

KeyValue

Object

BlaBlaBla

... Column

Based

Graph

Page 18: No sql unsuccessful_story. Владимир Зеленкевич

Немного теории

Graph databases allow you to store entities and relationships between these entities. (Martin Fawler)

V1

V2

E1

Entity Vertex Node

Edge

Relationship

Page 19: No sql unsuccessful_story. Владимир Зеленкевич

Немного теории

*NoSQL Distilled – Martin Fowler

A query on the graph is “traversing” the graph.

Page 20: No sql unsuccessful_story. Владимир Зеленкевич

Немного теории

От RDBMS к Graph DB

RDBMS

Graph в RDBMS

Page 21: No sql unsuccessful_story. Владимир Зеленкевич

Немного теории

Page 22: No sql unsuccessful_story. Владимир Зеленкевич

Competitors

Neo4J vs OrientDB

Page 23: No sql unsuccessful_story. Владимир Зеленкевич

Competitors

Neo4J vs OrientDB •Успешное использование

Page 24: No sql unsuccessful_story. Владимир Зеленкевич

Competitors

Neo4J vs OrientDB •Успешное использование

•SQL подобный язык

Page 25: No sql unsuccessful_story. Владимир Зеленкевич

Competitors

Neo4J vs OrientDB •Успешное использование

•SQL подобный язык

SELECT name, out(‘ACTS’).title

FROM Person WHERE name = ‘Robin’ MATCH (actor:Person{name:’Robin’})-

[:ACTS_IN]->(movie)

RETURN actor.name, movie.title

Page 26: No sql unsuccessful_story. Владимир Зеленкевич

Competitors

Neo4J vs OrientDB •Успешное использование

•SQL подобный язык

•Реализует BluePrint graph

SELECT name, out(‘ACTS’).title

FROM Person WHERE name = ‘Robin’ MATCH (actor:Person{name:’Robin’})-

[:ACTS_IN]->(movie)

RETURN actor.name, movie.title

Page 27: No sql unsuccessful_story. Владимир Зеленкевич

Competitors

Neo4J vs OrientDB •Успешное использование

•SQL подобный язык

•Реализует BluePrint graph

•Горизонтально масштабируема

SELECT name, out(‘ACTS’).title

FROM Person WHERE name = ‘Robin’ MATCH (actor:Person{name:’Robin’})-

[:ACTS_IN]->(movie)

RETURN actor.name, movie.title

Page 28: No sql unsuccessful_story. Владимир Зеленкевич

Competitors

Neo4J vs OrientDB •Успешное использование

•SQL подобный язык

•Реализует BluePrint graph

•Горизонтально масштабируема

•Бесплатна

SELECT name, out(‘ACTS’).title

FROM Person WHERE name = ‘Robin’ MATCH (actor:Person{name:’Robin’})-

[:ACTS_IN]->(movie)

RETURN actor.name, movie.title

Page 29: No sql unsuccessful_story. Владимир Зеленкевич

*http://www.orientechnologies.com/

Page 30: No sql unsuccessful_story. Владимир Зеленкевич

Competitors

Neo4J vs OrientDB

Page 31: No sql unsuccessful_story. Владимир Зеленкевич

Competitors

Neo4J vs OrientDB

Page 32: No sql unsuccessful_story. Владимир Зеленкевич

Proof of Concept

Page 33: No sql unsuccessful_story. Владимир Зеленкевич

PoC

1. Тестовые данные

~600K locations, ~1000K aliases, ~5000K edges

2. Проверка use cases

autosuggestion – 2 символа, базовая фильтрация

3. Нагрузочное тестирование

jMeter, средняя – 25 rps, пиковая – 50 rps, response time <= 75 ms

Page 34: No sql unsuccessful_story. Владимир Зеленкевич

Результаты PoC

Разработан тестовый typeahead

Нагрузочные тесты успешно пройдены

Ошибки в логах во время экспорта данных

Page 35: No sql unsuccessful_story. Владимир Зеленкевич

Финальное решение

1. Митинг

2. Участники (исполнитель, stakeholders, CTO, тех. Лид, Programm Manager)

3. Pros and Cons

4. Решение

Page 36: No sql unsuccessful_story. Владимир Зеленкевич

Интеграция

Page 37: No sql unsuccessful_story. Владимир Зеленкевич

Интеграция

Команда из 4-х человек

Scrum

1-недельные спринты

Сделаем за 1,5 месяца

Page 38: No sql unsuccessful_story. Владимир Зеленкевич

Интеграция

Процессы и практики:

TDD

Continues integration

Continues delivery

Code review

Pair programming

BlaBlaBla…

Page 39: No sql unsuccessful_story. Владимир Зеленкевич

Интеграция

Location

Category

Alias

belongs_to

Custom

Location

Page 40: No sql unsuccessful_story. Владимир Зеленкевич

Интеграция

«Ах, как все хорошо» select from Location where name_en='Minsk'

Page 41: No sql unsuccessful_story. Владимир Зеленкевич

Интеграция

Или SELECT FROM Location WHERE name_en CONTAINSTEXT 'Bela' AND locationType IN ['CITY', 'COUNTRY'] ORDER BY population DESC, sortOrder ASC SKIP 0 LIMIT 100

Page 42: No sql unsuccessful_story. Владимир Зеленкевич

Интеграция

Или select from (traverse out('belongsToLocation') from (select from Location where locationId = 625144)) where $depth >= 1

Page 43: No sql unsuccessful_story. Владимир Зеленкевич

Кульминация

Edge cases

Page 44: No sql unsuccessful_story. Владимир Зеленкевич

Кульминация

Minsk Homel

Global

London Manchester Osaka Tokyo Beijing Shanghai

Belarus United

Kingdom Japan China

Europe Asia

Page 45: No sql unsuccessful_story. Владимир Зеленкевич

Кульминация

Minsk Homel

Global

London Manchester Osaka Tokyo Beijing Shanghai

Belarus United

Kingdom Japan China

Europe Asia

Page 46: No sql unsuccessful_story. Владимир Зеленкевич

Кульминация

Minsk Homel

Global

London Manchester Osaka Tokyo Beijing Shanghai

Belarus United

Kingdom Japan China

Europe Asia

Page 47: No sql unsuccessful_story. Владимир Зеленкевич

Кульминация

Minsk Homel

Global

London Manchester Osaka Tokyo Beijing Shanghai

Belarus United

Kingdom Japan China

Europe Asia

Page 48: No sql unsuccessful_story. Владимир Зеленкевич

Кульминация

Быстро(PoC case)

select from (traverse in('belongsToLocation') from (select from AbstractLocation where locationId = 6255148)) where $depth >= 1 AND locationType IN ['CITY'] LIMIT 20

Медленно

select from (traverse in('belongsToLocation') from (select from AbstractLocation where locationId = 6255148)) where $depth >= 1 AND locationType IN ['ADMIN_DIVISION'] LIMIT 20

Очень Медленно

select from (traverse in('belongsToLocation') from (select from AbstractLocation where locationId = 6255148)) where $depth >= 1 AND locationType IN ['COUNTRY'] LIMIT 20

Page 49: No sql unsuccessful_story. Владимир Зеленкевич

Кульминация

Minsk Homel

Global

London Manchester Osaka Tokyo Beijing Shanghai

Belarus United

Kingdom Japan China

Europe Asia

Page 50: No sql unsuccessful_story. Владимир Зеленкевич

Кульминация

Minsk Homel

Global

London Manchester Osaka Tokyo Beijing Shanghai

Belarus United

Kingdom Japan China

Europe Asia

Page 51: No sql unsuccessful_story. Владимир Зеленкевич

Кульминация

Minsk Homel

Global

London Manchester Osaka Tokyo Beijing Shanghai

Belarus United

Kingdom Japan China

Europe Asia

Page 52: No sql unsuccessful_story. Владимир Зеленкевич

Кульминация

Minsk Homel

Global

London Manchester Osaka Tokyo Beijing Shanghai

Belarus United

Kingdom Japan China

Europe Asia

Page 53: No sql unsuccessful_story. Владимир Зеленкевич

Кульминация

Но… SELECT FROM Location LET $match = (SELECT FROM (TRAVERSE out('belongsToLocation') FROM $parent.$current) WHERE locationId = 6255148 AND $depth >= 1) WHERE name_en CONTAINSTEXT 'Be' AND $match.size() > 0 ORDER BY population DESC, sortOrder ASC SKIP 0 LIMIT 100 SELECT FROM Location LET $match = (SELECT FROM (TRAVERSE out('belongsToLocation') FROM $parent.$current) WHERE locationId = 6252001 AND $depth >= 1) WHERE name_en CONTAINSTEXT '10' AND $match.size() > 0 ORDER BY population DESC, sortOrder ASC SKIP 0 LIMIT 100 SELECT FROM Location LET $match = (SELECT FROM (TRAVERSE out('belongsToLocation') FROM $parent.$current) WHERE locationId = 4138106 AND $depth >= 1) WHERE name_en CONTAINSTEXT '20' AND $match.size() > 0 ORDER BY population DESC, sortOrder ASC SKIP 0 LIMIT 100

Page 54: No sql unsuccessful_story. Владимир Зеленкевич

Кульминация

Некоторые бизнес требования привели к select in_uselanguage.out.locationId[0] as locationId, in_uselanguage.out.name_en[0] as locName, in_uselanguage.out.population[0] as population, in_uselanguage.out.locationType[0] as type from LocationAlias let $match = (select from (traverse out('belongsToLocation') from (select expand(in("uselanguage")) from $parent.$parent.$current)) where locationId = 6255148 and $depth >= 1) where upperName CONTAINSTEXT '77' and $match.size() > 0 and in_uselanguage.out.locationType[0] IN ['POSTAL_CODE', 'CITY', 'ADMIN_DIVISION', 'COUNTRY', 'REGION'] group by in_uselanguage.out.locationId order by population desc limit 10

Page 55: No sql unsuccessful_story. Владимир Зеленкевич

Кульминация

Sharding и Multi-master Replication…

Page 56: No sql unsuccessful_story. Владимир Зеленкевич

*http://www.orientechnologies.com/

Page 57: No sql unsuccessful_story. Владимир Зеленкевич

*http://www.orientechnologies.com/

Page 58: No sql unsuccessful_story. Владимир Зеленкевич

Кульминация

Но…

саппорт

Page 59: No sql unsuccessful_story. Владимир Зеленкевич

Кульминация

Но…

workarounds вместо решений.

Page 60: No sql unsuccessful_story. Владимир Зеленкевич

Кульминация

select count(*) from AbstractLocation where locationType = 'COUNTRY' OR isCustom = true

select unionall($a,$b) let $a = (select from AbstractLocation where locationType = 'COUNTRY' ), $b = (select from AbstractLocation where isCustom = true )

Page 61: No sql unsuccessful_story. Владимир Зеленкевич

Кульминация

Но…

Нестабильность

Page 62: No sql unsuccessful_story. Владимир Зеленкевич

Кульминация

Но…

Медленно

Page 63: No sql unsuccessful_story. Владимир Зеленкевич

FAIL

В лайв не вышли

Реструктуризация

Page 64: No sql unsuccessful_story. Владимир Зеленкевич

Root Cause Analysis

Page 65: No sql unsuccessful_story. Владимир Зеленкевич

Root Cause Analysis

Взгляд снаружи

Page 66: No sql unsuccessful_story. Владимир Зеленкевич

Root Cause Analysis

Взгляд снаружи

1. Профессионализм команды

Page 67: No sql unsuccessful_story. Владимир Зеленкевич

Root Cause Analysis

Взгляд снаружи

1. Профессионализм команды

2. Сроки

Page 68: No sql unsuccessful_story. Владимир Зеленкевич

Root Cause Analysis

Взгляд снаружи

1. Профессионализм команды

2. Сроки

3. Процесс

Page 69: No sql unsuccessful_story. Владимир Зеленкевич

Root Cause Analysis

Взгляд снаружи

1. Профессионализм команды

2. Сроки

3. Процесс

4. Инструментарий???…

Page 70: No sql unsuccessful_story. Владимир Зеленкевич

Root Cause Analysis

Взгляд снаружи

Ошибки и выводы:

Page 71: No sql unsuccessful_story. Владимир Зеленкевич

Root Cause Analysis

Взгляд снаружи

Ошибки и выводы:

1. Экспертиза команды

Page 72: No sql unsuccessful_story. Владимир Зеленкевич

Root Cause Analysis

Взгляд снаружи

Ошибки и выводы:

1. Экспертиза команды

2. Качественный PoC

Page 73: No sql unsuccessful_story. Владимир Зеленкевич

Root Cause Analysis

Взгляд снаружи

Ошибки и выводы:

1. Экспертиза команды

2. Качественный PoC

a) Достаточное время

b) Время жизни продукта

c) Команда продукта

d) Документация

e) Support в начале

f) Примеры интеграции (live references)

g) Качественный и обоснованный набор проверяемых историй (the most risky first)

Page 74: No sql unsuccessful_story. Владимир Зеленкевич

Root Cause Analysis

Взгляд изнутри

Конечное решение НЕ за исполнителем

Финальное решение должно быть на стороне человека, осуществляющего техническое руководство.

Page 75: No sql unsuccessful_story. Владимир Зеленкевич

Root Cause Analysis

Взгляд изнутри

Нет субъективным оценкам В идеале, лучше воздержаться от субъективных персональных оценок и основываться на объективных результатах наблюдений.

Page 76: No sql unsuccessful_story. Владимир Зеленкевич

Root Cause Analysis

Взгляд изнутри

Доверяй, но проверяй

Page 77: No sql unsuccessful_story. Владимир Зеленкевич

Root Cause Analysis

Взгляд изнутри

Новое – не обязательно лучшее

Page 78: No sql unsuccessful_story. Владимир Зеленкевич

Root Cause Analysis

Взгляд изнутри

Ответственность

Page 79: No sql unsuccessful_story. Владимир Зеленкевич

OrientDB version 2