Using this design principle, we have a simple user model: the user owns the service, and chooses which appliances to use as access points.
Our approach is to change how we write services so that they can be decomposed modularly.
Many people build their applications as a data model, ways to view that info, and controllers that modify data and control the what is viewed.
Rather than “running” these model-view-controller pieces on a centralized server, our approach is to make them “agile” and to execute them locally on the set of appliances chosen by the user. This is made possible partially by the inherent structure of web-style applications: they have already been forced into a set of transactions (views and controls) that are tied together by a shared set of state (the model).
The most important component to make distributed execution work is the distributed model, which we implement as a cache on each appliance.
We’ve further stylized the view and controller parts of our application by using “templates” (restricted declarative methods of describing how to show or modify the model) that are themselves stored in the distributed cache.
Each appliance, then, will have the portion of the web-application (some model, some view, and some controller) that is appropriate for their role in the service.