Upload
alina-dolgikh
View
2.453
Download
1
Embed Size (px)
Citation preview
NoSQL unSUCCESSFUL story. Выбор и интеграция NoSQL решения в Enterprise систему
Email: [email protected]
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
Yahoo
Yandex
MapQuest/O
SM
Bing
Look around
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: [email protected]
Skype: uladzimir_ziankevich
Linkedin: https://www.linkedin.com/pub/uladzimir-ziankevich/71/256/82