Over the past few weeks I have spoken with several customers who are implementing SOA in various stages and have decided to employ Web Services as the foundation. One of the key concerns is scalability and the ability to handle large volume for public / private services. An approach that evolved from these discussions was the following:
- For new services, specify governance in the Service Analysis / Modeling phase. This should specify the SLA for the Service and help identify the potential reuse and usage pattern that may be experienced.
- Services typically begin with a single instance using protocols such as HTTP
- Service scalability should be tested via Performance tools to determine how it degrades with load, supportable performance etc.
- Services should be monitored using JMX or similar API to determine runtime usage and usage patterns.
- Make services stateless so that they can be easily clustered.
- If service usage is higher than anticipated, consider configuring a cluster of service instances and use Hardware or Software load balancing.
- If throttling is desired, have service instances read requests from a JMS Queue as this places an abstraction between the service consumer / service provider. Queues allow for asynchronous communication and persistence point for inbound requests. Services can then throttle how quickly requests are processed without losing messages.