call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
GraphConnect 2014 SF: From Zero to Graph in 120: Scale
1. SAN
FRANCISCO
|
10.22.2014
Scaling
Neo4j
Applica0ons
@iansrobinson
2. The
Burden
of
Success
• More
users
• Larger
datasets
• More
concurrent
requests
• More
complex
queries
3. Scaling
is
a
Feature
• It
doesn’t
come
for
free
• Condi0ons
of
success:
– Understand
current
needs
• Design
for
an
order
of
magnitude
growth
– Itera0ve
and
incremental
development
– Unit
tests
• Bedrock
of
asserted
behaviour
– Performance
tests
18. Reducing
Read
Latency
• The
Blackadder
solu0on
• Improve
the
Cypher
query
• Change
the
model
• Use
an
Unmanaged
Extension
19. Improve
Cypher
Query
• Small
queries,
separated
by
WITH
• Start
from
low-‐cardinality
nodes
hp://thought-‐bytes.blogspot.co.uk/2013/01/op0mizing-‐neo4j-‐cypher-‐queries.html
hp://wes.skeweredrook.com/pragma0c-‐cypher-‐op0miza0on-‐2-‐0-‐m06/
20. Change
the
Model
Goal
Do
less
work
(in
the
query)
– By
exploring
less
of
the
graph
How?
Iden0fy
inferred
rela-onships
– Replace
with
use-‐case
specific
shortcuts
21. Change
the
Model
-‐
From
MATCH (:Person{username:'ben'})
-[:WORKED_ON]->(:Project)<-[:WORKED_ON]-
(colleague:Person)
22. Change
the
Model
-‐
From
MATCH (:Person{username:'ben'})
-[:WORKED_ON]->(:Project)<-[:WORKED_ON]-
(colleague:Person)
23. Change
the
Model
-‐
To
MATCH (:Person{username:'ben'})
-[:WORKED_WITH]-
(colleague:Person)
24. Tradeoff
More
expensive
writes
More
data
Cheaper
reads
When
to
add
the
new
rela0onship?
• With
tx
• Queue
for
subsequent
tx
• Periodic/batch
25. Refactor
Exis0ng
Data
MATCH (p1:Person)
-[:WORKED_ON]->(:Project)<-[:WORKED_ON]-
(p2:Person)
WHERE NOT ((p1)-[:WORKED_WITH]-(p2))
WITH DISTINCT p1, p2 LIMIT 10
MERGE (p1)-[r:WORKED_WITH]-(p2)
RETURN count(r)
26. Select
Batch
MATCH (p1:Person)
-[:WORKED_ON]->(:Project)<-[:WORKED_ON]-
(p2:Person)
WHERE NOT ((p1)-[:WORKED_WITH]-(p2))
WITH DISTINCT p1, p2 LIMIT 10
MERGE (p1)-[r:WORKED_WITH]-(p2)
RETURN count(r)
Batch
size
27. Add
New
Rela0onship
MATCH (p1:Person)
-[:WORKED_ON]->(:Project)<-[:WORKED_ON]-
(p2:Person)
WHERE NOT ((p1)-[:WORKED_WITH]-(p2))
WITH DISTINCT p1, p2 LIMIT 10
MERGE (p1)-[r:WORKED_WITH]-(p2)
RETURN count(r)
28. Con0nue
While
count(r)
>
0
MATCH (p1:Person)
-[:WORKED_ON]->(:Project)<-[:WORKED_ON]-
(p2:Person)
WHERE NOT ((p1)-[:WORKED_WITH]-(p2))
WITH DISTINCT p1, p2 LIMIT 10
MERGE (p1)-[r:WORKED_WITH]-(p2)
RETURN count(r)
36. 4.
Control
HTTP
Headers
GET /my-extension/service/top-10
Applica0on
Reverse
Proxy
HTTP/1.1 200 OK
Cache-Control: max-age=60
37. 5.
Integrate
with
Backend
Systems
Applica0on
REST
API
Extensions
RDBMS
LDAP
38. Migra0ng
to
Extensions
• Re-‐implement
original
query
inside
extension
• Modify
request/response
formats
and
headers
• Refactor
implementa0on
to
use
lower
parts
of
the
stack
where
necessary
• Measure,
measure,
measure
50. Factors
Impac0ng
Write
Performance
• Managing
transac0onal
state
– Crea0ng
and
commilng
are
expensive
opera0ons
• Contending
for
locks
– Nodes
and
rela0onships
65. Benefits
of
Batched
Writes
• Less
transac0onal
state
management
– Create/commit
per
batch
rather
than
per
write
• No
conten0on
for
locks
– No
deadlocks
• Query
consolida0on
– Reduce
the
amount
of
work
inside
the
database
66. Query
Consolida0on
MATCH sam
MATCH jenny
CREATE sam-[:KNOWS]-jenny
MATCH sam
MATCH sarah
CREATE sam-[:KNOWS]-sarah
CREATE address1
CREATE address2
DELETE address1
MATCH sam
CREATE sam-[:LIVES_AT]-address2
67. Eliminate
Duplicate
Lookups
MATCH sam
MATCH jenny
CREATE sam-[:KNOWS]-jenny
MATCH sam
MATCH sarah
CREATE sam-[:KNOWS]-sarah
CREATE address1
CREATE address2
DELETE address1
MATCH sam
CREATE sam-[:LIVES_AT]-address2
68. Eliminate
Duplicate
Lookups
MATCH sam
MATCH jenny
CREATE sam-[:KNOWS]-jenny
MATCH sam
MATCH sarah
CREATE sam-[:KNOWS]-sarah
CREATE address1
CREATE address2
DELETE address1
MATCH sam
CREATE sam-[:LIVES_AT]-address2
69. Eliminate
Duplicate
Lookups
MATCH sam
MATCH jenny
CREATE sam-[:KNOWS]-jenny
MATCH sarah
CREATE sam-[:KNOWS]-sarah
CREATE address1
CREATE address2
DELETE address1
CREATE sam-[:LIVES_AT]-address2
70. Eliminate
Duplicate
Lookups
MATCH sam
MATCH jenny
CREATE sam-[:KNOWS]-jenny
MATCH sarah
CREATE sam-[:KNOWS]-sarah
CREATE address1
CREATE address2
DELETE address1
CREATE sam-[:LIVES_AT]-address2
71. Eliminate
Unnecessary
Writes
MATCH sam
MATCH jenny
CREATE sam-[:KNOWS]-jenny
MATCH sarah
CREATE sam-[:KNOWS]-sarah
CREATE address1
CREATE address2
DELETE address1
CREATE sam-[:LIVES_AT]-address2
72. Eliminate
Unnecessary
Writes
MATCH sam
MATCH jenny
CREATE sam-[:KNOWS]-jenny
MATCH sarah
CREATE sam-[:KNOWS]-sarah
CREATE address1
CREATE address2
DELETE address1
CREATE sam-[:LIVES_AT]-address2
73. Eliminate
Unnecessary
Writes
MATCH sam
MATCH jenny
CREATE sam-[:KNOWS]-jenny
MATCH sarah
CREATE sam-[:KNOWS]-sarah
CREATE address2
CREATE sam-[:LIVES_AT]-address2
74. Tradeoff
Latency
Higher
throughput
In-‐memory
or
durable
queues?
• Lost
writes
in
event
of
crash
• Transac0onal
dequeue?