Due to the
fallacies of distributed computing, finding an adequate granularity is hard. There is no single simple answer but a number of criteria exist (see below). A primary goal of service modeling and granularity design is to achieve
loose coupling and
modularity, which are two of the essential SOA principles, and to address other
architecturally significant requirements. Many forces influence the service granularity; four particularly relevant factors to consider when designing for an adequate granularity are performance, message size, transactionality and business function:
Business function Ideally, each service operation maps to a single business function, although if a single operation can provide multiple functions without adding design complexity or increasing message sizes, this generality can reduce implementation and usage costs.
Performance Web services are accessed remotely and calls to web service operation create more network overhead. Reducing the number of service requests reduces that overhead.
Message size Coarse-grained services may pass more data than fine-grained services, including data that is not specifically required for the task. This complicates message processing in the endpoint and might in turn harm performance. Reducing message size may require adding a more fine-grained operation.
Quality-of-service characteristics including transactionality For conceptual clarity each service operation should perform a single system-level transaction and leave data integrity across service boundaries to the
business logic in the service consumer. This also simplifies error recovery, and typically eases design. Many more decision criteria for finding an appropriate granularity exist; there is no global optimum. Sixteen such coupling criteria are compiled from the literature in. == Patterns ==