In simple terms, an application (distributed or otherwise) is a collection of software modules that have been integrated to solve a particular problem. It is the problem that dictates what capabilities the application must possess to provide a satisfactory solution. This topic will concentrate on six specific capabilities that all distributed applications should consider:
Obviously, these capabilities are in addition to the application's required capability to solve the required problem.
It is very important to identify as early as possible the priority of each of the above six capabilities to ensure that application architects make design decisions with proper regard. For example, an application that monitors a patient's vital signs must be highly available and reliable while possibly sacrificing scalability. On other hand, an online ordering system must be very secure, reliable, and scalable. When these capabilities are identified and prioritized, they will constitute the application's fundamental design goals.
Each of these capabilities will affect application performance which is widely seen as a measure of how successful an application is. If the application solves the problem, it will still be considered a failure if it does not perform adequately.