Publish multiple interfaces for each component: a synchronous API for processing commands and queries, an asynchronous API for publishing events as the state of the component changes, and/or an asynchronous API for consuming the events emitted by other components.
We are building reactive, cloud-native systems composed of bounded isolated components which rely on event streaming for inter-component communication. Therefore, a large portion of the system functionality does not communicate over RESTful interfaces. There are few, if any, tools for documenting asynchronous interfaces in a standardized way. One team owns each component, a team may be responsible for multiple components, but a single team rarely owns all of the components.
We need to recognize and acknowledge that reactive, cloud-native systems are different and require a different way of thinking about systems. We no longer communicate via just a synchronous API, such as REST and/or GraphQL...