(Greach 2015) Decathlon Sport Meeting

61
Decathlon Sport Meeting Alonso Torres, DEVELOPER Sports, a new Grails discipline Antonio de la Torre, DEVELOPER Kaleidos

Transcript of (Greach 2015) Decathlon Sport Meeting

Page 1: (Greach 2015) Decathlon Sport Meeting

Decathlon Sport Meeting

Alonso Torres, DEVELOPER

Sports, a new Grails discipline

Antonio de la Torre, DEVELOPER

Kaleidos

Page 2: (Greach 2015) Decathlon Sport Meeting

Introduction

Page 3: (Greach 2015) Decathlon Sport Meeting

What’s Decathlon Sport Meeting?

Intro

Page 4: (Greach 2015) Decathlon Sport Meeting

Intro

Why want Decathlon to develop a Social Network?

● Decathlon’s mission is to make sports widely available

● Sport Meeting was created to take this one step further

Page 5: (Greach 2015) Decathlon Sport Meeting

Intro

Who developed it?

Kaleidos

Page 6: (Greach 2015) Decathlon Sport Meeting

What did it contributed to the community?

● 3 Pull Request to GrailsGRAILS-11647, GRAILS-11323, GRAILS-10763

● 6 open sourced plugins

Intro

Page 7: (Greach 2015) Decathlon Sport Meeting

Intro

How is DSM?

100k registered users

1000 active sport proposals

35 sports

Page 8: (Greach 2015) Decathlon Sport Meeting

Development Decisions

«The risk of a wrong decision is preferable to the terror of indecision.»

Maimónides (12th c.)

Page 9: (Greach 2015) Decathlon Sport Meeting

Development decisions

Divided in

three applications● WEB, JOBS, API

and a plugin with business

logic and common code● CORE

JOBS

WEB API

CORE

Page 10: (Greach 2015) Decathlon Sport Meeting

Development decisions

Command Objects

● Responsibility● Validate objects

○ accessing model to validate data

Page 11: (Greach 2015) Decathlon Sport Meeting

Development decisions

Command ObjectsCheck if is a type

and a valid domain object

Page 12: (Greach 2015) Decathlon Sport Meeting

Development decisions

Tests

● Start with Integration tests << due to odd behaviour

● and moving to Unit tests << less dependency

Page 13: (Greach 2015) Decathlon Sport Meeting

Development decisions

Asynchronous processes and background jobs

● Asynchronous processes (platform-core)

○ Immediate email sending

○ Push notifications to mobile devices

Page 14: (Greach 2015) Decathlon Sport Meeting

Development decisions

Asynchronous processes and background jobs

● Background jobs (quartz)

○ Quartz scheduler library

○ Tasks that are processed overnight■ Proposals clean up■ Mailing with interesting stuff (users, proposals)

Page 15: (Greach 2015) Decathlon Sport Meeting

API Decisions

Page 16: (Greach 2015) Decathlon Sport Meeting

API decisions

Trait with helpers to create responses: 4XX

Page 17: (Greach 2015) Decathlon Sport Meeting

API decisions

Command Objects accepts input JSON < Magic happens

Page 18: (Greach 2015) Decathlon Sport Meeting

API decisions

Command Objects accepts input JSON < Magic happens

Page 19: (Greach 2015) Decathlon Sport Meeting

API decisions

Command Objects accepts input JSON < Magic happens

Binding Lists

Page 20: (Greach 2015) Decathlon Sport Meeting

API decisions

Data Oriented Design (RESTful)

over

Screen Oriented Design

Page 21: (Greach 2015) Decathlon Sport Meeting

Infrastructure decisions

Page 22: (Greach 2015) Decathlon Sport Meeting

Infrastructure decisions

PostgreSQL as our main database

● Open-Source and very mature

● Highly scalability

● Widely used

Page 23: (Greach 2015) Decathlon Sport Meeting

Infrastructure decisions

MongoDB as a secondary storage for denormalized data

● Optimize read and searches by storing documents

● Filter, sorting, querying

● Highly availability

Page 24: (Greach 2015) Decathlon Sport Meeting

Infrastructure decisions

MongoDB to store statistics and usage data

● Fire and forget model

● Map-reduce to extract the information

Page 25: (Greach 2015) Decathlon Sport Meeting

Infrastructure decisions

MongoDB for geolocalized data

● Great support of geolocalization

● Aggregation pipeline

Page 26: (Greach 2015) Decathlon Sport Meeting

Infrastructure decisions

Terracotta as a Hibernate second-level cache and HTTP sessions

● Dual licensing (community and commercial)

● Problems scaling (on the community product)

● Decided to change to Redis

Page 27: (Greach 2015) Decathlon Sport Meeting

Infrastructure decisions

Releases upload to a Nexus repository

● Upload all the software revisions

● “release plugin” can manage this

● Could be easily automated for a continuous

delivery

Page 28: (Greach 2015) Decathlon Sport Meeting

Awesome Tools

«If I have seen further it is only by standing on the shoulders of giants.»

Isaac Newton

Page 29: (Greach 2015) Decathlon Sport Meeting

Awesome tools

Java Melody Plugin

● Allows monitoring of requests and JVM state

● Saved us in several occasions

Page 30: (Greach 2015) Decathlon Sport Meeting
Page 31: (Greach 2015) Decathlon Sport Meeting

Awesome tools

Build Test Data Plugin

● Creates complex objects from your constraints

Page 32: (Greach 2015) Decathlon Sport Meeting

Awesome tools

Build Test Data Plugin

● Creates complex objects from your constraints

Page 33: (Greach 2015) Decathlon Sport Meeting

Awesome tools

Build Test Data Plugin

● Creates complex objects from your constraints

Check constraints and relationships and creates the necessary objects

Page 34: (Greach 2015) Decathlon Sport Meeting

PostgresSQL Extensions plugin

Awesome tools

● Disclaimer: created by @ilopmar & @alotor inside

Kaleidos

● Provides native access to PSQL native types:

HSTORE, Arrays, JSON...

Page 35: (Greach 2015) Decathlon Sport Meeting

PostgresSQL Extensions plugin

Awesome tools

Page 36: (Greach 2015) Decathlon Sport Meeting

Awesome tools

Platform Core plugin

● Asynchronous task is a bliss

● Maintained by the Grails-core team

Page 37: (Greach 2015) Decathlon Sport Meeting

Awesome tools

Platform Core plugin

Page 38: (Greach 2015) Decathlon Sport Meeting

Know your tools

Page 39: (Greach 2015) Decathlon Sport Meeting

Awesome tools

GPars

● Easy parallelization inside the Groovy core

● Provides DSL’s and an easy API to parallelize

expensive tasks

● Sometimes difficult to work with GORM

Page 40: (Greach 2015) Decathlon Sport Meeting

Awesome tools

GPars

Page 41: (Greach 2015) Decathlon Sport Meeting

Awesome tools

GPars

Five threads at the same time

Page 42: (Greach 2015) Decathlon Sport Meeting

Awesome tools

GPars

we need a transaction within the new thread

Page 43: (Greach 2015) Decathlon Sport Meeting

Awesome tools

Groovy Metaprogramming

● Sometimes the magic is fun :)

● We developed a system with metaprogramming to

easily create new types of notification

Page 44: (Greach 2015) Decathlon Sport Meeting

Awesome tools

Page 45: (Greach 2015) Decathlon Sport Meeting

Awesome tools

Grails & Spring

● Problem: we wanted different implementations in

development and “real” environments

● Examples: notifications, file storage...

Page 46: (Greach 2015) Decathlon Sport Meeting

Awesome tools

Page 47: (Greach 2015) Decathlon Sport Meeting

Awesome tools

Inject a generic “fileService”

Page 48: (Greach 2015) Decathlon Sport Meeting

Awesome tools

Alias the necessary bean per environment

Page 49: (Greach 2015) Decathlon Sport Meeting

Difficult Challenges

Page 50: (Greach 2015) Decathlon Sport Meeting

Difficult Challenges

Migration Grails 2.1.5 → 2.4.4

Page 51: (Greach 2015) Decathlon Sport Meeting

Difficult Challenges

Migration Grails 2.1.5 → 2.4.4

● Upgrade Grails and it’s dependencies

● Package changes, API changes…

● DataBinding and Command objects changes

Page 52: (Greach 2015) Decathlon Sport Meeting

Difficult Challenges

URL’s internationalization

● Grails doesn’t support out-of-the-box multi-language URL’s

Page 53: (Greach 2015) Decathlon Sport Meeting

Difficult Challenges

Tests pollution

● With 1500+ tests if you’re polluting one of your

tests is a big issue

● If this happens to you check:

by @tednaleidhttp://bit.ly/1FlJs75

Page 54: (Greach 2015) Decathlon Sport Meeting

Difficult Challenges

API Documentation

● There is no easy way to keep an up-to-date API

documentation with Grails REST support

● Our solution: the documentation as GSP’s allow us to

reuse certain common part’s (like messages structure)

Page 55: (Greach 2015) Decathlon Sport Meeting

Difficult Challenges

MongoDB Plugin

● Mongodb’s GORM plugin had unexpected

behaviour

● We finally decided to use the low-level API when

accessing MongoDB

Page 56: (Greach 2015) Decathlon Sport Meeting

Going Forward

Page 57: (Greach 2015) Decathlon Sport Meeting

Going forward...

● Currently the application is only available for

spanish users

● Decathlon is present in 27 countries

Travel abroad!

Page 58: (Greach 2015) Decathlon Sport Meeting

Going forward...

● Decathlon Sport Meeting will be opening their API

● We hope to create an application ecosystem

around the social network

Opening the API

Page 59: (Greach 2015) Decathlon Sport Meeting

Going forward...

● First application using DSM API

● Was done during the ΠWEEK

Sport Spot

Page 60: (Greach 2015) Decathlon Sport Meeting

Going forward...

Page 61: (Greach 2015) Decathlon Sport Meeting

See you on track!