One of the first things I learned when I started talking with clients about their plans for platform-based clouds is that there is no such thing as a ‘simple application environment.’ Even for the most basic, CRUD-style applications, you can count on there being numerous different components involved in the overall solution. While one may immediately identify application servers, web servers, and databases, it quickly becomes clear that LDAP servers, identify management components, data grids, load balancers, and more are equally important. Indeed, the enterprise application ecosystem is not one where the word ‘simple’ is often tossed about.
The inherent complexity of enterprise application environments has had, and will continue to have a significant impact on the design and implementation of many PaaS solutions. In fact, one could argue that the preeminent design point in many PaaS solutions on the market today is rooted in eliminating this complexity. To do this, PaaS solutions attempt to abstract all the way up to the application level. In other words, users supply application artifacts and possibly define application characteristics. From there, it is the job of the PaaS system to handle the underlying application infrastructure, completely absolving the deployer from having to get into the nitty-gritty of the application serving environment.
There is little arguing that this is a notable goal, but the fact is this level of abstraction is not an easy thing for PaaS providers to implement. PaaS solutions have to make a lot of assumptions about what components should be a part of the cloud-based environment as well as how those components should be configured. The bottom line is providers can only do this for so many components, and with that limitation in mind, they often go after the most common pieces of an application environment. That means things like application servers, databases, messaging engines, and authentication systems are often covered directly by the PaaS solution. While those components are definitely a big part of the overall environment, they are far from being everything that is necessary.
As I mentioned earlier, an enterprise application depends on a number of things beyond the core infrastructure in order to function correctly. Many applications need to cache results, depend on identity management capabilities, require load balancing to scale properly, and integrate with ESBs to name but a few things. PaaS solutions may not be able to address everything in terms of what they can deploy and configure, but that does not mean that they can blissfully ignore the large number of services on which applications typically depend. PaaS solutions must address the need to integrate the application environments it deploys with these application services in some kind of way.
There are at least a couple of ways to do this in a way that minimizes the burden on the PaaS provider. First, a PaaS solution can provide the concept of an application service and enable one to deploy an instance of that service. Of course, we are adding to the deployment and configuration responsibility of the PaaS provider, but this is somewhat mitigated by the fact that it is handled outside the context of any one application instance. The PaaS solution can simply deploy and minimally configure a service like an ESB, and then push back further configuration duties on the application environment that needs to access the service. It is the job of the PaaS solution to slice up the service such that multiple application environments can make use of it, but it is the job of each application to configure its slice of the service for use.
Alternatively, a PaaS solution can introduce the notion of an external application service. In this scenario, the PaaS system does not need to provide any capability in terms of deploying or configuring the application service. All it needs to do is provide a way for application environments to reference the external service. This service has already been installed and largely configured, and applications deployed by the PaaS solution just need to indicate a dependency on the service. It is a bonus if the PaaS solution can manage to slice up shares to the external service, but that too could be pushed off on a component or actor external to the PaaS platform. To the PaaS provider, this is clearly the easiest of the two approaches to implement, but it does put more burden on the user to make sure those external services are up and accessible for applications deployed by the PaaS system.
So, which approach is better? While it is tempting to say the first approach is the best that is not necessarily true. It is true that it is the simplest for the user that is deploying applications with service dependencies, but it might not always be the best option for the enterprise. In many cases, enterprises have these application services up and running and they want to leverage that investment from the environments created by their PaaS platform. In that scenario, the second option is probably the preferable approach. To put it simply, there is no way to generalize and pick one approach over the other. The way in which a PaaS solution should handle application service dependencies varies, and ideally, it should be able to handle either style. What is clear though is the fact that there must be some way for PaaS systems to provide or integrate with commonly used application services!