SlideShare uma empresa Scribd logo
1 de 52
Baixar para ler offline
Practical Thin Server
Architecture with Dojo

  Peter Svensson, Nethouse AB
     psvensson@gmail.com
But first..


Some theory
What is this all about?
Reducing complexity
Server-Centric Frameworks


  Client                                      Server

           Browser      New Web Page             Web-page        Business Logic
                                                building logic        and
                                                                   Database

                          User Action




                         Gazillion framework-specific XML configuration files.
                     Possibly hairy dependencies between presentation and logic.
Problems with server-centric
frameworks
•   Poor distribution of processing
•   High user response latency
•   Difficult programming model
•   Heavy state management on the servers
•   Offline Difficulties
•   Reduced opportunity for interoperability
Poor distribution of processing

With a large number of clients, doing all the processing on the
server is inefficient.




                                      Client UI
                                      generation for
                                      each client
High user response latency

Traditional web applications are not responsive enough. High
quality user interaction is very sensitive to latency, and very fast
response is essential.
Difficult programming model

• Client interface is split into several 'canned' places in the server.
• JavaScript is hidden and/or mapped to server-centric
  functionality.
• Client-Server communication is folded into a faux single
  machine model.
• When web application is running, what you see is not what you
  coded.
• This adds additional complexity in mapping debugging as well.
• The HTML design needs massage to fit into server-side
  templates.
Heavy state management on the
servers
• Client user interface state is maintained by the server.
• This requires a significant increase in resource utilization as
  server side sessions must be maintained with potentially
  large object structures within them.
• Usually these resources can’t be released until a session
  times out, which is often 30 minutes after a user actually
  leaves the web site.
Offline Difficulties

• Adding offline capabilities to a web application can be a
  tremendous project when user interface code is
  predominantly on the server.
• The user interface code must be ported to run on the client
  in offline situations.
Reduced opportunity for interoperability

• Client/server communication is hidden by framework.
• Server 'endpoints' is hard or impossible to isolate.
• Integration (SOA, vendor/customer system) projects must
  start from scratch.
• Risk of reinventing wheel.
• Changes in web application code might not match changes
  in integration code.
A modest proposal: Thin Server
Architecture
Thin Server Architecture is about moving UI code from the server
to the client, any way you like (more or less).
Similar ideas

SOFEA - Service Oriented Front-End Architecture;
http://www.theserverside.com/news/thread.tss?thread_id=47213

MĂĄrio Valente's blogs on the future of web applications;
http://mv.asterisco.pt/


Products based on the idea of 'thin servers';

•   TIBCO GI
•   SmartClient
•   WaveMaker (uses Dojo! :     )‫‏‬
•   Probably lots of others..
Thin Server Architecture
1. All functionality that possibly can be implemented on the client side
should be implemented on the client side.

2. All communication with the application server should be using
services (REST, SOAP, domain-specific).

3. No part of the client should be evoked, generated or templated from
the server-side. This rules out in-line conditional HTML in JSP, ASP,
PHP, et.c.

4. The logic in the server will only implement the following functionality;
a) Security, b) Business logic, c) Proxying
Thin Server Architecture


  Client                                    Server

                     Original client load
           Browser                                   Business Logic
                                                          and
                                                       Database

                     Only raw data
Benefits of Thin Server Architecture

•   Scalability
•   Immediate user response
•   Organized programming model
•   Client side state management
•   Offline applications
•   Interoperability
Scalability


• The more clients that use an application, the more client
  machines that are available (d0h).
• Any presentation logic that can be moved to the client scales
  1:1 with the number of clients.
Immediate User Response

• Client side code can immediately react to user input, rather
  than waiting for network transfers.
• If you need data on the server, you need data on the server.
  There's no way around that.
• At least we don't have to load THE WHOLE PAGE again,
  just to get an updated list of cheese.
Organized Programming Model

• Client and server are explicitly modeled and no 'mapping' is
  required.
• Neither side needs to be 'pretended' on the other side.
• Each side implement its own logic, completely separated from
  the other, leading to less risk of entanglement.
• When debugging, the messages and object being inspected
  are 'real'.
• Less complexity.
• Asynchronous development.
Client Side State Management

• Transient session state information on the client reduces the
  memory load on the server.
• The client decides what to show, cache and request from the
  server.
• The server manages security, not widget state.
Offline Applications

• Having a clean separation between client and server makes
  it simpler to implement offline modes.
• Certain toolkits have client-side data abstractions which can
  switch to offline stores transparently, when needed.
Interoperability

• Using structured data with minimal APIs for interaction,
  makes it easier to connect additional consumers and
  producers to interact with existing systems.
• By exposing explicit and secure data-interchange interfaces
  on the server, we get interoperability for free.
But what about GWT and stuff like that?

• The code generated does indeed follow separation of
  concerns, with a clearly defined client.
• However, the development environment is even “better” at
  hiding what goes on 'under the hood'.
• Debugging is convoluted, trying (and succeeding) in using a
  single Java abstraction to hide the dual layers of client and
  server.
• A wonderful but complex solution for a problem that is already
  solved more simply.
Psychology of not wanting to code on
the client
• The hard, steep climb of language mastery : Not again!
• The 'knowledge' gained anno 2003: JS sucks (== browser
  incompatibilities sucks)‫‏‬
• The world stopped at that date.
• Wanting to search for the keys where the light is, rather than
  were they were dropped.
• Wanting to make coding web apps less complex!
Some new things that has happened
since 2003
Ajax toolkits provide consistent APIs and hide cross-browser
differences for the following stuff;

•   Browser events
•   Styling
•   DOM positioning and Box-models
•   Ajax communication
•   2D graphics (Dojo wraps SVG, VML, Canvas and more)‫‏‬
•   Pseudo class-based OO
•   And more
Do what's best for each team (and the
project)‫‏‬
• Don't force UI logic onto server-side developers.
• Don't force front-end developers to get entwined in server
  internals
What does thin-server architecture
mean for the team?
• The Designers: Normal files makes for simpler mockups
  and simpler changes. Just ordinary HTML/CSS/Images
• The Front-end developers: Normal files makes for simpler
  mockups and simpler changes. Just ordinary HTML/JS
• The Back-end developers: No UI logic makes a simpler
  server. Can focus on _only_ business logic/database stuff
• More Front-End goodness: Mock servers/services:
  Creating the contract and developing asynchronously
Scenario 1

We need to change the styling of the web site.

Now: Does not affect back-end developers.

Before: The HTML and CSS needed to be 'templatized'
according to the mad doctor scheme du jour.
Scenario 2

We need to add a tab that shows the same data as in the list
tab, but as a bar chart - oh, and you must be able to switch
dates dynamically.

Now: Does not affect back-end developers. Charts are
rendered to the whim of the user with cached data.

Before: Each date change generates a new page reload.
Server is bogged down by the generation of gazillion static
images .
Scenario 3

We need to scrap a lot of the code that generates data for the
list of car models.

Now: Will not affect Designers or Front-End developers. The
web endpoint API is conserved.

Before: Since the old base template that we used to generate
the hand-coded rules which drives the XSLT engine which
generates the PHP code which contains most of the HTML and
CSS for the final page (half are in Barry's module), we need
you to split the page into three-line stripes with separate but
identical CSS files for each, with all images inlined as binary
XML.
Protocol ensures separation of
concerns
Client (Browser)‫‏‬              Server


  Data store+       Protocol   /service
  cache
Enough theory already


Let's see some code
Dojo Example (warming up)‫‏‬
<html>
   <head>
     <link href=quot;http://o.aolcdn.com/dojo/1.2.0/dojo/resources/dojo.cssquot; rel=quot;stylesheetquot; type=quot;text/cssquot;/>
     <link href=quot;http://o.aolcdn.com/dojo/1.2.0/dijit/themes/dijit.cssquot; rel=quot;stylesheetquot; type=quot;text/cssquot;/>
     <link href=quot;http://o.aolcdn.com/dojo/1.2.0/dijit/themes/tundra/tundra.cssquot; rel=quot;stylesheetquot; type=quot;text/cssquot;
/>
     <title>Dojo Test</title>
     <script type=quot;text/javascriptquot;>
     djConfig= {      parseOnLoad: true }
     </script>
     <script src=quot;http://o.aolcdn.com/dojo/1.2.0/dojo/dojo.xd.jsquot; type=quot;text/javascriptquot;></script>
     <script type=quot;text/javascriptquot;>
        dojo.require(quot;dojo.parserquot;);
        dojo.require(quot;dijit.form.Buttonquot;);
        dojo.require(quot;dijit.form.SimpleTextareaquot;);
     </script>
   </head>
 <body class=quot;tundraquot;>
   <button id=quot;mybuttonquot; dojoType=quot;dijit.form.Buttonquot; onClick='dijit.byId(quot;q1quot;).attr(quot;valuequot;, quot;fooquot;)'>Click
Me</button>
   <textarea id=quot;q1quot; dojoType=quot;dijit.form.SimpleTextareaquot; name=quot;ta1quot; rows=5 cols=50 ></textarea>
 </body>
</html>
Dojo loader

The dojo loader looks where dojo.js is loaded from, and use that
as a base url to look for requirements.

Given           http://o.aolcdn.com/dojo/1.2.0/dojo/dojo.xd.js

The line        dojo.require(quot;dijit.form.buttonquot;);

Tries to load   ../dijit/form/button.js

Which becomes http://o.aolcdn.com/dojo/1.2.0/dijit/form/button.js
Dojo Custom Widgets
• Use a folder hierarchy to leverage the loader
• Use client-side templates for widgets
• Create nested widgets

Example:
 dojo-1.2.0                   --- root folder for Dojo
   dojo
   dijit
   dojox
   mycorp                     --- your custom folder
       scaffold
         main.js
         templates
            main.html
Steps to load a Dojo widget

1. The Dojo parser parses the page (or part of the page)‫‏‬
2. The parser finds elements with the 'dojoType=quot;x.y.zquot; ' property
3. Is the Dojo class x.y.z loaded already (by dojo.require,
perhaps)?
4. If no, resolve where from, and load it.
5. Create a new instance of class x.y.z
6. Find and populate template (if any) for x.y.z
7. Call magic functions (as defined) for lifecycle management of
x.y.z
A custom widget class
dojo.provide(quot;scaffold.mainquot;);
//...dojo.requires...

dojo.declare(quot;scaffold.mainquot;, [ dijit._Widget, dijit._Templated ],
{
  templatePath         : dojo.moduleUrl(quot;scaffoldquot;,quot;templates/main.htmlquot;),
  widgetsInTemplate : true,
  content              : {}, // name - url pairs for menu building
  name                  : quot;quot;,

  postCreate: function()
  {
    console.log(quot;postCreate for scaffold.main calledquot;);
     ...
  }
...
});
A custom widget template (main.html)‫‏‬

<div>
 <div dojoAttachPoint=quot;mymenuquot; class=quot;scaffold_menuquot;>
     ${name}
 </div>
 <div dojoType=quot;dijit.layout.StackContainerquot;
dojoAttachPoint=quot;mystackquot; class=quot;scaffold_mainquot;>
 </div>
</div>

An 'attachPoint=quot;xquot; ' element or widget gets mapped to a 'this.x'
property in the Widget class. ${y} inserts the value of 'this.y' .
Using the custom widget
   ...
     <script type=quot;text/javascriptquot;>
        dojo.require(quot;dojo.parserquot;);
        dojo.require(quot;mycorp.scaffold.mainquot;);
     </script>
  </head>
 <body class=quot;tundraquot;>
  <div dojoType=quot;mycorp.scaffold.mainquot; name=quot;foobarquot;
  content=quot;{'news': 'scaffold/content/news.html', 'products':
  'scaffold/content/products.html', 'partners':
  'scaffold/content/partners.html', 'people' :
  'scaffold/content/people.html'}quot;>
  </div>
 </body>
</html>
What the widget might look like
Dojo.data
Client-side data model that separates consumers of data
(widgets, for example) from the producers (server, services,
files, offline)‫‏‬
Dojo.data stores
• AndOrReadStore - Based on ItemFileReadStore, but support complex
  queries.
• AndOrWriteStore - Based on ItemFileWrite as above
• AtomReadStore - RO store for Atom XML based feeds
• CouchDbRestStore - Based on JsonRestStore for r/w couchDb
  operations.
• CsvStore - A simple store that read CSV-files
• FileStore - A RO store for filesystem traversal and file read.
• FlickStore - A simple store for explicit Flickr feeds without wildcards.
• FlickRestStore - Based on FlickStore using Flickr's REST services
  instead.
• GoogleSearchStore - RO store for Google web searches.
• GoogleFeedStore - RO store that uses Google's RSS/Atom feed
  services.
• HtmlStore - RO store that reads hierarchical DOM nodes as data.
• HtmlTableStore - Based on HtmlStore but specifically made for tables.
• JsonPathStore - Takes an arbitrary JS object and uses as store data.
Dojo.data stores contd.
•   JsonRestStore - RW store using REST access to RESTful services.
•   KeyValueStore - Read store for key-value JS objects
•   OpmlStore - Read store for the OPML XML data format
•   PersevereStore - Read and Write store for the server-side JavaScript
    data repository system Persevere – based on JsonRestStore.
•   PicasaStore - Read store for Picasa web albums
•   QueyReadStore - Read store which can pass queries to the server for
    generating data, which can then be queried differently in the client.
•   S3Store - RW store for Amazon S3 storage service.
•   ServiceStore - RW store that uses dojox.rpc clients to access server,
    using either urls or SMD files.
•   SnapLogicStore - RO for the SnapLogic open source data integreation
    framework.
•   WikipediaStore - Read access to wikipedia searches
•   XmlStore - Read and Write store for XML data.
Read, Write, Identity, Notification APIs
A dojo.data store implements one or more of the following APIs:

• Read - Reading items, getting values of attributes of items.
• Write - Manages writing to in-memory storage. Can be
  extended for customized writebacks to services.
• Identity - For stores whose items have unique identifiers
• Notification - Defines a number of callbacks for store events.
Example: Widget which reads from a
FileItemWriteStore

<span dojoType=quot;dojo.data.ItemFileWriteStorequot;
   jsId=quot;jsonStorequot;
   url=quot;../../../dijit/tests/_data/countries.jsonquot;>
</span>
<table dojoType=quot;dojox.grid.DataGridquot; jsid=quot;gridquot; id=quot;gridquot;
      store=quot;jsonStorequot; query=quot;{ name: '*' }quot; rowsPerPage=quot;20quot; >
   <thead>
      <tr>
         <th field=quot;namequot; width=quot;300pxquot;>Country</th>
         <th field=quot;typequot; width=quot;autoquot;>Type</th>
      </tr>
   </thead>
</table>
FileItemWriteStore contd.

First a store is defined. Then the widget is connected to the
store, optionally using a specific query, like query=quot;{ name: '*' }quot;.
JsonRestStore: The full monty
Example: JsonRestStore
var rs = new dojox.data.JsonRestStore({target:quot;/recipeStorequot;});

OR

var s = dojox.rpc.Service(quot;/mySMDquot;);
var rs = new dojox.data.JsonRestStore({service:s.myRestService});

THEN

var item = rs.getValue(item,quot;fooquot;);
rs.setValue(item,quot;fooquot;,quot;barquot;);
rs.save();
Pluggable services: SMD
Simple Method Description: 'WSDL done right'
http://groups.google.com/group/json-schema/web/service-mapping-description-proposal
{
    quot;transportquot;: quot;POSTquot;,
    quot;envelopequot;: quot;URLquot;
    quot;targetquot;: quot;/service/quot;,
    quot;additionalParametersquot;: true,
    quot;parametersquot;: [
       {
          quot;namequot;:quot;outputTypequot;:,
          quot;defaultquot;: quot;jsonquot;
       }
    ],
    quot;servicesquot;: {
       quot;fooquot;: {
          quot;transportquot;: quot;GETquot;,
          quot;targetquot;: quot;executeFoo.phpquot;,
          quot;parametersquot;: [
             {quot;namequot;:quot;paramOnequot;, quot;typequot;: quot;stringquot;},
             {quot;namequot;:quot;paramTwoquot;, quot;typequot;: quot;integerquot;, quot;defaultquot;: 5},
             {quot;namequot;:quot;paramThreequot;, quot;typequot;: quot;integerquot;, quot;optionalquot;: true}
          ]
       }
    }
}
JSON-Schema

quot;JSON Schema provides a contract for what JSON data is required for a given
application and how it can be modified, much like what XML Schema provides for
XML. JSON Schema is intended to provide validation, documentation, and
interaction control of JSON data.quot;
http://www.json.com/category/json-schema/

Example object:

{
    quot;namequot; : quot;John Doequot;,
    quot;bornquot; : quot;quot;,
    quot;genderquot; : quot;malequot;,
    quot;addressquot; :
     {quot;streetquot;:quot;123 S Main Stquot;,
      quot;cityquot;:quot;Springfieldquot;,
      quot;statequot;:quot;CAquot;}
}
JSON-Schema contd.
{
quot;descriptionquot;:quot;A personquot;,
 quot;typequot;:quot;objectquot;,
 quot;propertiesquot;: {
    quot;namequot;: {quot;typequot;:quot;stringquot;},
    quot;bornquot; : {quot;typequot;:[quot;integerquot;,quot;stringquot;], allow for a numeric year, or a full date
        quot;minimumquot;:1900, min/max for when a numberic value is used
        quot;maximumquot;:2010,
        quot;formatquot;:quot;date-timequot;, format when a string value is used
        quot;optionalquot;:true}
    ],
    quot;genderquot; : {quot;typequot;:quot;stringquot;,
             quot;optionsquot;:[
                {quot;value:quot;malequot;,quot;labelquot;:quot;Guyquot;},
                {quot;valuequot;:quot;femalequot;,quot;labelquot;:quot;Galquot;}]},
    quot;addressquot; : {quot;typequot;:quot;objectquot;,
              quot;propertiesquot;:{
                  quot;streetquot;:{quot;typequot;:quot;stringquot;},
                  quot;cityquot;:{quot;typequot;:quot;stringquot;},
                  quot;statequot;:{quot;typequot;:quot;stringquot;}
                }
              }
  }
}
Helpful tools?
 WaveMaker 4

Mais conteĂşdo relacionado

Mais procurados

Anatomy of an HTML 5 mobile web app
Anatomy of an HTML 5 mobile web app Anatomy of an HTML 5 mobile web app
Anatomy of an HTML 5 mobile web app Ivano Malavolta
 
Unlocking the Power of Salesforce Integrations with Confluent
Unlocking the Power of Salesforce Integrations with ConfluentUnlocking the Power of Salesforce Integrations with Confluent
Unlocking the Power of Salesforce Integrations with ConfluentAaronLieberman5
 
LinkedIn Communication Architecture
LinkedIn Communication ArchitectureLinkedIn Communication Architecture
LinkedIn Communication ArchitectureLinkedIn
 
Dennis Doomen. Using OWIN, Webhooks, Event Sourcing and the Onion Architectur...
Dennis Doomen. Using OWIN, Webhooks, Event Sourcing and the Onion Architectur...Dennis Doomen. Using OWIN, Webhooks, Event Sourcing and the Onion Architectur...
Dennis Doomen. Using OWIN, Webhooks, Event Sourcing and the Onion Architectur...IT Arena
 
Vaadin - Rich Web Applications in Server-side Java without Plug-ins or JavaSc...
Vaadin - Rich Web Applications in Server-side Java without Plug-ins or JavaSc...Vaadin - Rich Web Applications in Server-side Java without Plug-ins or JavaSc...
Vaadin - Rich Web Applications in Server-side Java without Plug-ins or JavaSc...Joonas Lehtinen
 
.Net Microservices with Event Sourcing, CQRS, Docker and... Windows Server 20...
.Net Microservices with Event Sourcing, CQRS, Docker and... Windows Server 20....Net Microservices with Event Sourcing, CQRS, Docker and... Windows Server 20...
.Net Microservices with Event Sourcing, CQRS, Docker and... Windows Server 20...Javier GarcĂ­a Magna
 
Unit 5-jdbc2
Unit 5-jdbc2Unit 5-jdbc2
Unit 5-jdbc2msafad
 
Event Driven-Architecture from a Scalability perspective
Event Driven-Architecture from a Scalability perspectiveEvent Driven-Architecture from a Scalability perspective
Event Driven-Architecture from a Scalability perspectiveJonas BonĂŠr
 
Vaadin, Rich Web Apps in Server-Side Java without Plug-ins or JavaScript: Joo...
Vaadin, Rich Web Apps in Server-Side Java without Plug-ins or JavaScript: Joo...Vaadin, Rich Web Apps in Server-Side Java without Plug-ins or JavaScript: Joo...
Vaadin, Rich Web Apps in Server-Side Java without Plug-ins or JavaScript: Joo...jaxconf
 
Securing Your MongoDB Deployment
Securing Your MongoDB DeploymentSecuring Your MongoDB Deployment
Securing Your MongoDB DeploymentMongoDB
 
Kafka Summit SF 2017 - Accelerating Particles to Explore the Mysteries of the...
Kafka Summit SF 2017 - Accelerating Particles to Explore the Mysteries of the...Kafka Summit SF 2017 - Accelerating Particles to Explore the Mysteries of the...
Kafka Summit SF 2017 - Accelerating Particles to Explore the Mysteries of the...confluent
 
Ainars Galvans - Hints on complex system performance optimization
Ainars Galvans - Hints on complex system performance optimizationAinars Galvans - Hints on complex system performance optimization
Ainars Galvans - Hints on complex system performance optimizationDevConFu
 
Mahesh_webMethodsProfile
Mahesh_webMethodsProfileMahesh_webMethodsProfile
Mahesh_webMethodsProfilemahesh meesala
 
Large Scale Migration from WebLogic to JBoss
Large Scale Migration from WebLogic to JBossLarge Scale Migration from WebLogic to JBoss
Large Scale Migration from WebLogic to JBossC2B2 Consulting
 
Mdb dn 2016_11_ops_mgr
Mdb dn 2016_11_ops_mgrMdb dn 2016_11_ops_mgr
Mdb dn 2016_11_ops_mgrDaniel M. Farrell
 

Mais procurados (18)

Anatomy of an HTML 5 mobile web app
Anatomy of an HTML 5 mobile web app Anatomy of an HTML 5 mobile web app
Anatomy of an HTML 5 mobile web app
 
Unlocking the Power of Salesforce Integrations with Confluent
Unlocking the Power of Salesforce Integrations with ConfluentUnlocking the Power of Salesforce Integrations with Confluent
Unlocking the Power of Salesforce Integrations with Confluent
 
Ecom 1
Ecom 1Ecom 1
Ecom 1
 
LinkedIn Communication Architecture
LinkedIn Communication ArchitectureLinkedIn Communication Architecture
LinkedIn Communication Architecture
 
Dennis Doomen. Using OWIN, Webhooks, Event Sourcing and the Onion Architectur...
Dennis Doomen. Using OWIN, Webhooks, Event Sourcing and the Onion Architectur...Dennis Doomen. Using OWIN, Webhooks, Event Sourcing and the Onion Architectur...
Dennis Doomen. Using OWIN, Webhooks, Event Sourcing and the Onion Architectur...
 
Vaadin - Rich Web Applications in Server-side Java without Plug-ins or JavaSc...
Vaadin - Rich Web Applications in Server-side Java without Plug-ins or JavaSc...Vaadin - Rich Web Applications in Server-side Java without Plug-ins or JavaSc...
Vaadin - Rich Web Applications in Server-side Java without Plug-ins or JavaSc...
 
.Net Microservices with Event Sourcing, CQRS, Docker and... Windows Server 20...
.Net Microservices with Event Sourcing, CQRS, Docker and... Windows Server 20....Net Microservices with Event Sourcing, CQRS, Docker and... Windows Server 20...
.Net Microservices with Event Sourcing, CQRS, Docker and... Windows Server 20...
 
Unit 5-jdbc2
Unit 5-jdbc2Unit 5-jdbc2
Unit 5-jdbc2
 
Event Driven-Architecture from a Scalability perspective
Event Driven-Architecture from a Scalability perspectiveEvent Driven-Architecture from a Scalability perspective
Event Driven-Architecture from a Scalability perspective
 
Server side scripting
Server side scriptingServer side scripting
Server side scripting
 
Vaadin, Rich Web Apps in Server-Side Java without Plug-ins or JavaScript: Joo...
Vaadin, Rich Web Apps in Server-Side Java without Plug-ins or JavaScript: Joo...Vaadin, Rich Web Apps in Server-Side Java without Plug-ins or JavaScript: Joo...
Vaadin, Rich Web Apps in Server-Side Java without Plug-ins or JavaScript: Joo...
 
Securing Your MongoDB Deployment
Securing Your MongoDB DeploymentSecuring Your MongoDB Deployment
Securing Your MongoDB Deployment
 
Kafka Summit SF 2017 - Accelerating Particles to Explore the Mysteries of the...
Kafka Summit SF 2017 - Accelerating Particles to Explore the Mysteries of the...Kafka Summit SF 2017 - Accelerating Particles to Explore the Mysteries of the...
Kafka Summit SF 2017 - Accelerating Particles to Explore the Mysteries of the...
 
Mvc3 part1
Mvc3   part1Mvc3   part1
Mvc3 part1
 
Ainars Galvans - Hints on complex system performance optimization
Ainars Galvans - Hints on complex system performance optimizationAinars Galvans - Hints on complex system performance optimization
Ainars Galvans - Hints on complex system performance optimization
 
Mahesh_webMethodsProfile
Mahesh_webMethodsProfileMahesh_webMethodsProfile
Mahesh_webMethodsProfile
 
Large Scale Migration from WebLogic to JBoss
Large Scale Migration from WebLogic to JBossLarge Scale Migration from WebLogic to JBoss
Large Scale Migration from WebLogic to JBoss
 
Mdb dn 2016_11_ops_mgr
Mdb dn 2016_11_ops_mgrMdb dn 2016_11_ops_mgr
Mdb dn 2016_11_ops_mgr
 

Destaque

Scaling Wordpress
Scaling WordpressScaling Wordpress
Scaling Wordpressngonpham
 
Thin Server Architecture
Thin Server ArchitectureThin Server Architecture
Thin Server ArchitectureMitch Pirtle
 
Thin Server Architecture SPA, 5 years old presentation
Thin Server Architecture SPA, 5 years old presentationThin Server Architecture SPA, 5 years old presentation
Thin Server Architecture SPA, 5 years old presentationDavid Amend
 
The Good, the bad, and the ugly of Thin Client/Server Computing
The Good, the bad, and the ugly of Thin Client/Server ComputingThe Good, the bad, and the ugly of Thin Client/Server Computing
The Good, the bad, and the ugly of Thin Client/Server ComputingThe Integral Worm
 
Artificial Intelligence: The Nine Phases of the Expert System Development Lif...
Artificial Intelligence: The Nine Phases of the Expert System Development Lif...Artificial Intelligence: The Nine Phases of the Expert System Development Lif...
Artificial Intelligence: The Nine Phases of the Expert System Development Lif...The Integral Worm
 

Destaque (6)

Scaling Wordpress
Scaling WordpressScaling Wordpress
Scaling Wordpress
 
Thin Server Architecture
Thin Server ArchitectureThin Server Architecture
Thin Server Architecture
 
Thin Server Architecture SPA, 5 years old presentation
Thin Server Architecture SPA, 5 years old presentationThin Server Architecture SPA, 5 years old presentation
Thin Server Architecture SPA, 5 years old presentation
 
The Good, the bad, and the ugly of Thin Client/Server Computing
The Good, the bad, and the ugly of Thin Client/Server ComputingThe Good, the bad, and the ugly of Thin Client/Server Computing
The Good, the bad, and the ugly of Thin Client/Server Computing
 
Artificial Intelligence: The Nine Phases of the Expert System Development Lif...
Artificial Intelligence: The Nine Phases of the Expert System Development Lif...Artificial Intelligence: The Nine Phases of the Expert System Development Lif...
Artificial Intelligence: The Nine Phases of the Expert System Development Lif...
 
Client server architecture
Client server architectureClient server architecture
Client server architecture
 

Semelhante a Practical Thin Server Architecture With Dojo Peter Svensson

Docebo: history of a journey from legacy to serverless
Docebo: history of a journey from legacy to serverlessDocebo: history of a journey from legacy to serverless
Docebo: history of a journey from legacy to serverlessAWS User Group Italy
 
Thin client SPAs? Stream UI using web standards (CodeNight)
Thin client SPAs? Stream UI using web standards (CodeNight)Thin client SPAs? Stream UI using web standards (CodeNight)
Thin client SPAs? Stream UI using web standards (CodeNight)Starcounter
 
NoSQL and ACID
NoSQL and ACIDNoSQL and ACID
NoSQL and ACIDFoundationDB
 
Ajax World West
Ajax World WestAjax World West
Ajax World Westrajivmordani
 
Cloud-native Data: Every Microservice Needs a Cache
Cloud-native Data: Every Microservice Needs a CacheCloud-native Data: Every Microservice Needs a Cache
Cloud-native Data: Every Microservice Needs a Cachecornelia davis
 
ArcReady - Scalable And Usable Web Applications
ArcReady - Scalable And Usable Web ApplicationsArcReady - Scalable And Usable Web Applications
ArcReady - Scalable And Usable Web ApplicationsMicrosoft ArcReady
 
Building FoundationDB
Building FoundationDBBuilding FoundationDB
Building FoundationDBFoundationDB
 
Internet applications unit1
Internet applications unit1Internet applications unit1
Internet applications unit1MSc CST
 
E g innovations overview
E g innovations overviewE g innovations overview
E g innovations overviewNuno Alves
 
Transforming the web into a real application platform
Transforming the web into a real application platformTransforming the web into a real application platform
Transforming the web into a real application platformMohanadarshan Vivekanandalingam
 
Service Virtualization - Next Gen Testing Conference Singapore 2013
Service Virtualization - Next Gen Testing Conference Singapore 2013Service Virtualization - Next Gen Testing Conference Singapore 2013
Service Virtualization - Next Gen Testing Conference Singapore 2013Min Fang
 
Will Web 2.0 applications break the cloud?
Will Web 2.0 applications break the cloud?Will Web 2.0 applications break the cloud?
Will Web 2.0 applications break the cloud?Flaskdata.io
 
Build A Scalable Mobile App
Build A Scalable Mobile App Build A Scalable Mobile App
Build A Scalable Mobile App Mohamed Aboul-Fotouh
 
Writing less code with Serverless on AWS at AWS Community Day DACH 2021
Writing less code with Serverless on AWS at AWS Community Day DACH 2021Writing less code with Serverless on AWS at AWS Community Day DACH 2021
Writing less code with Serverless on AWS at AWS Community Day DACH 2021Vadym Kazulkin
 
Internet Scale Architecture
Internet Scale ArchitectureInternet Scale Architecture
Internet Scale ArchitectureRightScale
 
Scalable And Usable Web Applications
Scalable And Usable Web ApplicationsScalable And Usable Web Applications
Scalable And Usable Web ApplicationsClint Edmonson
 
Scalability using Node.js
Scalability using Node.jsScalability using Node.js
Scalability using Node.jsratankadam
 
Refactoring to Microservices
Refactoring to MicroservicesRefactoring to Microservices
Refactoring to MicroservicesJacinto Limjap
 
Praxistaugliche notes strategien 4 cloud
Praxistaugliche notes strategien 4 cloudPraxistaugliche notes strategien 4 cloud
Praxistaugliche notes strategien 4 cloudRoman Weber
 

Semelhante a Practical Thin Server Architecture With Dojo Peter Svensson (20)

Docebo: history of a journey from legacy to serverless
Docebo: history of a journey from legacy to serverlessDocebo: history of a journey from legacy to serverless
Docebo: history of a journey from legacy to serverless
 
Signal R 2015
Signal R 2015Signal R 2015
Signal R 2015
 
Thin client SPAs? Stream UI using web standards (CodeNight)
Thin client SPAs? Stream UI using web standards (CodeNight)Thin client SPAs? Stream UI using web standards (CodeNight)
Thin client SPAs? Stream UI using web standards (CodeNight)
 
NoSQL and ACID
NoSQL and ACIDNoSQL and ACID
NoSQL and ACID
 
Ajax World West
Ajax World WestAjax World West
Ajax World West
 
Cloud-native Data: Every Microservice Needs a Cache
Cloud-native Data: Every Microservice Needs a CacheCloud-native Data: Every Microservice Needs a Cache
Cloud-native Data: Every Microservice Needs a Cache
 
ArcReady - Scalable And Usable Web Applications
ArcReady - Scalable And Usable Web ApplicationsArcReady - Scalable And Usable Web Applications
ArcReady - Scalable And Usable Web Applications
 
Building FoundationDB
Building FoundationDBBuilding FoundationDB
Building FoundationDB
 
Internet applications unit1
Internet applications unit1Internet applications unit1
Internet applications unit1
 
E g innovations overview
E g innovations overviewE g innovations overview
E g innovations overview
 
Transforming the web into a real application platform
Transforming the web into a real application platformTransforming the web into a real application platform
Transforming the web into a real application platform
 
Service Virtualization - Next Gen Testing Conference Singapore 2013
Service Virtualization - Next Gen Testing Conference Singapore 2013Service Virtualization - Next Gen Testing Conference Singapore 2013
Service Virtualization - Next Gen Testing Conference Singapore 2013
 
Will Web 2.0 applications break the cloud?
Will Web 2.0 applications break the cloud?Will Web 2.0 applications break the cloud?
Will Web 2.0 applications break the cloud?
 
Build A Scalable Mobile App
Build A Scalable Mobile App Build A Scalable Mobile App
Build A Scalable Mobile App
 
Writing less code with Serverless on AWS at AWS Community Day DACH 2021
Writing less code with Serverless on AWS at AWS Community Day DACH 2021Writing less code with Serverless on AWS at AWS Community Day DACH 2021
Writing less code with Serverless on AWS at AWS Community Day DACH 2021
 
Internet Scale Architecture
Internet Scale ArchitectureInternet Scale Architecture
Internet Scale Architecture
 
Scalable And Usable Web Applications
Scalable And Usable Web ApplicationsScalable And Usable Web Applications
Scalable And Usable Web Applications
 
Scalability using Node.js
Scalability using Node.jsScalability using Node.js
Scalability using Node.js
 
Refactoring to Microservices
Refactoring to MicroservicesRefactoring to Microservices
Refactoring to Microservices
 
Praxistaugliche notes strategien 4 cloud
Praxistaugliche notes strategien 4 cloudPraxistaugliche notes strategien 4 cloud
Praxistaugliche notes strategien 4 cloud
 

Mais de rajivmordani

Web 2 0 Data Visualization With Jsf
Web 2 0 Data Visualization With JsfWeb 2 0 Data Visualization With Jsf
Web 2 0 Data Visualization With Jsfrajivmordani
 
X Aware Ajax World V1
X Aware Ajax World V1X Aware Ajax World V1
X Aware Ajax World V1rajivmordani
 
The Beauty Of Java Script V5a
The Beauty Of Java Script V5aThe Beauty Of Java Script V5a
The Beauty Of Java Script V5arajivmordani
 
Tripit Ajaxworld V5
Tripit Ajaxworld V5Tripit Ajaxworld V5
Tripit Ajaxworld V5rajivmordani
 
Turbo Enterprise Web 2.0 Ajax World 20081
Turbo Enterprise Web 2.0 Ajax World 20081Turbo Enterprise Web 2.0 Ajax World 20081
Turbo Enterprise Web 2.0 Ajax World 20081rajivmordani
 
Sue Googe Spice Up Ux
Sue Googe Spice Up UxSue Googe Spice Up Ux
Sue Googe Spice Up Uxrajivmordani
 
Social Networking Intranet
Social Networking IntranetSocial Networking Intranet
Social Networking Intranetrajivmordani
 
Ssjs Presentation
Ssjs PresentationSsjs Presentation
Ssjs Presentationrajivmordani
 
Server Side Javascript
Server Side JavascriptServer Side Javascript
Server Side Javascriptrajivmordani
 
Ria Enterprise
Ria EnterpriseRia Enterprise
Ria Enterpriserajivmordani
 
Slow Cool 20081009 Final
Slow Cool 20081009 FinalSlow Cool 20081009 Final
Slow Cool 20081009 Finalrajivmordani
 
Pushing Datatothe Browserwith Comet Ajax W
Pushing Datatothe Browserwith Comet Ajax WPushing Datatothe Browserwith Comet Ajax W
Pushing Datatothe Browserwith Comet Ajax Wrajivmordani
 
I Phone Dev Summit Prezo Guy Naor Final
I Phone Dev Summit Prezo Guy Naor FinalI Phone Dev Summit Prezo Guy Naor Final
I Phone Dev Summit Prezo Guy Naor Finalrajivmordani
 
Netapp Michael Galpin
Netapp Michael GalpinNetapp Michael Galpin
Netapp Michael Galpinrajivmordani
 
Laird Best Practices Ajax World West2008
Laird Best Practices Ajax World West2008Laird Best Practices Ajax World West2008
Laird Best Practices Ajax World West2008rajivmordani
 
Mike Grushin Developing Ugc Sites That Scale
Mike Grushin    Developing Ugc Sites That ScaleMike Grushin    Developing Ugc Sites That Scale
Mike Grushin Developing Ugc Sites That Scalerajivmordani
 
Java Fx Ajaxworld Rags V1
Java Fx Ajaxworld Rags V1Java Fx Ajaxworld Rags V1
Java Fx Ajaxworld Rags V1rajivmordani
 
Good Parts of JavaScript Douglas Crockford
Good Parts of JavaScript Douglas CrockfordGood Parts of JavaScript Douglas Crockford
Good Parts of JavaScript Douglas Crockfordrajivmordani
 
Flying Pixels Ent Apps Jeremy Chone
Flying Pixels Ent Apps Jeremy ChoneFlying Pixels Ent Apps Jeremy Chone
Flying Pixels Ent Apps Jeremy Chonerajivmordani
 

Mais de rajivmordani (20)

Web 2 0 Data Visualization With Jsf
Web 2 0 Data Visualization With JsfWeb 2 0 Data Visualization With Jsf
Web 2 0 Data Visualization With Jsf
 
X Aware Ajax World V1
X Aware Ajax World V1X Aware Ajax World V1
X Aware Ajax World V1
 
The Beauty Of Java Script V5a
The Beauty Of Java Script V5aThe Beauty Of Java Script V5a
The Beauty Of Java Script V5a
 
Tripit Ajaxworld V5
Tripit Ajaxworld V5Tripit Ajaxworld V5
Tripit Ajaxworld V5
 
Turbo Enterprise Web 2.0 Ajax World 20081
Turbo Enterprise Web 2.0 Ajax World 20081Turbo Enterprise Web 2.0 Ajax World 20081
Turbo Enterprise Web 2.0 Ajax World 20081
 
Sue Googe Spice Up Ux
Sue Googe Spice Up UxSue Googe Spice Up Ux
Sue Googe Spice Up Ux
 
Social Networking Intranet
Social Networking IntranetSocial Networking Intranet
Social Networking Intranet
 
Ssjs Presentation
Ssjs PresentationSsjs Presentation
Ssjs Presentation
 
Jsf Ajax
Jsf AjaxJsf Ajax
Jsf Ajax
 
Server Side Javascript
Server Side JavascriptServer Side Javascript
Server Side Javascript
 
Ria Enterprise
Ria EnterpriseRia Enterprise
Ria Enterprise
 
Slow Cool 20081009 Final
Slow Cool 20081009 FinalSlow Cool 20081009 Final
Slow Cool 20081009 Final
 
Pushing Datatothe Browserwith Comet Ajax W
Pushing Datatothe Browserwith Comet Ajax WPushing Datatothe Browserwith Comet Ajax W
Pushing Datatothe Browserwith Comet Ajax W
 
I Phone Dev Summit Prezo Guy Naor Final
I Phone Dev Summit Prezo Guy Naor FinalI Phone Dev Summit Prezo Guy Naor Final
I Phone Dev Summit Prezo Guy Naor Final
 
Netapp Michael Galpin
Netapp Michael GalpinNetapp Michael Galpin
Netapp Michael Galpin
 
Laird Best Practices Ajax World West2008
Laird Best Practices Ajax World West2008Laird Best Practices Ajax World West2008
Laird Best Practices Ajax World West2008
 
Mike Grushin Developing Ugc Sites That Scale
Mike Grushin    Developing Ugc Sites That ScaleMike Grushin    Developing Ugc Sites That Scale
Mike Grushin Developing Ugc Sites That Scale
 
Java Fx Ajaxworld Rags V1
Java Fx Ajaxworld Rags V1Java Fx Ajaxworld Rags V1
Java Fx Ajaxworld Rags V1
 
Good Parts of JavaScript Douglas Crockford
Good Parts of JavaScript Douglas CrockfordGood Parts of JavaScript Douglas Crockford
Good Parts of JavaScript Douglas Crockford
 
Flying Pixels Ent Apps Jeremy Chone
Flying Pixels Ent Apps Jeremy ChoneFlying Pixels Ent Apps Jeremy Chone
Flying Pixels Ent Apps Jeremy Chone
 

Último

Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsRoshan Dwivedi
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Paola De la Torre
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024The Digital Insurer
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...gurkirankumar98700
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 

Último (20)

Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍸 8923113531 🎰 Avail...
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 

Practical Thin Server Architecture With Dojo Peter Svensson

  • 1. Practical Thin Server Architecture with Dojo Peter Svensson, Nethouse AB psvensson@gmail.com
  • 3. What is this all about? Reducing complexity
  • 4. Server-Centric Frameworks Client Server Browser New Web Page Web-page Business Logic building logic and Database User Action Gazillion framework-specific XML configuration files. Possibly hairy dependencies between presentation and logic.
  • 5. Problems with server-centric frameworks • Poor distribution of processing • High user response latency • Difficult programming model • Heavy state management on the servers • Offline Difficulties • Reduced opportunity for interoperability
  • 6. Poor distribution of processing With a large number of clients, doing all the processing on the server is inefficient. Client UI generation for each client
  • 7. High user response latency Traditional web applications are not responsive enough. High quality user interaction is very sensitive to latency, and very fast response is essential.
  • 8. Difficult programming model • Client interface is split into several 'canned' places in the server. • JavaScript is hidden and/or mapped to server-centric functionality. • Client-Server communication is folded into a faux single machine model. • When web application is running, what you see is not what you coded. • This adds additional complexity in mapping debugging as well. • The HTML design needs massage to fit into server-side templates.
  • 9. Heavy state management on the servers • Client user interface state is maintained by the server. • This requires a significant increase in resource utilization as server side sessions must be maintained with potentially large object structures within them. • Usually these resources can’t be released until a session times out, which is often 30 minutes after a user actually leaves the web site.
  • 10. Offline Difficulties • Adding offline capabilities to a web application can be a tremendous project when user interface code is predominantly on the server. • The user interface code must be ported to run on the client in offline situations.
  • 11. Reduced opportunity for interoperability • Client/server communication is hidden by framework. • Server 'endpoints' is hard or impossible to isolate. • Integration (SOA, vendor/customer system) projects must start from scratch. • Risk of reinventing wheel. • Changes in web application code might not match changes in integration code.
  • 12. A modest proposal: Thin Server Architecture Thin Server Architecture is about moving UI code from the server to the client, any way you like (more or less).
  • 13. Similar ideas SOFEA - Service Oriented Front-End Architecture; http://www.theserverside.com/news/thread.tss?thread_id=47213 MĂĄrio Valente's blogs on the future of web applications; http://mv.asterisco.pt/ Products based on the idea of 'thin servers'; • TIBCO GI • SmartClient • WaveMaker (uses Dojo! : )‫‏‬ • Probably lots of others..
  • 14. Thin Server Architecture 1. All functionality that possibly can be implemented on the client side should be implemented on the client side. 2. All communication with the application server should be using services (REST, SOAP, domain-specific). 3. No part of the client should be evoked, generated or templated from the server-side. This rules out in-line conditional HTML in JSP, ASP, PHP, et.c. 4. The logic in the server will only implement the following functionality; a) Security, b) Business logic, c) Proxying
  • 15. Thin Server Architecture Client Server Original client load Browser Business Logic and Database Only raw data
  • 16. Benefits of Thin Server Architecture • Scalability • Immediate user response • Organized programming model • Client side state management • Offline applications • Interoperability
  • 17. Scalability • The more clients that use an application, the more client machines that are available (d0h). • Any presentation logic that can be moved to the client scales 1:1 with the number of clients.
  • 18. Immediate User Response • Client side code can immediately react to user input, rather than waiting for network transfers. • If you need data on the server, you need data on the server. There's no way around that. • At least we don't have to load THE WHOLE PAGE again, just to get an updated list of cheese.
  • 19. Organized Programming Model • Client and server are explicitly modeled and no 'mapping' is required. • Neither side needs to be 'pretended' on the other side. • Each side implement its own logic, completely separated from the other, leading to less risk of entanglement. • When debugging, the messages and object being inspected are 'real'. • Less complexity. • Asynchronous development.
  • 20. Client Side State Management • Transient session state information on the client reduces the memory load on the server. • The client decides what to show, cache and request from the server. • The server manages security, not widget state.
  • 21. Offline Applications • Having a clean separation between client and server makes it simpler to implement offline modes. • Certain toolkits have client-side data abstractions which can switch to offline stores transparently, when needed.
  • 22. Interoperability • Using structured data with minimal APIs for interaction, makes it easier to connect additional consumers and producers to interact with existing systems. • By exposing explicit and secure data-interchange interfaces on the server, we get interoperability for free.
  • 23. But what about GWT and stuff like that? • The code generated does indeed follow separation of concerns, with a clearly defined client. • However, the development environment is even “better” at hiding what goes on 'under the hood'. • Debugging is convoluted, trying (and succeeding) in using a single Java abstraction to hide the dual layers of client and server. • A wonderful but complex solution for a problem that is already solved more simply.
  • 24. Psychology of not wanting to code on the client • The hard, steep climb of language mastery : Not again! • The 'knowledge' gained anno 2003: JS sucks (== browser incompatibilities sucks)‫‏‬ • The world stopped at that date. • Wanting to search for the keys where the light is, rather than were they were dropped. • Wanting to make coding web apps less complex!
  • 25. Some new things that has happened since 2003 Ajax toolkits provide consistent APIs and hide cross-browser differences for the following stuff; • Browser events • Styling • DOM positioning and Box-models • Ajax communication • 2D graphics (Dojo wraps SVG, VML, Canvas and more)‫‏‬ • Pseudo class-based OO • And more
  • 26. Do what's best for each team (and the project)‫‏‬ • Don't force UI logic onto server-side developers. • Don't force front-end developers to get entwined in server internals
  • 27. What does thin-server architecture mean for the team? • The Designers: Normal files makes for simpler mockups and simpler changes. Just ordinary HTML/CSS/Images • The Front-end developers: Normal files makes for simpler mockups and simpler changes. Just ordinary HTML/JS • The Back-end developers: No UI logic makes a simpler server. Can focus on _only_ business logic/database stuff • More Front-End goodness: Mock servers/services: Creating the contract and developing asynchronously
  • 28. Scenario 1 We need to change the styling of the web site. Now: Does not affect back-end developers. Before: The HTML and CSS needed to be 'templatized' according to the mad doctor scheme du jour.
  • 29. Scenario 2 We need to add a tab that shows the same data as in the list tab, but as a bar chart - oh, and you must be able to switch dates dynamically. Now: Does not affect back-end developers. Charts are rendered to the whim of the user with cached data. Before: Each date change generates a new page reload. Server is bogged down by the generation of gazillion static images .
  • 30. Scenario 3 We need to scrap a lot of the code that generates data for the list of car models. Now: Will not affect Designers or Front-End developers. The web endpoint API is conserved. Before: Since the old base template that we used to generate the hand-coded rules which drives the XSLT engine which generates the PHP code which contains most of the HTML and CSS for the final page (half are in Barry's module), we need you to split the page into three-line stripes with separate but identical CSS files for each, with all images inlined as binary XML.
  • 31. Protocol ensures separation of concerns Client (Browser)‫‏‬ Server Data store+ Protocol /service cache
  • 33. Dojo Example (warming up)‫‏‬ <html> <head> <link href=quot;http://o.aolcdn.com/dojo/1.2.0/dojo/resources/dojo.cssquot; rel=quot;stylesheetquot; type=quot;text/cssquot;/> <link href=quot;http://o.aolcdn.com/dojo/1.2.0/dijit/themes/dijit.cssquot; rel=quot;stylesheetquot; type=quot;text/cssquot;/> <link href=quot;http://o.aolcdn.com/dojo/1.2.0/dijit/themes/tundra/tundra.cssquot; rel=quot;stylesheetquot; type=quot;text/cssquot; /> <title>Dojo Test</title> <script type=quot;text/javascriptquot;> djConfig= { parseOnLoad: true } </script> <script src=quot;http://o.aolcdn.com/dojo/1.2.0/dojo/dojo.xd.jsquot; type=quot;text/javascriptquot;></script> <script type=quot;text/javascriptquot;> dojo.require(quot;dojo.parserquot;); dojo.require(quot;dijit.form.Buttonquot;); dojo.require(quot;dijit.form.SimpleTextareaquot;); </script> </head> <body class=quot;tundraquot;> <button id=quot;mybuttonquot; dojoType=quot;dijit.form.Buttonquot; onClick='dijit.byId(quot;q1quot;).attr(quot;valuequot;, quot;fooquot;)'>Click Me</button> <textarea id=quot;q1quot; dojoType=quot;dijit.form.SimpleTextareaquot; name=quot;ta1quot; rows=5 cols=50 ></textarea> </body> </html>
  • 34. Dojo loader The dojo loader looks where dojo.js is loaded from, and use that as a base url to look for requirements. Given http://o.aolcdn.com/dojo/1.2.0/dojo/dojo.xd.js The line dojo.require(quot;dijit.form.buttonquot;); Tries to load ../dijit/form/button.js Which becomes http://o.aolcdn.com/dojo/1.2.0/dijit/form/button.js
  • 35. Dojo Custom Widgets • Use a folder hierarchy to leverage the loader • Use client-side templates for widgets • Create nested widgets Example: dojo-1.2.0 --- root folder for Dojo dojo dijit dojox mycorp --- your custom folder scaffold main.js templates main.html
  • 36. Steps to load a Dojo widget 1. The Dojo parser parses the page (or part of the page)‫‏‬ 2. The parser finds elements with the 'dojoType=quot;x.y.zquot; ' property 3. Is the Dojo class x.y.z loaded already (by dojo.require, perhaps)? 4. If no, resolve where from, and load it. 5. Create a new instance of class x.y.z 6. Find and populate template (if any) for x.y.z 7. Call magic functions (as defined) for lifecycle management of x.y.z
  • 37. A custom widget class dojo.provide(quot;scaffold.mainquot;); //...dojo.requires... dojo.declare(quot;scaffold.mainquot;, [ dijit._Widget, dijit._Templated ], { templatePath : dojo.moduleUrl(quot;scaffoldquot;,quot;templates/main.htmlquot;), widgetsInTemplate : true, content : {}, // name - url pairs for menu building name : quot;quot;, postCreate: function() { console.log(quot;postCreate for scaffold.main calledquot;); ... } ... });
  • 38. A custom widget template (main.html)‫‏‬ <div> <div dojoAttachPoint=quot;mymenuquot; class=quot;scaffold_menuquot;> ${name} </div> <div dojoType=quot;dijit.layout.StackContainerquot; dojoAttachPoint=quot;mystackquot; class=quot;scaffold_mainquot;> </div> </div> An 'attachPoint=quot;xquot; ' element or widget gets mapped to a 'this.x' property in the Widget class. ${y} inserts the value of 'this.y' .
  • 39. Using the custom widget ... <script type=quot;text/javascriptquot;> dojo.require(quot;dojo.parserquot;); dojo.require(quot;mycorp.scaffold.mainquot;); </script> </head> <body class=quot;tundraquot;> <div dojoType=quot;mycorp.scaffold.mainquot; name=quot;foobarquot; content=quot;{'news': 'scaffold/content/news.html', 'products': 'scaffold/content/products.html', 'partners': 'scaffold/content/partners.html', 'people' : 'scaffold/content/people.html'}quot;> </div> </body> </html>
  • 40. What the widget might look like
  • 41. Dojo.data Client-side data model that separates consumers of data (widgets, for example) from the producers (server, services, files, offline)‫‏‬
  • 42. Dojo.data stores • AndOrReadStore - Based on ItemFileReadStore, but support complex queries. • AndOrWriteStore - Based on ItemFileWrite as above • AtomReadStore - RO store for Atom XML based feeds • CouchDbRestStore - Based on JsonRestStore for r/w couchDb operations. • CsvStore - A simple store that read CSV-files • FileStore - A RO store for filesystem traversal and file read. • FlickStore - A simple store for explicit Flickr feeds without wildcards. • FlickRestStore - Based on FlickStore using Flickr's REST services instead. • GoogleSearchStore - RO store for Google web searches. • GoogleFeedStore - RO store that uses Google's RSS/Atom feed services. • HtmlStore - RO store that reads hierarchical DOM nodes as data. • HtmlTableStore - Based on HtmlStore but specifically made for tables. • JsonPathStore - Takes an arbitrary JS object and uses as store data.
  • 43. Dojo.data stores contd. • JsonRestStore - RW store using REST access to RESTful services. • KeyValueStore - Read store for key-value JS objects • OpmlStore - Read store for the OPML XML data format • PersevereStore - Read and Write store for the server-side JavaScript data repository system Persevere – based on JsonRestStore. • PicasaStore - Read store for Picasa web albums • QueyReadStore - Read store which can pass queries to the server for generating data, which can then be queried differently in the client. • S3Store - RW store for Amazon S3 storage service. • ServiceStore - RW store that uses dojox.rpc clients to access server, using either urls or SMD files. • SnapLogicStore - RO for the SnapLogic open source data integreation framework. • WikipediaStore - Read access to wikipedia searches • XmlStore - Read and Write store for XML data.
  • 44. Read, Write, Identity, Notification APIs A dojo.data store implements one or more of the following APIs: • Read - Reading items, getting values of attributes of items. • Write - Manages writing to in-memory storage. Can be extended for customized writebacks to services. • Identity - For stores whose items have unique identifiers • Notification - Defines a number of callbacks for store events.
  • 45. Example: Widget which reads from a FileItemWriteStore <span dojoType=quot;dojo.data.ItemFileWriteStorequot; jsId=quot;jsonStorequot; url=quot;../../../dijit/tests/_data/countries.jsonquot;> </span> <table dojoType=quot;dojox.grid.DataGridquot; jsid=quot;gridquot; id=quot;gridquot; store=quot;jsonStorequot; query=quot;{ name: '*' }quot; rowsPerPage=quot;20quot; > <thead> <tr> <th field=quot;namequot; width=quot;300pxquot;>Country</th> <th field=quot;typequot; width=quot;autoquot;>Type</th> </tr> </thead> </table>
  • 46. FileItemWriteStore contd. First a store is defined. Then the widget is connected to the store, optionally using a specific query, like query=quot;{ name: '*' }quot;.
  • 48. Example: JsonRestStore var rs = new dojox.data.JsonRestStore({target:quot;/recipeStorequot;}); OR var s = dojox.rpc.Service(quot;/mySMDquot;); var rs = new dojox.data.JsonRestStore({service:s.myRestService}); THEN var item = rs.getValue(item,quot;fooquot;); rs.setValue(item,quot;fooquot;,quot;barquot;); rs.save();
  • 49. Pluggable services: SMD Simple Method Description: 'WSDL done right' http://groups.google.com/group/json-schema/web/service-mapping-description-proposal { quot;transportquot;: quot;POSTquot;, quot;envelopequot;: quot;URLquot; quot;targetquot;: quot;/service/quot;, quot;additionalParametersquot;: true, quot;parametersquot;: [ { quot;namequot;:quot;outputTypequot;:, quot;defaultquot;: quot;jsonquot; } ], quot;servicesquot;: { quot;fooquot;: { quot;transportquot;: quot;GETquot;, quot;targetquot;: quot;executeFoo.phpquot;, quot;parametersquot;: [ {quot;namequot;:quot;paramOnequot;, quot;typequot;: quot;stringquot;}, {quot;namequot;:quot;paramTwoquot;, quot;typequot;: quot;integerquot;, quot;defaultquot;: 5}, {quot;namequot;:quot;paramThreequot;, quot;typequot;: quot;integerquot;, quot;optionalquot;: true} ] } } }
  • 50. JSON-Schema quot;JSON Schema provides a contract for what JSON data is required for a given application and how it can be modified, much like what XML Schema provides for XML. JSON Schema is intended to provide validation, documentation, and interaction control of JSON data.quot; http://www.json.com/category/json-schema/ Example object: { quot;namequot; : quot;John Doequot;, quot;bornquot; : quot;quot;, quot;genderquot; : quot;malequot;, quot;addressquot; : {quot;streetquot;:quot;123 S Main Stquot;, quot;cityquot;:quot;Springfieldquot;, quot;statequot;:quot;CAquot;} }
  • 51. JSON-Schema contd. { quot;descriptionquot;:quot;A personquot;, quot;typequot;:quot;objectquot;, quot;propertiesquot;: { quot;namequot;: {quot;typequot;:quot;stringquot;}, quot;bornquot; : {quot;typequot;:[quot;integerquot;,quot;stringquot;], allow for a numeric year, or a full date quot;minimumquot;:1900, min/max for when a numberic value is used quot;maximumquot;:2010, quot;formatquot;:quot;date-timequot;, format when a string value is used quot;optionalquot;:true} ], quot;genderquot; : {quot;typequot;:quot;stringquot;, quot;optionsquot;:[ {quot;value:quot;malequot;,quot;labelquot;:quot;Guyquot;}, {quot;valuequot;:quot;femalequot;,quot;labelquot;:quot;Galquot;}]}, quot;addressquot; : {quot;typequot;:quot;objectquot;, quot;propertiesquot;:{ quot;streetquot;:{quot;typequot;:quot;stringquot;}, quot;cityquot;:{quot;typequot;:quot;stringquot;}, quot;statequot;:{quot;typequot;:quot;stringquot;} } } } }