SlideShare a Scribd company logo
NoSQL unSUCCESSFUL story.
Выбор и интеграция NoSQL решения в Enterprise систему
Email: v.zenkevich@intetics.com
Skype: uladzimir_ziankevich
Владимир Зенькевич
ведущий разработчик
Кто я?
Чем хочу поделиться
Experience > NoSQL
Завязка
Завязка
Republic of Byelarus
Republic of Belarus
Belarus
Завязка
Republic of Byelarus
Republic of Belarus
Belarus
Weißrussland
Завязка
Bélarus
Biélorussie
Bielorussie
Republic of Byelarus
Republic of Belarus
Belarus
Weißrussland
Завязка
Bélarus
Biélorussie
Bielorussie
Republic of Byelarus
Republic of Belarus
Belarus
Weißrussland
白俄羅斯
Задача
1. Производительность
2. Custom Locations
Look around
Google
Yahoo
Yandex
MapQuest/O
SM
Bing
Look around
Google
Yahoo
Yandex
MapQuest/O
SM
Bing
Как?
Как?
MS SQL
expert знания
legacy, риски
Как?
MS SQL
expert знания
legacy, риски
SOLR
advanced знания
гарантированная скорость
успешное использование
реиндексация
Как?
MS SQL
expert знания
legacy, риски
SOLR
advanced знания
гарантированная скорость
успешное использование
реиндексация
NoSQL
novice знания
креативность
Document
KeyValue
Object
BlaBlaBla
...
Column
Based
Graph
Document
KeyValue
Object
BlaBlaBla
...
Column
Based
Graph
Немного теории
Graph databases allow you to store entities and relationships between these
entities. (Martin Fawler)
V1
V2
E1
Entity
Vertex
Node
Edge
Relationship
Немного теории
*NoSQL Distilled – Martin Fowler
A query on the graph is “traversing” the graph.
Немного теории
От RDBMS к Graph DB
RDBMS
Graph в RDBMS
Немного теории
Competitors
Neo4J vs OrientDB
Competitors
Neo4J vs OrientDB
•Успешное использование
Competitors
Neo4J vs OrientDB
•Успешное использование
•SQL подобный язык
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
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
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
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
*http://www.orientechnologies.com/
Competitors
Neo4J vs OrientDB
Competitors
Neo4J vs OrientDB
Proof of Concept
PoC
1. Тестовые данные
~600K locations, ~1000K aliases, ~5000K edges
2. Проверка use cases
autosuggestion – 2 символа, базовая фильтрация
3. Нагрузочное тестирование
jMeter, средняя – 25 rps, пиковая – 50 rps, response time <= 75 ms
Результаты PoC
Разработан тестовый typeahead
Нагрузочные тесты успешно пройдены
Ошибки в логах во время экспорта данных
Финальное решение
1. Митинг
2. Участники (исполнитель, stakeholders, CTO, тех. Лид, Programm
Manager)
3. Pros and Cons
4. Решение
Интеграция
Интеграция
Команда из 4-х человек
Scrum
1-недельные спринты
Сделаем за 1,5 месяца
Интеграция
Процессы и практики:
TDD
Continues integration
Continues delivery
Code review
Pair programming
BlaBlaBla…
Интеграция
Location
Category
Alias
belongs_to
Custom
Location
Интеграция
«Ах, как все хорошо»
select from Location where name_en='Minsk'
Интеграция
Или
SELECT FROM Location
WHERE name_en CONTAINSTEXT 'Bela'
AND locationType IN ['CITY', 'COUNTRY']
ORDER BY population DESC, sortOrder ASC
SKIP 0 LIMIT 100
Интеграция
Или
select from
(traverse out('belongsToLocation') from
(select from Location where locationId = 625144))
where $depth >= 1
Кульминация
Edge cases
Кульминация
Minsk Homel
Global
London Manchester Osaka Tokyo Beijing Shanghai
Belarus United
Kingdom Japan China
Europe Asia
Кульминация
Minsk Homel
Global
London Manchester Osaka Tokyo Beijing Shanghai
Belarus United
Kingdom Japan China
Europe Asia
Кульминация
Minsk Homel
Global
London Manchester Osaka Tokyo Beijing Shanghai
Belarus United
Kingdom Japan China
Europe Asia
Кульминация
Minsk Homel
Global
London Manchester Osaka Tokyo Beijing Shanghai
Belarus United
Kingdom Japan China
Europe Asia
Кульминация
Быстро(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
Кульминация
Minsk Homel
Global
London Manchester Osaka Tokyo Beijing Shanghai
Belarus United
Kingdom Japan China
Europe Asia
Кульминация
Minsk Homel
Global
London Manchester Osaka Tokyo Beijing Shanghai
Belarus United
Kingdom Japan China
Europe Asia
Кульминация
Minsk Homel
Global
London Manchester Osaka Tokyo Beijing Shanghai
Belarus United
Kingdom Japan China
Europe Asia
Кульминация
Minsk Homel
Global
London Manchester Osaka Tokyo Beijing Shanghai
Belarus United
Kingdom Japan China
Europe Asia
Кульминация
Но…
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
Кульминация
Некоторые бизнес требования привели к
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
Кульминация
Sharding и Multi-master Replication…
*http://www.orientechnologies.com/
*http://www.orientechnologies.com/
Кульминация
Но…
саппорт
Кульминация
Но…
workarounds вместо решений.
Кульминация
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 )
Кульминация
Но…
Нестабильность
Кульминация
Но…
Медленно
FAIL
В лайв не вышли
Реструктуризация
Root Cause Analysis
Root Cause Analysis
Взгляд снаружи
Root Cause Analysis
Взгляд снаружи
1. Профессионализм команды
Root Cause Analysis
Взгляд снаружи
1. Профессионализм команды
2. Сроки
Root Cause Analysis
Взгляд снаружи
1. Профессионализм команды
2. Сроки
3. Процесс
Root Cause Analysis
Взгляд снаружи
1. Профессионализм команды
2. Сроки
3. Процесс
4. Инструментарий???…
Root Cause Analysis
Взгляд снаружи
Ошибки и выводы:
Root Cause Analysis
Взгляд снаружи
Ошибки и выводы:
1. Экспертиза команды
Root Cause Analysis
Взгляд снаружи
Ошибки и выводы:
1. Экспертиза команды
2. Качественный PoC
Root Cause Analysis
Взгляд снаружи
Ошибки и выводы:
1. Экспертиза команды
2. Качественный PoC
a) Достаточное время
b) Время жизни продукта
c) Команда продукта
d) Документация
e) Support в начале
f) Примеры интеграции (live references)
g) Качественный и обоснованный набор проверяемых историй
(the most risky first)
Root Cause Analysis
Взгляд изнутри
Конечное решение НЕ за исполнителем
Финальное решение должно быть на стороне человека,
осуществляющего техническое руководство.
Root Cause Analysis
Взгляд изнутри
Нет субъективным оценкам
В идеале, лучше воздержаться от субъективных персональных оценок и
основываться на объективных результатах наблюдений.
Root Cause Analysis
Взгляд изнутри
Доверяй, но проверяй
Root Cause Analysis
Взгляд изнутри
Новое – не обязательно лучшее
Root Cause Analysis
Взгляд изнутри
Ответственность
OrientDB version 2
Спасибо
Email: v.zenkevich@intetics.com
Skype: uladzimir_ziankevich
Linkedin:
https://www.linkedin.com/pub/uladzimir-ziankevich/71/256/82

More Related Content

More from Alina Dolgikh

Reactive streams. Slava Schmidt
Reactive streams. Slava SchmidtReactive streams. Slava Schmidt
Reactive streams. Slava Schmidt
Alina Dolgikh
 
David Mertz. Type Annotations. PyCon Belarus 2015
David Mertz. Type Annotations. PyCon Belarus 2015David Mertz. Type Annotations. PyCon Belarus 2015
David Mertz. Type Annotations. PyCon Belarus 2015
Alina Dolgikh
 
Владимир Еремин. Extending Openstack. PyCon Belarus 2015
Владимир Еремин. Extending Openstack. PyCon Belarus 2015Владимир Еремин. Extending Openstack. PyCon Belarus 2015
Владимир Еремин. Extending Openstack. PyCon Belarus 2015
Alina Dolgikh
 
Кирилл Борисов. Code style_checking_v2. PyCon Belarus 2015
Кирилл Борисов. Code style_checking_v2. PyCon Belarus 2015Кирилл Борисов. Code style_checking_v2. PyCon Belarus 2015
Кирилл Борисов. Code style_checking_v2. PyCon Belarus 2015
Alina Dolgikh
 
Володимир Гоцик. Getting maximum of python, django with postgres 9.4. PyCon B...
Володимир Гоцик. Getting maximum of python, django with postgres 9.4. PyCon B...Володимир Гоцик. Getting maximum of python, django with postgres 9.4. PyCon B...
Володимир Гоцик. Getting maximum of python, django with postgres 9.4. PyCon B...
Alina Dolgikh
 
Андрей Солдатенко. Разработка высокопроизводительныx функциональных тестов д...
Андрей Солдатенко. Разработка высокопроизводительныx функциональных тестов д...Андрей Солдатенко. Разработка высокопроизводительныx функциональных тестов д...
Андрей Солдатенко. Разработка высокопроизводительныx функциональных тестов д...
Alina Dolgikh
 
Austin Bingham. Transducers in Python. PyCon Belarus
Austin Bingham. Transducers in Python. PyCon BelarusAustin Bingham. Transducers in Python. PyCon Belarus
Austin Bingham. Transducers in Python. PyCon Belarus
Alina Dolgikh
 
Austin Bingham. Python Refactoring. PyCon Belarus
Austin Bingham. Python Refactoring. PyCon BelarusAustin Bingham. Python Refactoring. PyCon Belarus
Austin Bingham. Python Refactoring. PyCon Belarus
Alina Dolgikh
 
Denis Lebedev. Non functional swift.
Denis Lebedev. Non functional swift.Denis Lebedev. Non functional swift.
Denis Lebedev. Non functional swift.
Alina Dolgikh
 
Максим Лапшин. Erlang production
Максим Лапшин. Erlang productionМаксим Лапшин. Erlang production
Максим Лапшин. Erlang production
Alina Dolgikh
 
Максим Харченко. Erlang lincx
Максим Харченко. Erlang lincxМаксим Харченко. Erlang lincx
Максим Харченко. Erlang lincx
Alina Dolgikh
 
Пиар в стартапе: извлекаем максимум пользы. Алексей Лартей
Пиар в стартапе: извлекаем максимум пользы. Алексей ЛартейПиар в стартапе: извлекаем максимум пользы. Алексей Лартей
Пиар в стартапе: извлекаем максимум пользы. Алексей Лартей
Alina Dolgikh
 
Подготовка проекта к первому раунду инвестиций. Дмитрий Поляков
Подготовка проекта к первому раунду инвестиций. Дмитрий ПоляковПодготовка проекта к первому раунду инвестиций. Дмитрий Поляков
Подготовка проекта к первому раунду инвестиций. Дмитрий Поляков
Alina Dolgikh
 
Как составлять правильный тизер для инвесторов? Никита Рогозин
Как составлять правильный тизер для инвесторов? Никита РогозинКак составлять правильный тизер для инвесторов? Никита Рогозин
Как составлять правильный тизер для инвесторов? Никита Рогозин
Alina Dolgikh
 
Startup belarus pres_khamiankova
Startup belarus pres_khamiankovaStartup belarus pres_khamiankova
Startup belarus pres_khamiankovaAlina Dolgikh
 

More from Alina Dolgikh (16)

Reactive streams. Slava Schmidt
Reactive streams. Slava SchmidtReactive streams. Slava Schmidt
Reactive streams. Slava Schmidt
 
David Mertz. Type Annotations. PyCon Belarus 2015
David Mertz. Type Annotations. PyCon Belarus 2015David Mertz. Type Annotations. PyCon Belarus 2015
David Mertz. Type Annotations. PyCon Belarus 2015
 
Владимир Еремин. Extending Openstack. PyCon Belarus 2015
Владимир Еремин. Extending Openstack. PyCon Belarus 2015Владимир Еремин. Extending Openstack. PyCon Belarus 2015
Владимир Еремин. Extending Openstack. PyCon Belarus 2015
 
Кирилл Борисов. Code style_checking_v2. PyCon Belarus 2015
Кирилл Борисов. Code style_checking_v2. PyCon Belarus 2015Кирилл Борисов. Code style_checking_v2. PyCon Belarus 2015
Кирилл Борисов. Code style_checking_v2. PyCon Belarus 2015
 
Володимир Гоцик. Getting maximum of python, django with postgres 9.4. PyCon B...
Володимир Гоцик. Getting maximum of python, django with postgres 9.4. PyCon B...Володимир Гоцик. Getting maximum of python, django with postgres 9.4. PyCon B...
Володимир Гоцик. Getting maximum of python, django with postgres 9.4. PyCon B...
 
Андрей Солдатенко. Разработка высокопроизводительныx функциональных тестов д...
Андрей Солдатенко. Разработка высокопроизводительныx функциональных тестов д...Андрей Солдатенко. Разработка высокопроизводительныx функциональных тестов д...
Андрей Солдатенко. Разработка высокопроизводительныx функциональных тестов д...
 
Austin Bingham. Transducers in Python. PyCon Belarus
Austin Bingham. Transducers in Python. PyCon BelarusAustin Bingham. Transducers in Python. PyCon Belarus
Austin Bingham. Transducers in Python. PyCon Belarus
 
Austin Bingham. Python Refactoring. PyCon Belarus
Austin Bingham. Python Refactoring. PyCon BelarusAustin Bingham. Python Refactoring. PyCon Belarus
Austin Bingham. Python Refactoring. PyCon Belarus
 
Denis Lebedev. Non functional swift.
Denis Lebedev. Non functional swift.Denis Lebedev. Non functional swift.
Denis Lebedev. Non functional swift.
 
Максим Лапшин. Erlang production
Максим Лапшин. Erlang productionМаксим Лапшин. Erlang production
Максим Лапшин. Erlang production
 
Максим Харченко. Erlang lincx
Максим Харченко. Erlang lincxМаксим Харченко. Erlang lincx
Максим Харченко. Erlang lincx
 
Пиар в стартапе: извлекаем максимум пользы. Алексей Лартей
Пиар в стартапе: извлекаем максимум пользы. Алексей ЛартейПиар в стартапе: извлекаем максимум пользы. Алексей Лартей
Пиар в стартапе: извлекаем максимум пользы. Алексей Лартей
 
Подготовка проекта к первому раунду инвестиций. Дмитрий Поляков
Подготовка проекта к первому раунду инвестиций. Дмитрий ПоляковПодготовка проекта к первому раунду инвестиций. Дмитрий Поляков
Подготовка проекта к первому раунду инвестиций. Дмитрий Поляков
 
Как составлять правильный тизер для инвесторов? Никита Рогозин
Как составлять правильный тизер для инвесторов? Никита РогозинКак составлять правильный тизер для инвесторов? Никита Рогозин
Как составлять правильный тизер для инвесторов? Никита Рогозин
 
Startup belarus pres_khamiankova
Startup belarus pres_khamiankovaStartup belarus pres_khamiankova
Startup belarus pres_khamiankova
 
Pr talk lartey
Pr talk larteyPr talk lartey
Pr talk lartey
 

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