Upgrade to Pro — share decks privately, control downloads, hide ads and more …

JUDCon Brazil - Building Polyglot Persistence J...

JUDCon Brazil - Building Polyglot Persistence Java Application

JUDCon Brazil - Building Polyglot Persistence Java Application

Shekhar Gulati

May 02, 2013
Tweet

More Decks by Shekhar Gulati

Other Decks in Programming

Transcript

  1. WHO AM I? • Shekhar Gulati • OpenShift Developer Evangelist

    at Red Hat • 8 years of software development experience • Learning JavaScript these days :) • Java / NoSQL/ Cloud • Loves to learn and try new technologies • Twitter Handle : shekhargulati • Github https://github.com/shekhargulati • Slides https://speakerdeck.com/shekhargulati
  2. ASSUMPTIONS • You want to learn how to use OpenShift

    • You can write or read Java • You will ask questions
  3. • Widely used and understood • Tested in real environments

    • Efficient use of storage space if data normalized properly • Great tools support • ACID semantics • Incredibly flexible and powerful query language • Great framework support WHY RDBMS?
  4. • Complex object graphs does not map very well with

    flat tables. • Difficult to evolve Schema with time. • Data constraints and JOINs can be expensive at runtime. • Difficult to scale horizontally. RDBMS LIMITATIONS
  5. • Schema-less • Eventual consistent • Fast writes • Easy

    to scale horizontally to add processing power and storage • Tries to solve few practical use-cases NoSQL TO RESCUE
  6. Using multiple data storage technologies, chosen based upon the way

    data is being used by individual applications or components of single application. Martin Fowler http://martinfowler.com/articles/nosql-intro.pdf POLYGLOT PERSISTENCE
  7. • OpenShift • MongoDB • PostgreSQL • Java – Spring

    framework , Spring Social, Spring MongoDB, Spring Security etc. • Searchify : Full-text Search as a Service • Git • Twitter Bootstrap • Backbone.js TECHNOLOGY CHOICES
  8. • Document Oriented database – JSON-style documents • Schema-less –

    Each document is heterogeneous, and may have completely unique structure compared to other documents. • Fast and horizontally scalable • Rich query language MONGODB
  9. Database → Database Table → Collection Row → Document Index

    → Index MONGODB TERMINOLOGY MONGODB TERMINOLOGY
  10. • Easy to get running • Open Source • Active

    community • Rich documents • Geospatial indexing • Writes are very fast. You can customize it using WriteConcern WHY MONGODB?
  11. 22  What is it for?  Find all the

    MongoDB jobs near me – Proximity Queries  Find all the MongoDB jobs within Colombo – Bounded Queries  Find all the MongoDB job at this location – Exact Queries • Supports only two dimensional indexes.  You can only have one geospatial index per collection.  By default, 2d geospatial indexes assume longitude and latitude have boundaries of -180 inclusive and 180 non-inclusive (i.e. [-180, 180)) GEOSPATIAL INDEXING BASICS
  12. 23 1) Put your coordinates into an array { loc

    : [ 50 , 30 ] } //SUGGESTED OPTION { loc : { x : 50 , y : 30 } } { loc : { foo : 50 , y : 30 } } 1) { loc : { lon : 40.739037, lat: 73.992964 } } 2) Make a 2d index db.places.ensureIndex( { loc : "2d" } ) 3) If you use latitude and longitude as your coordinate system, always store longitude first. MongoDB’s 2d spherical index operators only recognize [ longitude, latitude] ordering. HOW TO MAKE IT WORK
  13. 24 • When you create the index, MongoDB converts location

    data to binary geohash values and calculates these values using the location data and the index’s location range • Geohashes have a precision that is determined by the number of bits in the hash. Default value 26 • More bits allow the index to provide results with greater precision • You can configure number of bits at index creation db.collection.ensureIndex( {<location field>: "2d"} , { bits: <bit precision> } ) GEOHASHES
  14. 25 • MongoDB supports compound geospatial indexes. • the field

    with location data is the first field db.jobs.ensureIndex( { location: "2d", skills: 1 } ) COMPOUND GEOSPATIAL INDEXES
  15. • Supports MongoDB and PostgreSQL. Also supports MySQL • Multi-language

    support. Supports Java, Node.js, Perl, Python, PHP and Ruby • Extensible via DIY • No need to learn anything new • Open source – OpenShift Origin • Scalable • FREE! WHY OPENSHIFT?
  16. • OpenShift is free-as-in-beer & free-as-in-freedom • You get three

    free gears, each with 512MB memory and 1GB of disk space. • Need more resources, just ask! • The catch is we are in developer preview right now WHAT DO I GET?
  17. 34 ➢ Login to OpenShift web console ➢ Click on

    “My Account” ➢ Namespace – JUDCONBR – Unique per user CREATING NAMESPACE
  18. 35 Some terminology for today 1. Application – your web

    code and any data store. Has to be on 1 or more gears 2. Gear – is like a server. It can have only 1 language for the web programming. 3. Cartridge – it adds a language, a data store, or other functionality 4. Git – used for version control and managing code between server and your development machine 5. Ssh – command line tool to connect to your gear
  19. 36 Install Ruby 1.8.7 or greater Install Git Install rhc

    OpenShift gem Refer to documentation INSTALLING CLIENT TOOLS
  20. 38 1. Git add . (means add all new files

    as being tracked in the local repository) 2. Git commit –am “your message” (means commit all my changes to the local repository with this message) 3. Git push (means push from your local repository to the repository on your OpenShift gear) 3 COMMANDS YOU SHOULD KNOW
  21. 39 $ rhc app create localjobs jbosseap mongodb-2.2 postgresql-8.4 -s

    $ git remote add upstream -m master https://github.com/shekhargulati/localjobs- scalable.git $ git pull -s recursive -X theirs upstream master $ rhc app show -a localjobs $ scp jobs-data.json <ssh url>:app-root/data $ rhc app ssh -a localjobs $ cd app-root/data $ mongoimport -d localjobs -c jobs --file jobs-data.json -u $OPENSHIFT_MONGODB_DB_USERNAME -p $OPENSHIFT_MONGODB_DB_PASSWORD -h $OPENSHIFT_MONGODB_DB_HOST -port $OPENSHIFT_MONGODB_DB_PORT $ mongo $ db.jobs.ensureIndex({“location”:”2d”}) DEMO : LOCALJOBS APP