no sql in enterprise java applications

43
NoSQL in Enterprise Java Applications Patrick Baumgartner NoSQL Search Roadshow | Munich | 16.04.2013

Upload: patrick-baumgartner

Post on 09-May-2015

425 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: No Sql in Enterprise Java Applications

NoSQL in Enterprise Java Applications

Patrick Baumgartner

NoSQL Search Roadshow | Munich | 16.04.2013

Page 2: No Sql in Enterprise Java Applications

2

Agenda

• Speaker Profile• New Demands on Data Access• New Types of Data Stores• Polyglot Persistence• Integrating NoSQL Data Stores• Spring Data Overview • Example with MongoDB• Example with Neo4j• Highlights and Challenges • Q & A

Page 3: No Sql in Enterprise Java Applications

3

Speaker Profile

Patrick Baumgartner• Senior Software Consultant | Partner @ Swiftmind

• Spring Framework, OSGi, Neo4j• Spring Trainer• Co-Autor von „OSGi für Praktiker“

• Agile Methodologies & Practices• Scrum.org Trainer - PSD Java

• @patbaumgartner

Page 4: No Sql in Enterprise Java Applications

4

Swiftmind

Your experts for Enterprise Java

Areas of expertise• Java EE• Spring Framework• OSGi• Agile Methodologies• Software Engineering Best Practices

Headquarter• Zürich, Schweiz• @swiftmind• http://www.swiftmind.com

Page 5: No Sql in Enterprise Java Applications

5

New Demands on Data Access

• Structured and unstructured data

• Massive amounts of data • Inexpensive horizontal

scaling• Apps and data in the

cloud• Social network features• …

Page 6: No Sql in Enterprise Java Applications

6

New Types of Data Stores

Page 7: No Sql in Enterprise Java Applications

7

NoSQL

Data Size

Data Complexity

Key-Value Stores

Column Family

Document Databases

Graph Databases

Relational Databases

90%

Page 8: No Sql in Enterprise Java Applications

8

One single data store for your application?

Polyglot Persistence

Page 9: No Sql in Enterprise Java Applications

9

Polyglot Persistence

Web Shop

User Sessions Shopping Card Recommendations

Product Catalog Analytics Financial Data

Redis Riak Neo4j

MongoDB Casandra MySQL

Page 10: No Sql in Enterprise Java Applications

10

We are not architects!

Integrating NoSQL Data Stores #1

http://www.flickr.com/photos/sakeeb/4087246274

Page 11: No Sql in Enterprise Java Applications

11

Don’t re-invent the wheel!

Integrating NoSQL Data Stores #2

http://www.flickr.com/photos/dmott9/5921728819

Page 12: No Sql in Enterprise Java Applications

12

Let’s use Spring!

Integrating NoSQL Data Stores #3

http://www.springsource.org/spring-data

Page 13: No Sql in Enterprise Java Applications

13

Spring Data

• Same goals as the Spring Framework– Productivity improvement– Programming model consistency– Portability

• Umbrella for subprojects, specific to a given database• Mapping support for Java domain objects

• http://www.springsource.org/spring-data• http://github.com/SpringSource/spring-data-XXX

Page 14: No Sql in Enterprise Java Applications

14

Spring Data – Overview #1

• JPA• JDBC Extensions

Relational Databases

• Apache Hadoop

Big Data

• GemFire

Data Grid

• REST

HTTP

• Redis

Key Value Stores

Page 15: No Sql in Enterprise Java Applications

15

Spring Data – Overview #2

• Mongo DB• Couchbase *

Document Stores

• Neo4J

Graph Databases

• Hbase

Column Stores

• Apache Solr *• Elastic Search *

Search

• Commons

Common Infrastructure

* Community Project

Page 16: No Sql in Enterprise Java Applications

16

Spring Data – Key Features

• Low level data access API abstraction– MongoTemplate, RiakTemplate, Neo4jTemplate …– Exception translation– Transaction management

• Object Mapping (Java to data store)• Generic Repository Support

– Basic CRUD, dynamic finders, pagination and sorting • Spring namespaces• Cross Store Persistence Programming Model

– @Entity, @Document, @NodeEntity …

Page 17: No Sql in Enterprise Java Applications

17

Spring Data MongoDB – Example

Page 18: No Sql in Enterprise Java Applications

18

Documents

Stored JSON:{ "_id" : ObjectId("4f9886290364b533b3acd4ce"), "_class" : "com.acme.hello.domain.Person", "name" : "Bob", "age" : 33 }

Page 19: No Sql in Enterprise Java Applications

19

Spring Data MongoDB – Document

Stored JSON:{ "_id" : ObjectId("4f9886290364b533b3acd4ce"), "_class" : "com.example.Person", "name" : "Bob", "age" : 33 }

@Documentpublic class Person { @Id private int id; private String name; private int age; // getters/setters…}

Page 20: No Sql in Enterprise Java Applications

20

Spring Data MongoDB – Configuration

Page 21: No Sql in Enterprise Java Applications

21

Spring Data MongoDB – Repository

@Repositorypublic class MongoPersonRepository implements BaseRepository<Person> {

@Autowired MongoOperations mongoTemplate;

Person createPerson(String name, int age){

if(!mongoTemplate.collectionExists(Person.class)){

mongoTemplate.createCollection(Person.class);

}

Person p = new Person(name, age);

mongoTemplate.insert(p)

return p;

}

...

}

Page 22: No Sql in Enterprise Java Applications

22

Spring Data MongoDB – Repository #2

@Repositorypublic interface MongoPersonRepository implements CrudRepository<Person, Long> {

Page<Person> findByNameContaining(String name, Pageable p);

@Query("{ ?0 : ?1 }") List<Product> findByAttributes(String key, String value);

}

Page 23: No Sql in Enterprise Java Applications

23

Spring Data Neo4j – Example

Page 24: No Sql in Enterprise Java Applications

24

Graph

Page 25: No Sql in Enterprise Java Applications

25

Social Data

AliceCarol

KNOWS

Luke

Bob

Sam

PeteKNOWS

KN

OW

S

KNOWS

KNOWS

KNOWS

KNOW

S

KNO

WS

Page 26: No Sql in Enterprise Java Applications

26

The only use case?

Social Graph

Page 27: No Sql in Enterprise Java Applications

27

Spatial Data

12

type:ROADlength:5km

5

3

13

8ROAD

RO

AD

ROAD

ROAD

type:ROADlength:3km

ROAD

type:Hotelname:Radisson Blulat:47.452549 long:8.564615

type:Hotelname:Widderlat:47.373517 long:8.539252

ROAD RO

AD

Page 28: No Sql in Enterprise Java Applications

28

Social & Spatial Data

AliceMat

type:LIKESweight:5

5

Bob

13

8ROAD

RO

AD

ROAD

LIKESKNOWS

SIBLING

type:Hotelname:Radisson Blulat:47.452549 long:8.564615

KNO

WS

Page 29: No Sql in Enterprise Java Applications

29

Financial Data

AliceHotel Luke

Bank

ATM

PeteWITHDRAW

TRAN

SFE

R

WITHDRAW

TRANSFER

OWNS

DEPO

SIT

DEPOSIT

Page 30: No Sql in Enterprise Java Applications

30

Your business domain

Process

KPI

Device

Activity

Function

ServiceDEPENDS_OND

EPEN

DS_O

N RUNS_ON

DEPENDS_ONDEPEND

S_ON

DEPENDS_ON

Page 31: No Sql in Enterprise Java Applications

31

Spring Data Neo4j (SDN)

• POJOs mapped as nodes or relationships – type safe• Works directly Database, typically embedded mode• Data is fetched very fast and lazy• Stores everything within a @Transaction• Uses heavily AspectJ magic to enhance the POJOs• …

Page 32: No Sql in Enterprise Java Applications

32

Spring Data Neo4j – NodeEntity

_type_: com.example.Personname: "Alice"age: 42

@NodeEntitypublic class Person { private String name; private int age; // getters/setters…}

Person alice = new Person();alice.setName("Alice");alice.setAge(42);alice.persist();

Node

Page 33: No Sql in Enterprise Java Applications

33

Spring Data Neo4j – Relationship

@RelationshipEntitypublic class Knows { private int sinceYear; public Knows since(int year) { this.sinceYear = year; return this; }}

@NodeEntitypublic class Person { public Known knows(Person p) { return this.relateTo(p, Knows.class, "KNOWS"); }}Person alice = ...;Person bob ...;alice.knows(bob).since(2012);

Alice BobKNOWS

since: 2012

Page 34: No Sql in Enterprise Java Applications

34

Spring Data Neo4j – NodeEntity

@NodeEntitypublic class Person { private String name; private int yearOfBirth; @RelatedTo(type = "KNOWS", direction = Direction.OUTGOING) private Set<Person> knownPersons;

public void knows(Person p) { knownPersons.add(p); } public Set<Person> getFriends() { return knownPersons; }}Person alice = ...;alice.knows(bob);alice.knows(carol);

Alice BobKNOWS

Carol

KNOWS

Page 35: No Sql in Enterprise Java Applications

35

Spring Data Neo4j – Repository

public interface PersonRepository extends GraphRepository<Person> {

@Query("start person = {0} match ... return ...")

Iterable<Product> getOwnedServices(Person person);

Iterable<Person> findByName(String name);

Iterable<Person> findByNameLike(String name);

}

@Autowired

PersonRepository personRepository;

Person alice = personRepository.findByName("Alice");

Page 36: No Sql in Enterprise Java Applications

36

Spring Data Neo4j – Querying

• Several possibilities implemented to query the graph– Neo4j API– Traversal descriptions– Graph algorithms– Index queries– Cypher queries

Page 37: No Sql in Enterprise Java Applications

37

Highlights and Challenges

Page 38: No Sql in Enterprise Java Applications

38

Highlights

• Vibrating community, great support on mailing lists

• Using the right tool for the right job

• New technologies differentiate our product/service from competitors

• Sources on github.com – Pull requests for improvements

• Very good overall performance

• We can use Spring!

• Abstraction layer makes “driver” changes easy

Page 39: No Sql in Enterprise Java Applications

39

Challenges

• Developer Onboarding

• Schema changes -> migrations

• Some topics not solved yet -> e.g. versioning

• Not many show cases documented in detail

• Sizing for scaling based on real world measurements

• Massive amount of data

• Several framework and data store releases per year

• Bugs, but no show stoppers

• Keeping documentation up-to-date, data model changes

Page 40: No Sql in Enterprise Java Applications

40

Information from the source

Spring Data

Hive Pig JDBC HBase JPA

Splunk NoSQL Redis BigData

Hadoop Redis Roo Gemfire

MongoDB Neo4j REST exporter

Querydsl Repositories

http://bit.ly/sd-book

Page 41: No Sql in Enterprise Java Applications

41

Use a data model which really matches to your data …

Give it a try!

http://www.flickr.com/photos/juniorvelo/3267647833

Page 42: No Sql in Enterprise Java Applications

42

Q&A

Page 43: No Sql in Enterprise Java Applications

43

Thank you!

Patrick Baumgartner, @patbaumgartner

patrick.baumgartner [at] swiftmind [dot] com

http://www.swiftmind.com @swiftmind