Solution

To fully empower self-sufficient, full-stack teams, a single team needs to own a frontend feature and its supporting backend. This BFF component must be self-sufficient in that it employs the CQRS pattern to create materialized views for all upstream dependencies and produces events to all downstream dependencies following the Event Sourcing pattern.

Architecture the user experience as a set of many independent experiences, each supporting a distinct user base and a distinct and cohesive set of features. Each experience is implemented as an independently deployed frontend application, which in turn is composed of multiple independent feature-oriented frontends. Each experience will dictate whether or not multiple flavors of the application must be written for different channels and device types.

Consider the following options and guidelines when deciding whether to merge or split BFF components. Leverage a client-directed query approach, such as GraphQL, to reasonably support multiple device formats in a single BFF. Do not merge components with different security models, such as authenticated and unauthenticated. Integrate shared components in the frontend, which naturally expects synchronous communication. Embrace disposable architecture and experiment to find the proper balance of BFF components.