Your SlideShare is downloading. ×
0
DEVELOPING WITH CLOUD         SERVICESChris RichardsonAuthor of POJOs in ActionFounder of the original CloudFoundry.com  @...
Presentation goal  How to build robust,scalable applications with     Cloud Services                         @crichardson
About Chris              @crichardson
(About Chris)                @crichardson
About Chris()                @crichardson
About Chris              @crichardson
About Chrishttp://www.theregister.co.uk/2009/08/19/springsource_cloud_foundry/                                            ...
vmc push About-Chris    Developer Advocate for      CloudFoundry.comSignup at http://cloudfoundry.com                     ...
Agenda• Why   use cloud services?• Developing    location-based applications• Building   SMS and telephony enabled applica...
Three phases of every galactic          civilizationSurvivalInquirySophistication                             @crichardson
Three phases of every galactic          civilizationHow can we eat?Why do we eat?Where shall we have lunch?               ...
Where shall we have lunch?            @crichardson
Solved by VoteMeetEat.com•What restaurants are nearby?•Which friends are close by?•Where do your friends prefer to eat?   ...
VoteMeetEat.comFriend and restaurant location databases                   +                  SMS                   +      ...
Key story: registration             5551212                           @crichardson
Key story: registration            +5105551212                          @crichardson
Key story: voting        555 1212                    @crichardson
Key story: announce location                          @crichardson
VOTEMEETEAT.COM To sign up text"register" to 510-   XXX-YYYY
High-level architecture                        DIY = DIFFICULT          Telephony                    Friend Geo          I...
Use cloud-based services•   Highly scalable services•   Someone else’s headache to develop and maintain•   Provided by Iaa...
Cloud Foundry services                         @crichardson
Thousands of 3rd party services http://www.slideshare.net/jmusser/j-musser-apishotnotgluecon2012         http://www.progra...
Cloud service trends• Predominantly     REST• Predominantly     JSON•> billion API calls/day: Twitter, Google, Facebook, N...
Diverse          @crichardson
Benefits of cloud services• Someone      else’s headache to develop and operate• Focus   on your core business problem• Get...
Drawbacks of cloud services• Complexity   and drawbacks of a distributed system• You   are dependent on service provider  ...
Risks of cloud services Urban Airship’s Strategic Partnership With   SimpleGeo Turns Into An Acquisition                  ...
Cloud Services-based             architecture           Twilio                                  MongoDBMobilePhone        ...
DEMO       @crichardson
Agenda• Why   use cloud services?• Developing    location-based applications• Building   SMS and telephony enabled applica...
Location-based services are hot!                             @crichardson
Client-side APIs for finding                locationW3C Geolocation API                                    @crichardson
BUT what about the server-side?                            @crichardson
Lots of really difficult problems• Scalable, spatial database – CRUD records, find nearby• Data management – database of pla...
Examples of Geo-aaS•   Maps                             • Freely available geographic•   Forward and reverse geocoding    ...
VoteMeetEat.com & Geotrait FriendService {    def addOrUpdate(request : AddOrUpdateUserRequest)    def findNearbyFriends(r...
Implementing the friends             databasetrait FriendService {    def addOrUpdate(request : AddOrUpdateUserRequest)   ...
MongoDB• Document-oriented       database• Very   fast, highly scalable and available• Rich     query language that suppor...
Storing friends in MongoDB             MongoDB server         Database: VoteMeetEat        Collection: friendRecord  {    ...
Spring Data for MongoDB• Provides   MongoTemplate• Analogous    to JdbcTemplate• Hides   boilerplate code• Domain     obje...
Using Spring data: creating an     index on location attribute@Componentclass MongoFriendService extends FriendService {  ...
Using Spring Data: adding record@Componentclass MongoFriendService extends FriendService {  override def addOrUpdate(reque...
Using Spring Data: finding nearby               friends@Componentclass MongoFriendService extends FriendService {  override...
MongoDB and Cloud Foundry$ vmc create-service mongodb vme-mongo                                   @crichardson
Binding a service to an application   $ vmc push vme-user --path web/target/   Application Deployed URL [cer-spring.cloudf...
Connecting to MongoDB	 <bean id="mongoTemplate"       class="org.springframework.data.mongodb.core.MongoTemplate">	 	 <con...
Implementing the restaurant            databasetrait RestaurantService {  def findNearbyRestaurants(location: Location) : ...
Using Factual• Geographic     database as a Service• Including      1.2M restaurants in the US• Pricing: 10K   calls day f...
Factual API• RESTful/JSON     interface  • Uses   2-legged OAuth 1.0.  • Geo    and text filters  • Pagination• Libraries  ...
Restaurant Service@Serviceclass FactualRestaurantService extends RestaurantService {  @Value("${factual_consumer_key}") va...
Agenda• Why   use cloud services?• Developing    location-based applications• Building   SMS and telephony enabled applica...
The telephony and SMS are                   important    7/ waking hr !http://blog.nielsen.com/nielsenwire/online_mobile/n...
Reporting traffic light problems in London                                     @crichardson
Google 2-Factor authentication                           @crichardson
VoteMeetEat.com & Telephony• Handling   registration SMS• Sending   SMS notifying users to vote• Handling   incoming voice...
DIY telephony = Difficult                                           aS:                                        y-a         ...
Telephony/SMS - aaS• SMS                         • SMS• Inbound and outgoing calls • Inbound and outgoing calls• Recording...
Twilio - Telephony and SMS as a                service• REST API  • Allocate phone numbers  • Make and receive phone calls...
Using Twilio                      Manage resources                                                        Send SMS        ...
Handling SMS registration                          User                          texts                        ‘register’  ...
Handling SMS registration               HTTP POST               http://≪smsUrl≫?From=≪PhoneNumber≫SMS                     ...
Handling SMS registration                      TwiML document                       describing the                        ...
Inviting users to vote                    System sends                         text   5551212                           @c...
Inviting users to votePOST /2010-04-01/Accounts/≪AccountSID≫/SMS/Messages From=+15105551212&To=+14155551212&Body=≪MESSAGE≫...
Sending SMS using the Spring            RestTemplate@Componentclass TwilioService {	   def sendSms(recipient : String, mes...
Sending SMS using the Spring@Component              RestTemplateclass TwilioService {                                     ...
Voting: user calls number            555 1212                            @crichardson
Voting                HTTP POST                http://≪voiceUrl≫?From=≪PhoneNumber≫                                       ...
Voting                  HTTP POST                  http://....handleresponse.html?                  From=≪PhoneNumber≫&Dig...
Voting code 1@Controllerclass TwilioController {  @Autowired  var surveyManagementService: SurveyManagementService = _ @Re...
Voting code 2class TwilioController {  ...  @RequestMapping(value = Array("/handleresponse.html"))  @ResponseBody  def han...
Agenda• Why   use cloud services?• Developing    location-based applications• Building   SMS and telephony enabled applica...
The need for parallelism                                  Service B               b = serviceB()                          ...
Futures are a great concurrency              abstraction•   Object that will contain the result of a concurrent computatio...
Using futures to parallelize requests    trait FriendService {        def findNearbyFriends(request : NearbyFriendsRequest...
Using external web services =       Distributed system         Twilio                                MongoDBMobilePhone   ...
Internally = Distributed System       Survey     management                                User                           ...
Handling failureService A                   Service B            Errors happen        in distributed systems              ...
About Netflix         > 1B API calls/day1 API call   average 6 service calls    Fault tolerance is essential               ...
Use network timeouts and retries            Never wait forever  Network errors can be transient                           ...
Use per-dependency bounded thread pool                   Service A     Runnable 1               Task 1     Runnable 2     ...
Use a circuit breaker         High error rate      stop calling temporarily            Down     wait for it to come back u...
On failure          Return cached dataAvoidFailing          Return default data               Fail fast                   ...
About Netflix Hystrix•   Open-source library from Netflix•   Implements                      class MyCommand                ...
Using Hystrix@Serviceclass FactualRestaurantService extends RestaurantService {    @Autowired    @Qualifier("factualHystri...
SummaryCloud services are highly scalable services developed and                operated by a 3rd party     Let’s you focu...
@crichardson chris.richardson@springsource.com  http://plainoldobjects.com - code and slides            Questions?    Sign...
Developing applications with Cloud Services (Devnexus 2013)
Upcoming SlideShare
Loading in...5
×

Developing applications with Cloud Services (Devnexus 2013)

3,536

Published on

Cloud computing isn’t just about application deployment. There are also a growing number of cloud-based web services that you can use to develop your application. One of the most well known is Amazon’s Simple Storage Service. But there are many others including web services for messaging, relational and NoSQL databases, email and telephony. Using these services allows you to build highly scalable applications without the pain and cost of having to develop and operate your own infrastructure.

In this presentation, you will learn about the benefits and drawbacks of these Web services; their typical use cases and how to use them. We will describe a location aware, telephony application that is built using cloud services. You will learn about strategies for building resilient, fault tolerant applications that consume cloud services.

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
3,536
On Slideshare
0
From Embeds
0
Number of Embeds
10
Actions
Shares
0
Downloads
36
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Transcript of "Developing applications with Cloud Services (Devnexus 2013)"

  1. 1. DEVELOPING WITH CLOUD SERVICESChris RichardsonAuthor of POJOs in ActionFounder of the original CloudFoundry.com @crichardsonchris.richardson@springsource.comhttp://plainoldobjects.com
  2. 2. Presentation goal How to build robust,scalable applications with Cloud Services @crichardson
  3. 3. About Chris @crichardson
  4. 4. (About Chris) @crichardson
  5. 5. About Chris() @crichardson
  6. 6. About Chris @crichardson
  7. 7. About Chrishttp://www.theregister.co.uk/2009/08/19/springsource_cloud_foundry/ @crichardson
  8. 8. vmc push About-Chris Developer Advocate for CloudFoundry.comSignup at http://cloudfoundry.com @crichardson
  9. 9. Agenda• Why use cloud services?• Developing location-based applications• Building SMS and telephony enabled applications• Developing robust, fault tolerant applications @crichardson
  10. 10. Three phases of every galactic civilizationSurvivalInquirySophistication @crichardson
  11. 11. Three phases of every galactic civilizationHow can we eat?Why do we eat?Where shall we have lunch? @crichardson
  12. 12. Where shall we have lunch? @crichardson
  13. 13. Solved by VoteMeetEat.com•What restaurants are nearby?•Which friends are close by?•Where do your friends prefer to eat? To sign up text "register" to 510- XXX-YYYY @crichardson
  14. 14. VoteMeetEat.comFriend and restaurant location databases + SMS + Voice calls To sign up text "register" to 510- XXX-YYYY @crichardson
  15. 15. Key story: registration 5551212 @crichardson
  16. 16. Key story: registration +5105551212 @crichardson
  17. 17. Key story: voting 555 1212 @crichardson
  18. 18. Key story: announce location @crichardson
  19. 19. VOTEMEETEAT.COM To sign up text"register" to 510- XXX-YYYY
  20. 20. High-level architecture DIY = DIFFICULT Telephony Friend Geo Integration DatabaseMobile VoteMeetPhone Eat Restaurant Database Do we really want to build all this? @crichardson
  21. 21. Use cloud-based services• Highly scalable services• Someone else’s headache to develop and maintain• Provided by IaaS/PaaS• Provided by 3rd party @crichardson
  22. 22. Cloud Foundry services @crichardson
  23. 23. Thousands of 3rd party services http://www.slideshare.net/jmusser/j-musser-apishotnotgluecon2012 http://www.programmableweb.com/apis/directory @crichardson
  24. 24. Cloud service trends• Predominantly REST• Predominantly JSON•> billion API calls/day: Twitter, Google, Facebook, Netflix, Accuweather, ...• Increasing number of API-only companies http://www.slideshare.net/jmusser/j-musser-apishotnotgluecon2012 @crichardson
  25. 25. Diverse @crichardson
  26. 26. Benefits of cloud services• Someone else’s headache to develop and operate• Focus on your core business problem• Get up and running quickly• Elasticity• Capex Opex @crichardson
  27. 27. Drawbacks of cloud services• Complexity and drawbacks of a distributed system• You are dependent on service provider @crichardson
  28. 28. Risks of cloud services Urban Airship’s Strategic Partnership With SimpleGeo Turns Into An Acquisition @crichardson
  29. 29. Cloud Services-based architecture Twilio MongoDBMobilePhone VoteMeetEat Factual.Com @crichardson
  30. 30. DEMO @crichardson
  31. 31. Agenda• Why use cloud services?• Developing location-based applications• Building SMS and telephony enabled applications• Developing robust, fault tolerant applications @crichardson
  32. 32. Location-based services are hot! @crichardson
  33. 33. Client-side APIs for finding locationW3C Geolocation API @crichardson
  34. 34. BUT what about the server-side? @crichardson
  35. 35. Lots of really difficult problems• Scalable, spatial database – CRUD records, find nearby• Data management – database of places, street information• Forward geo-coding: address lat/lon• Reverse geo-coding: lat/lon address• Maps• Directions Easier to use Geo-aaS @crichardson
  36. 36. Examples of Geo-aaS• Maps • Freely available geographic• Forward and reverse geocoding database• Directions • Various APIs including• Elevation reverse geocoding• Places• Business+review database • Places database• Neighborhood database • Reverse geocoding Beware the terms of service @crichardson
  37. 37. VoteMeetEat.com & Geotrait FriendService { def addOrUpdate(request : AddOrUpdateUserRequest) def findNearbyFriends(request : NearbyFriendsRequest) : FindNearbyFriendsResponse}trait RestaurantService { def findNearbyRestaurants(location: Location) : FindNearbyRestaurantResponse} @crichardson
  38. 38. Implementing the friends databasetrait FriendService { def addOrUpdate(request : AddOrUpdateUserRequest) def findNearbyFriends(request : NearbyFriendsRequest) : FindNearbyFriendsResponse} @crichardson
  39. 39. MongoDB• Document-oriented database• Very fast, highly scalable and available• Rich query language that supports location- based queries• Provided by CloudFoundry.com @crichardson
  40. 40. Storing friends in MongoDB MongoDB server Database: VoteMeetEat Collection: friendRecord { "_id": "+15105551212", "name": "Chris R.", "location": { "x": -122.25206103187264, "y": 37.847427441773796 } } @crichardson
  41. 41. Spring Data for MongoDB• Provides MongoTemplate• Analogous to JdbcTemplate• Hides boilerplate code• Domain object Document mapping @crichardson
  42. 42. Using Spring data: creating an index on location attribute@Componentclass MongoFriendService extends FriendService { @Autowired var mongoTemplate: MongoTemplate = _ @PostConstruct Collection name def createGeoIndex { val dbo = new BasicDBObject dbo.put("location", "2d") mongoTemplate.getCollection("friendRecord").ensureIndex(dbo) } Create geospatial 2d index @crichardson
  43. 43. Using Spring Data: adding record@Componentclass MongoFriendService extends FriendService { override def addOrUpdate(request: AddOrUpdateUserRequest) = { val name = request.name val phoneNumber = request.phoneNumber val fr = new FriendRecord(phoneNumber, name, new Point(request.longitude, request.latitude)) mongoTemplate.save(fr) } case class FriendRecord(id : String, name : String, location : Point) @crichardson
  44. 44. Using Spring Data: finding nearby friends@Componentclass MongoFriendService extends FriendService { override def findNearbyFriends(request: NearbyFriendsRequest) = { val location = new Point(request.longitude, request.latitude) val distance = new Distance(3, Metrics.MILES) val query = NearQuery.near(location).maxDistance(distance) val result = mongoTemplate.geoNear(query, classOf[FriendRecord]) val nearby = result.getContent.map(_.getContent) FindNearbyFriendsResponse(nearby.map(f => FriendInfo(f.name, f.id))) } @crichardson
  45. 45. MongoDB and Cloud Foundry$ vmc create-service mongodb vme-mongo @crichardson
  46. 46. Binding a service to an application $ vmc push vme-user --path web/target/ Application Deployed URL [cer-spring.cloudfoundry.com]: Detected a Java SpringSource Spring Application, is this correct? [Yn]: Memory Reservation (64M, 128M, 256M, 512M, 1G) [512M]: Creating Application: OKWould you like to bind anyany services to vme-user? [yN]: y Would you like to bind services to vme-user? [yN]: yWould you like to use an an existing provisioned [yN]: y Would you like to use existing provisioned service? service? [yN]: yThe The following provisioned services are available following provisioned services are available1: vme-mongo 1: vme-mongo2: mysql-135e0 2: mysql-135e0Please select one you wish to use: use: 1 Please select one you wish to 1Binding Service [vme-mongo]: OK OK Binding Service [vme-mongo]: Uploading Application: Checking for available resources: OK Processing resources: OK Packing application: OK Uploading (12K): OK Push Status: OK @crichardson
  47. 47. Connecting to MongoDB <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate"> <constructor-arg ref="mongoFactory" /> </bean> Outside of Cloud Foundry <beans profile="default"> <mongo:db-factory id="mongoFactory" dbname="surveygeo" /> </beans> Inside Cloud Foundry <beans profile="cloud"> <cloud:mongo-db-factory id="mongoFactory" /> </beans> @crichardson
  48. 48. Implementing the restaurant databasetrait RestaurantService { def findNearbyRestaurants(location: Location) : FindNearbyRestaurantResponse} @crichardson
  49. 49. Using Factual• Geographic database as a Service• Including 1.2M restaurants in the US• Pricing: 10K calls day free, pay per use @crichardson
  50. 50. Factual API• RESTful/JSON interface • Uses 2-legged OAuth 1.0. • Geo and text filters • Pagination• Libraries for various languages @crichardson
  51. 51. Restaurant Service@Serviceclass FactualRestaurantService extends RestaurantService { @Value("${factual_consumer_key}") var consumerKey: String = _ @Value("${factual_consumer_secret}") var consumerSecret: String = _ var factual: Factual = _ @PostConstruct 5 restaurants within 1km def initialize { factual = new Factual(consumerKey, consumerSecret, true) } override def findNearbyRestaurants(location: Location) = { ... val restaurants = factual.get.fetch("restaurants-us", new Query().within(new Circle(location.lat, location.lon, 1000)).limit(5)) val rs = restaurants.getData.map { map => RestaurantInfo(map.get("name").asInstanceOf[String]) } FindNearbyRestaurantResponse(rs.toList) }... @crichardson
  52. 52. Agenda• Why use cloud services?• Developing location-based applications• Building SMS and telephony enabled applications• Developing robust, fault tolerant applications @crichardson
  53. 53. The telephony and SMS are important 7/ waking hr !http://blog.nielsen.com/nielsenwire/online_mobile/new-mobile-obsession- Nielsen u-s-teens-triple-data-usage/ @crichardson
  54. 54. Reporting traffic light problems in London @crichardson
  55. 55. Google 2-Factor authentication @crichardson
  56. 56. VoteMeetEat.com & Telephony• Handling registration SMS• Sending SMS notifying users to vote• Handling incoming voice call from voters: • Text-to-speech of restaurants options • Collecting digits entered via keypad• Sending SMS/Voice notifications of voting results @crichardson
  57. 57. DIY telephony = Difficult aS: y-a hon• Difficult to setup and operate Telep• Expensive e S MS/ to us ter• Complex SMS protocols Bet•… @crichardson
  58. 58. Telephony/SMS - aaS• SMS • SMS• Inbound and outgoing calls • Inbound and outgoing calls• Recording and transcription • Recording and transcription • Twitter • IM @crichardson
  59. 59. Twilio - Telephony and SMS as a service• REST API • Allocate phone numbers • Make and receive phone calls • Send and receive SMS messages• Pay per use: • Phone calls - per-minute • SMS – per SMS sent or received • Phone number – per month• Examples • OpenVBX is a web-based, open source phone system • StubHub – notifies sellers of a pending sale via phone • SurveyMonkey – interactive polling • Salesforce – SMS-based voting for 19,000 conference attendees @crichardson
  60. 60. Using Twilio Manage resources Send SMS Initiate voice calls REST API Voice SMS Your Twilio HTTP GET/ Application POST TwiML doc Phone number Handle incoming SMS and voice callsSMS URL + VOICE URL Respond to user input @crichardson
  61. 61. Handling SMS registration User texts ‘register’ System 5 replies551212 @crichardson
  62. 62. Handling SMS registration HTTP POST http://≪smsUrl≫?From=≪PhoneNumber≫SMS SMS Twilio REGISTRATION <Response> <Sms>To complete registration please go to http://... </Sms> </Response> @crichardson
  63. 63. Handling SMS registration TwiML document describing the response @crichardson
  64. 64. Inviting users to vote System sends text 5551212 @crichardson
  65. 65. Inviting users to votePOST /2010-04-01/Accounts/≪AccountSID≫/SMS/Messages From=+15105551212&To=+14155551212&Body=≪MESSAGE≫Authorization: Basic .... Basic auth using Twilio AccountSid+AuthToken @crichardson
  66. 66. Sending SMS using the Spring RestTemplate@Componentclass TwilioService { def sendSms(recipient : String, message : String) = { val response = postToTwilio("SMS/Messages", Map("From" -> twilioPhoneNumber, "To" -> recipient, "Body" -> message)) (response "SMSMessage" "Sid").text } @crichardson
  67. 67. Sending SMS using the Spring@Component RestTemplateclass TwilioService { TODO def postToTwilio(resourcePath : String, requestParams : Map[String, String]) = { val entity = makeEntity(requestParams) try { val response = restTemplate.postForObject(twilioUrl + "/Accounts/{accountSid}/{resource}", entity, classOf[String], accountSid, resourcePath) XML.loadString(response) } catch { case e : HttpClientErrorException if e.getStatusCode == HttpStatus.BAD_REQUEST => val body = e.getResponseBodyAsString() val xmlBody = XML.loadString(body) val code = Integer.parseInt((xmlBody "Code").text) val message = (xmlBody "Message").text throw new TwilioRestException(message, code) }} @crichardson
  68. 68. Voting: user calls number 555 1212 @crichardson
  69. 69. Voting HTTP POST http://≪voiceUrl≫?From=≪PhoneNumber≫ Survey ManagementCall <Response> Twilio <Say> Chris would like to meet and eat. </Say> <Gather action="handleresponse.html" method="POST" numDigits="1"> <Say>Press 1 for ....</Say> <Say>Press 2 for ....</Say> </Gather> </Response> @crichardson
  70. 70. Voting HTTP POST http://....handleresponse.html? From=≪PhoneNumber≫&Digits=≪...≫ Survey ManagementDigits <Response> Twilio <Say>Thank you for choosing. The most popular place so far is ... </Say> <Pause/> <Say>You will hear from us soon. Good bye</Say> <Hangup/> </Response> @crichardson
  71. 71. Voting code 1@Controllerclass TwilioController { @Autowired var surveyManagementService: SurveyManagementService = _ @RequestMapping(value = Array("/begincall.html")) @ResponseBody def beginCall(@RequestParam("From") callerId: String) = { surveyManagementService.findSurveyByCallerId(callerId) match { case None => <Response> <Say>Sorry dont recognize your number</Say> <Hangup/> </Response> case Some(survey) => <Response> <Say>{ survey.prompt }</Say> <Gather action="handleresponse.html" method="POST" numDigits="1"> { for ((choice, index) <- survey.choices zipWithIndex) yield <Say>Press { index } for { choice }</Say> } </Gather> <Say>We are sorry you could not decide</Say> <Hangup/> </Response> } @crichardson }
  72. 72. Voting code 2class TwilioController { ... @RequestMapping(value = Array("/handleresponse.html")) @ResponseBody def handleUserResponse(@RequestParam("From") callerId: String, @RequestParam("Digits") digits: Int) = { val survey = surveyManagementService.recordVote(callerId, digits) <Response> <Say>Thank you for choosing. The most popular place so far is { survey.map(_.mostPopularChoice) getOrElse "oops" } </Say> <Pause/> <Say>You will hear from us soon. Good bye</Say> <Hangup/> </Response> }} @crichardson
  73. 73. Agenda• Why use cloud services?• Developing location-based applications• Building SMS and telephony enabled applications• Developing robust, fault tolerant applications @crichardson
  74. 74. The need for parallelism Service B b = serviceB() Call in parallel c = serviceC()Service A Service C d = serviceD(b, c) Service D @crichardson
  75. 75. Futures are a great concurrency abstraction• Object that will contain the result of a concurrent computation - http://en.wikipedia.org/wiki/Futures_and_promises• Various implementations Future<Integer> result = executorService.submit(new Callable<Integer>() {... }); • Java 7 Futures = ok • Guava ListenableFutures = better • Scala’s composable Futures = really good • Java 8 CompletableFuture = great @crichardson
  76. 76. Using futures to parallelize requests trait FriendService { def findNearbyFriends(request : NearbyFriendsRequest) : Future[FindNearbyFriendsResponse] } trait RestaurantService { Client def findNearbyRestaurants(location: Location) : Side Future[FindNearbyRestaurantResponse] Proxies }val f1 = friendsService.findNearbyFriends(NearbyFriendsRequest.fromLocation(vmeRecord.location))val f2 = restaurantService.findNearbyRestaurants(vmeRecord.location)val nearbyFriends = f1.get(2, TimeUnit.SECONDS)val nearbyRestaurants = f2.get(2, TimeUnit.SECONDS) Two calls execute concurrently @crichardson
  77. 77. Using external web services = Distributed system Twilio MongoDBMobilePhone VoteMeetEat Factual.Com @crichardson
  78. 78. Internally = Distributed System Survey management User management Registration SMS Rabbit MQ Registration web app VME management VME web app @crichardson
  79. 79. Handling failureService A Service B Errors happen in distributed systems @crichardson
  80. 80. About Netflix > 1B API calls/day1 API call average 6 service calls Fault tolerance is essential http://techblog.netflix.com/2012/02/fault-tolerance-in-high-volume.html @crichardson
  81. 81. Use network timeouts and retries Never wait forever Network errors can be transient retry http://techblog.netflix.com/2012/02/fault-tolerance-in-high-volume.html @crichardson
  82. 82. Use per-dependency bounded thread pool Service A Runnable 1 Task 1 Runnable 2 Task 2 Service B Runnable ... Task ... bounded queue bounded thread pool Fails fast if Limits number ofservice is slow or down outstanding requests http://techblog.netflix.com/2012/02/fault-tolerance-in-high-volume.html @crichardson
  83. 83. Use a circuit breaker High error rate stop calling temporarily Down wait for it to come back up Slow gives it a chance to recoverClosed errors Open timeout success Half fail open http://techblog.netflix.com/2012/02/fault-tolerance-in-high-volume.html @crichardson
  84. 84. On failure Return cached dataAvoidFailing Return default data Fail fast http://techblog.netflix.com/2012/02/fault-tolerance-in-high-volume.html @crichardson
  85. 85. About Netflix Hystrix• Open-source library from Netflix• Implements class MyCommand extends HystrixCommand[ResultType](...) • Circuit Breaker pattern override def run() = { ... Invoke remote service ... • Bounded thread-pool } } • Fallback logic val future = new MyCommand().queue() ... • ...• https://github.com/Netflix/Hystrix @crichardson
  86. 86. Using Hystrix@Serviceclass FactualRestaurantService extends RestaurantService { @Autowired @Qualifier("factualHystrixConfig") var factualHystrixConfig: HystrixCommand.Setter = _ override def findNearbyRestaurants(location: Location) = { class FindRestaurantsCommand extends HystrixCommand[FindNearbyRestaurantResponse] (factualHystrixConfig .andCommandKey(HystrixCommandKey.Factory.asKey("FindRestaurantsCommand"))) { override def run() = { val restaurants = factual.fetch("restaurants", new Query().within(new Circle(location.lat, location.lon, 1000)).limit(5)) val rs = for (map <- restaurants.getData) yield { RestaurantInfo(map.get("name").asInstanceOf[String]) } FindNearbyRestaurantResponse(rs.toList) } } new FindRestaurantsCommand().queue() }} @crichardson
  87. 87. SummaryCloud services are highly scalable services developed and operated by a 3rd party Let’s you focus on your core business problem Risk: provider is acquired and stops offering service Developing an application that reliably consumes cloud services requires careful design @crichardson
  88. 88. @crichardson chris.richardson@springsource.com http://plainoldobjects.com - code and slides Questions? Sign up for CloudFoundry.com @crichardson
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×