SlideShare a Scribd company logo
1 of 40
Download to read offline
PLAY IN PRACTICE/Will Sargent @will_sargent
PREAMBLE
This is going to be a broad talk.
USAGE
This talk does not attempt to be universal to all situations.
YMMV.
WHAT IS PLAY?
Play is a web application framework.
THESIS STATEMENT
Play is awesome.
WHY PLAY IS AWESOME?
Because Play is Simple.
HERE'S WHAT PLAY DOES:
Takes in an HTTP request.
Returns (or streams) a response.
HERE'S WHAT PLAY DOESN'T DO:
It doesn't tie an HTTP request to a thread.
It doesn't tie an HTTP session to memory.
It doesn't assume you want convenient but unsafe
practices.
It doesn't mandate a particular object relational
framework.
It doesn't mandate a particular template library.
It doesn't mandate a particular routing format.
HERE'S WHAT PLAY PROVIDES AS OPTIONS:
"Always-on" Build System
HTTP API
Templates
Form Handling
JSON support
BUILD SYSTEM
Modified SBT, recompiles pages on the fly in development
mode.
Type "play idea" or "play eclipse" to generate the files for
your IDE.
FRONT CONTROLLER
Routing API (with LangPathBindable and
QueryStringBindable)
Action: asynchronous and stateless by default.
Immutable HTTP: cookies, request, response, headers, etc.
Backed by Akka and Netty.
PRESENTATION
Compiled template language (Twirl, Scaml, Jade).
Built-in helpers for rendering forms.
Support for Twitter Bootstrap, LESS, jQuery, etc.
JSON
Formatting to JSON
Parsing of JSON objects
JsPath, automatic validation, read and write combinators
SO, WHY DOES THIS MATTER?
THE BUSINESS REQUEST
Make a website!
MAKE TWO WEBSITES!
Product
Admin
MAKE MORE WEBSITES!
Product
Admin
Customer Service
Business Analytics
Business Content
Jobs Queue
THE PROBLEM
In a complex web application, many different front ends need
to look at the same data, from different angles.
Touching the database directly is dangerous and messy.
THE SOLUTION
In complex applications, use loosely coupled, stateless,
composable services.
HOW?
Create a Play HTTP front end, backed by Akka.
Create a business domain services, backed by Akka.
Use Akka to pass messages between Play and the domain
services.
Present information using query services.
ALAN KAY ON OOP
“ I thought of objects being like biological cells
and/or individual computers on a network,
only able to communicate with messages (so
messaging came at the very beginning -- it
took a while to see how to do messaging in a
programming language efficiently enough to
be useful). ”
COMMAND / QUERY RESPONSIBILITY
SEGREGATION (CQRS)
Command: a message intending a change of state.
Event: a message indicating that state has changed.
Fault: a message indicating failure to execute a command.
CQRS MAPPED ONTO PLAY
Processing Commands using POST
Querying for Data with GET
Broadcasting Events with Streaming
PROCESSING COMMANDS
Validate all input.
where possible.
Be very careful when handling passwords and credit card
numbers.
Use value classes
COMMANDS
def sendCommand(command : Command) : Future[Either[Fault,Event]]
CQRS
COMMAND
trait Command extends Product
sealed abstract class AuthenticationCommand extends Command
case class AuthenticateWithPasswordCommand(email:Email,
password:String,
rememberMe:Boolean)
extends AuthenticationCommand {
override def toString = "AuthenticateWithPasswordCommand("
+ email + "," + rememberMe + ")"
}
EVENT
case class UserAuthenticatedEvent(userId: UserID,
series: Option[Long] = None,
token: Option[Long] = None)
extends AuthenticationEvent
FAULT
trait AuthenticationFault
case class InvalidSessionCookieFault() extends AuthenticationFault
QUERY
case class UserInfo(id: UUID, email: Email, fullName: String)
class UserInfoService {
def lookup(uuid: UUID)(implicit c:Credentials): Option[UserInfo]
def findByName(name: String)(implicit c:Credentials) : TraversableOnce[UserIn
}
QUERY PRACTICES:
Objects should be immutable
Return ranges or streams over unbounded lists.
Don't expose repository logic (i.e. HQL, CQL, etc)
Making a good query builder is hard; avoid yak shaving.
CONTEXT AND AUTHENTICATION
Use or to set up a
WrappedRequest context.
Pass the request context around implicitly in every
template.
The request context will contain all the state you need (i.e.
Credentials).
Make helpers take the context as an implicit as needed.
Sidenote: helpers are great for keeping logic out of
templates.
play2-rememberme SecureSocial
EXAMPLE TEMPLATE
@(u: UserInfo)(implicit ctx: Context)
@layout(title = "User Page") {
@ctx.me.map { u =>
<p>
This is your user page.
</p>
}
<p>
User page of @{u.fullName}.
</p>
}
STREAMING
You send an event.
Event goes through an Iteratee.
Iteratee broadcasts event using Socket and Hub model.
Play uses Server Sent Events to stream JSON to clients
Javascript picks up that JSON from SSE, handles display.
is the best reference.
Sidenote: also check out
lila
vert.x
EVERYTHING ELSE
Logging
Metrics
Testing
LOGGING
Play's internal logger isn't the greatest.
Fortunately, it's not hardcoded and you can ignore it.
Make your own wrapper over SF4LJ & Logback (or
grizzled, or typesafe logging).
METRICS
has a Scala option.
Map it through Global's onRequest method.
Metrics
TESTING
Unit testing a stateless app is very easy.
Swapping out services with mocks/stubs may be easier
with DI (I use Subcut).
Functional and integration testing with FakeRequest and
Fluentlenium almost painless.
LOAD TESTING
Use jconsole and .
Don't know how useful Typesafe Console is.
Apache JMeter
QUESTIONS?
There's an award!

More Related Content

What's hot

Memory Management In Swift
Memory Management In SwiftMemory Management In Swift
Memory Management In Swift
Hossam Ghareeb
 

What's hot (20)

How to Think Like the SQL Server Engine
How to Think Like the SQL Server EngineHow to Think Like the SQL Server Engine
How to Think Like the SQL Server Engine
 
Go database/sql
Go database/sqlGo database/sql
Go database/sql
 
React & Redux JS
React & Redux JS React & Redux JS
React & Redux JS
 
Djangocon 2014 - Django REST Framework - So Easy You Can Learn it in 25 Minutes
Djangocon 2014 - Django REST Framework - So Easy You Can Learn it in 25 MinutesDjangocon 2014 - Django REST Framework - So Easy You Can Learn it in 25 Minutes
Djangocon 2014 - Django REST Framework - So Easy You Can Learn it in 25 Minutes
 
Memory management ARC
Memory management ARCMemory management ARC
Memory management ARC
 
The dark side of Akka and the remedy
The dark side of Akka and the remedyThe dark side of Akka and the remedy
The dark side of Akka and the remedy
 
Getting hooked on performance and clean code
Getting hooked on performance and clean codeGetting hooked on performance and clean code
Getting hooked on performance and clean code
 
Time to React!
Time to React!Time to React!
Time to React!
 
New and improved hacking oracle from web apps sumit sidharth
New and improved hacking oracle from web apps   sumit sidharthNew and improved hacking oracle from web apps   sumit sidharth
New and improved hacking oracle from web apps sumit sidharth
 
Introduction to Akka
Introduction to AkkaIntroduction to Akka
Introduction to Akka
 
Memory Management In Swift
Memory Management In SwiftMemory Management In Swift
Memory Management In Swift
 
Why you shouldn’t edit silver stripe core files (and how to do it anyway)
Why you shouldn’t edit silver stripe core files (and how to do it anyway)Why you shouldn’t edit silver stripe core files (and how to do it anyway)
Why you shouldn’t edit silver stripe core files (and how to do it anyway)
 
Reactive programming with akka
Reactive programming with akka Reactive programming with akka
Reactive programming with akka
 
Day 4 - Models
Day 4 - ModelsDay 4 - Models
Day 4 - Models
 
Automated testing with RSpec
Automated testing with RSpecAutomated testing with RSpec
Automated testing with RSpec
 
Orchestration
OrchestrationOrchestration
Orchestration
 
User Credential handling in Web Applications done right
User Credential handling in Web Applications done rightUser Credential handling in Web Applications done right
User Credential handling in Web Applications done right
 
[143]Inside fuse deview 2016
[143]Inside fuse   deview 2016[143]Inside fuse   deview 2016
[143]Inside fuse deview 2016
 
Django REST Framework
Django REST FrameworkDjango REST Framework
Django REST Framework
 
Recipes to build Code Generators for Non-Xtext Models with Xtend
Recipes to build Code Generators for Non-Xtext Models with XtendRecipes to build Code Generators for Non-Xtext Models with Xtend
Recipes to build Code Generators for Non-Xtext Models with Xtend
 

Similar to Play in practice

PuppetDB: Sneaking Clojure into Operations
PuppetDB: Sneaking Clojure into OperationsPuppetDB: Sneaking Clojure into Operations
PuppetDB: Sneaking Clojure into Operations
grim_radical
 
Systems Bioinformatics Workshop Keynote
Systems Bioinformatics Workshop KeynoteSystems Bioinformatics Workshop Keynote
Systems Bioinformatics Workshop Keynote
Deepak Singh
 
Taming Deployment With Smart Frog
Taming Deployment With Smart FrogTaming Deployment With Smart Frog
Taming Deployment With Smart Frog
Steve Loughran
 

Similar to Play in practice (20)

PuppetDB: Sneaking Clojure into Operations
PuppetDB: Sneaking Clojure into OperationsPuppetDB: Sneaking Clojure into Operations
PuppetDB: Sneaking Clojure into Operations
 
Dev381.Pp
Dev381.PpDev381.Pp
Dev381.Pp
 
Akka Microservices Architecture And Design
Akka Microservices Architecture And DesignAkka Microservices Architecture And Design
Akka Microservices Architecture And Design
 
Play framework productivity formula
Play framework   productivity formula Play framework   productivity formula
Play framework productivity formula
 
[PASS Summit 2016] Blazing Fast, Planet-Scale Customer Scenarios with Azure D...
[PASS Summit 2016] Blazing Fast, Planet-Scale Customer Scenarios with Azure D...[PASS Summit 2016] Blazing Fast, Planet-Scale Customer Scenarios with Azure D...
[PASS Summit 2016] Blazing Fast, Planet-Scale Customer Scenarios with Azure D...
 
Systems Bioinformatics Workshop Keynote
Systems Bioinformatics Workshop KeynoteSystems Bioinformatics Workshop Keynote
Systems Bioinformatics Workshop Keynote
 
Scaling asp.net websites to millions of users
Scaling asp.net websites to millions of usersScaling asp.net websites to millions of users
Scaling asp.net websites to millions of users
 
Java Hurdling: Obstacles and Techniques in Java Client Penetration-Testing
Java Hurdling: Obstacles and Techniques in Java Client Penetration-TestingJava Hurdling: Obstacles and Techniques in Java Client Penetration-Testing
Java Hurdling: Obstacles and Techniques in Java Client Penetration-Testing
 
MeteorJS Introduction
MeteorJS IntroductionMeteorJS Introduction
MeteorJS Introduction
 
Data Streaming Technology Overview
Data Streaming Technology OverviewData Streaming Technology Overview
Data Streaming Technology Overview
 
Functional web with clojure
Functional web with clojureFunctional web with clojure
Functional web with clojure
 
Play framework
Play frameworkPlay framework
Play framework
 
Taming Deployment With Smart Frog
Taming Deployment With Smart FrogTaming Deployment With Smart Frog
Taming Deployment With Smart Frog
 
The Cloud-natives are RESTless @ JavaOne
The Cloud-natives are RESTless @ JavaOneThe Cloud-natives are RESTless @ JavaOne
The Cloud-natives are RESTless @ JavaOne
 
Cloud Talk
Cloud TalkCloud Talk
Cloud Talk
 
Ten practical ways to improve front-end performance
Ten practical ways to improve front-end performanceTen practical ways to improve front-end performance
Ten practical ways to improve front-end performance
 
XPages Blast - ILUG 2010
XPages Blast - ILUG 2010XPages Blast - ILUG 2010
XPages Blast - ILUG 2010
 
Play Framework: async I/O with Java and Scala
Play Framework: async I/O with Java and ScalaPlay Framework: async I/O with Java and Scala
Play Framework: async I/O with Java and Scala
 
Sling pipes
Sling pipesSling pipes
Sling pipes
 
Server side JavaScript: going all the way
Server side JavaScript: going all the wayServer side JavaScript: going all the way
Server side JavaScript: going all the way
 

Recently uploaded

Hyatt driving innovation and exceptional customer experiences with FIDO passw...
Hyatt driving innovation and exceptional customer experiences with FIDO passw...Hyatt driving innovation and exceptional customer experiences with FIDO passw...
Hyatt driving innovation and exceptional customer experiences with FIDO passw...
FIDO Alliance
 
TrustArc Webinar - Unified Trust Center for Privacy, Security, Compliance, an...
TrustArc Webinar - Unified Trust Center for Privacy, Security, Compliance, an...TrustArc Webinar - Unified Trust Center for Privacy, Security, Compliance, an...
TrustArc Webinar - Unified Trust Center for Privacy, Security, Compliance, an...
TrustArc
 
“Iamnobody89757” Understanding the Mysterious of Digital Identity.pdf
“Iamnobody89757” Understanding the Mysterious of Digital Identity.pdf“Iamnobody89757” Understanding the Mysterious of Digital Identity.pdf
“Iamnobody89757” Understanding the Mysterious of Digital Identity.pdf
Muhammad Subhan
 

Recently uploaded (20)

Generative AI Use Cases and Applications.pdf
Generative AI Use Cases and Applications.pdfGenerative AI Use Cases and Applications.pdf
Generative AI Use Cases and Applications.pdf
 
Design Guidelines for Passkeys 2024.pptx
Design Guidelines for Passkeys 2024.pptxDesign Guidelines for Passkeys 2024.pptx
Design Guidelines for Passkeys 2024.pptx
 
The Zero-ETL Approach: Enhancing Data Agility and Insight
The Zero-ETL Approach: Enhancing Data Agility and InsightThe Zero-ETL Approach: Enhancing Data Agility and Insight
The Zero-ETL Approach: Enhancing Data Agility and Insight
 
Frisco Automating Purchase Orders with MuleSoft IDP- May 10th, 2024.pptx.pdf
Frisco Automating Purchase Orders with MuleSoft IDP- May 10th, 2024.pptx.pdfFrisco Automating Purchase Orders with MuleSoft IDP- May 10th, 2024.pptx.pdf
Frisco Automating Purchase Orders with MuleSoft IDP- May 10th, 2024.pptx.pdf
 
ADP Passwordless Journey Case Study.pptx
ADP Passwordless Journey Case Study.pptxADP Passwordless Journey Case Study.pptx
ADP Passwordless Journey Case Study.pptx
 
Oauth 2.0 Introduction and Flows with MuleSoft
Oauth 2.0 Introduction and Flows with MuleSoftOauth 2.0 Introduction and Flows with MuleSoft
Oauth 2.0 Introduction and Flows with MuleSoft
 
2024 May Patch Tuesday
2024 May Patch Tuesday2024 May Patch Tuesday
2024 May Patch Tuesday
 
How to Check GPS Location with a Live Tracker in Pakistan
How to Check GPS Location with a Live Tracker in PakistanHow to Check GPS Location with a Live Tracker in Pakistan
How to Check GPS Location with a Live Tracker in Pakistan
 
UiPath manufacturing technology benefits and AI overview
UiPath manufacturing technology benefits and AI overviewUiPath manufacturing technology benefits and AI overview
UiPath manufacturing technology benefits and AI overview
 
How to Check CNIC Information Online with Pakdata cf
How to Check CNIC Information Online with Pakdata cfHow to Check CNIC Information Online with Pakdata cf
How to Check CNIC Information Online with Pakdata cf
 
Hyatt driving innovation and exceptional customer experiences with FIDO passw...
Hyatt driving innovation and exceptional customer experiences with FIDO passw...Hyatt driving innovation and exceptional customer experiences with FIDO passw...
Hyatt driving innovation and exceptional customer experiences with FIDO passw...
 
Overview of Hyperledger Foundation
Overview of Hyperledger FoundationOverview of Hyperledger Foundation
Overview of Hyperledger Foundation
 
TrustArc Webinar - Unified Trust Center for Privacy, Security, Compliance, an...
TrustArc Webinar - Unified Trust Center for Privacy, Security, Compliance, an...TrustArc Webinar - Unified Trust Center for Privacy, Security, Compliance, an...
TrustArc Webinar - Unified Trust Center for Privacy, Security, Compliance, an...
 
Easier, Faster, and More Powerful – Notes Document Properties Reimagined
Easier, Faster, and More Powerful – Notes Document Properties ReimaginedEasier, Faster, and More Powerful – Notes Document Properties Reimagined
Easier, Faster, and More Powerful – Notes Document Properties Reimagined
 
ERP Contender Series: Acumatica vs. Sage Intacct
ERP Contender Series: Acumatica vs. Sage IntacctERP Contender Series: Acumatica vs. Sage Intacct
ERP Contender Series: Acumatica vs. Sage Intacct
 
“Iamnobody89757” Understanding the Mysterious of Digital Identity.pdf
“Iamnobody89757” Understanding the Mysterious of Digital Identity.pdf“Iamnobody89757” Understanding the Mysterious of Digital Identity.pdf
“Iamnobody89757” Understanding the Mysterious of Digital Identity.pdf
 
Top 10 CodeIgniter Development Companies
Top 10 CodeIgniter Development CompaniesTop 10 CodeIgniter Development Companies
Top 10 CodeIgniter Development Companies
 
JohnPollard-hybrid-app-RailsConf2024.pptx
JohnPollard-hybrid-app-RailsConf2024.pptxJohnPollard-hybrid-app-RailsConf2024.pptx
JohnPollard-hybrid-app-RailsConf2024.pptx
 
Google I/O Extended 2024 Warsaw
Google I/O Extended 2024 WarsawGoogle I/O Extended 2024 Warsaw
Google I/O Extended 2024 Warsaw
 
Portal Kombat : extension du réseau de propagande russe
Portal Kombat : extension du réseau de propagande russePortal Kombat : extension du réseau de propagande russe
Portal Kombat : extension du réseau de propagande russe
 

Play in practice

  • 1. PLAY IN PRACTICE/Will Sargent @will_sargent
  • 2. PREAMBLE This is going to be a broad talk.
  • 3. USAGE This talk does not attempt to be universal to all situations. YMMV.
  • 4. WHAT IS PLAY? Play is a web application framework.
  • 6. WHY PLAY IS AWESOME? Because Play is Simple.
  • 7. HERE'S WHAT PLAY DOES: Takes in an HTTP request. Returns (or streams) a response.
  • 8. HERE'S WHAT PLAY DOESN'T DO: It doesn't tie an HTTP request to a thread. It doesn't tie an HTTP session to memory. It doesn't assume you want convenient but unsafe practices. It doesn't mandate a particular object relational framework. It doesn't mandate a particular template library. It doesn't mandate a particular routing format.
  • 9. HERE'S WHAT PLAY PROVIDES AS OPTIONS: "Always-on" Build System HTTP API Templates Form Handling JSON support
  • 10. BUILD SYSTEM Modified SBT, recompiles pages on the fly in development mode. Type "play idea" or "play eclipse" to generate the files for your IDE.
  • 11. FRONT CONTROLLER Routing API (with LangPathBindable and QueryStringBindable) Action: asynchronous and stateless by default. Immutable HTTP: cookies, request, response, headers, etc. Backed by Akka and Netty.
  • 12. PRESENTATION Compiled template language (Twirl, Scaml, Jade). Built-in helpers for rendering forms. Support for Twitter Bootstrap, LESS, jQuery, etc.
  • 13. JSON Formatting to JSON Parsing of JSON objects JsPath, automatic validation, read and write combinators
  • 14. SO, WHY DOES THIS MATTER?
  • 17. MAKE MORE WEBSITES! Product Admin Customer Service Business Analytics Business Content Jobs Queue
  • 18. THE PROBLEM In a complex web application, many different front ends need to look at the same data, from different angles. Touching the database directly is dangerous and messy.
  • 19. THE SOLUTION In complex applications, use loosely coupled, stateless, composable services.
  • 20. HOW? Create a Play HTTP front end, backed by Akka. Create a business domain services, backed by Akka. Use Akka to pass messages between Play and the domain services. Present information using query services.
  • 21. ALAN KAY ON OOP “ I thought of objects being like biological cells and/or individual computers on a network, only able to communicate with messages (so messaging came at the very beginning -- it took a while to see how to do messaging in a programming language efficiently enough to be useful). ”
  • 22. COMMAND / QUERY RESPONSIBILITY SEGREGATION (CQRS) Command: a message intending a change of state. Event: a message indicating that state has changed. Fault: a message indicating failure to execute a command.
  • 23. CQRS MAPPED ONTO PLAY Processing Commands using POST Querying for Data with GET Broadcasting Events with Streaming
  • 24. PROCESSING COMMANDS Validate all input. where possible. Be very careful when handling passwords and credit card numbers. Use value classes
  • 25. COMMANDS def sendCommand(command : Command) : Future[Either[Fault,Event]]
  • 26. CQRS
  • 27. COMMAND trait Command extends Product sealed abstract class AuthenticationCommand extends Command case class AuthenticateWithPasswordCommand(email:Email, password:String, rememberMe:Boolean) extends AuthenticationCommand { override def toString = "AuthenticateWithPasswordCommand(" + email + "," + rememberMe + ")" }
  • 28. EVENT case class UserAuthenticatedEvent(userId: UserID, series: Option[Long] = None, token: Option[Long] = None) extends AuthenticationEvent
  • 29. FAULT trait AuthenticationFault case class InvalidSessionCookieFault() extends AuthenticationFault
  • 30. QUERY case class UserInfo(id: UUID, email: Email, fullName: String) class UserInfoService { def lookup(uuid: UUID)(implicit c:Credentials): Option[UserInfo] def findByName(name: String)(implicit c:Credentials) : TraversableOnce[UserIn }
  • 31. QUERY PRACTICES: Objects should be immutable Return ranges or streams over unbounded lists. Don't expose repository logic (i.e. HQL, CQL, etc) Making a good query builder is hard; avoid yak shaving.
  • 32. CONTEXT AND AUTHENTICATION Use or to set up a WrappedRequest context. Pass the request context around implicitly in every template. The request context will contain all the state you need (i.e. Credentials). Make helpers take the context as an implicit as needed. Sidenote: helpers are great for keeping logic out of templates. play2-rememberme SecureSocial
  • 33. EXAMPLE TEMPLATE @(u: UserInfo)(implicit ctx: Context) @layout(title = "User Page") { @ctx.me.map { u => <p> This is your user page. </p> } <p> User page of @{u.fullName}. </p> }
  • 34. STREAMING You send an event. Event goes through an Iteratee. Iteratee broadcasts event using Socket and Hub model. Play uses Server Sent Events to stream JSON to clients Javascript picks up that JSON from SSE, handles display. is the best reference. Sidenote: also check out lila vert.x
  • 36. LOGGING Play's internal logger isn't the greatest. Fortunately, it's not hardcoded and you can ignore it. Make your own wrapper over SF4LJ & Logback (or grizzled, or typesafe logging).
  • 37. METRICS has a Scala option. Map it through Global's onRequest method. Metrics
  • 38. TESTING Unit testing a stateless app is very easy. Swapping out services with mocks/stubs may be easier with DI (I use Subcut). Functional and integration testing with FakeRequest and Fluentlenium almost painless.
  • 39. LOAD TESTING Use jconsole and . Don't know how useful Typesafe Console is. Apache JMeter