anchor.diff:  === Application Model
   
   A Spring Cloud Stream application consists of a middleware-neutral core.
  -The application communicates with the outside world through input and output channels injected into it by Spring Cloud Stream.
  -Channels are connected to external brokers through middleware-specific Binder implementations.
  +The application communicates with the outside world by establishing _bindings_ between destinations
  +exposed by the external brokers and input/output arguments in your code. Broker specific details
  +necessary to establish bindings are handled by middleware-specific _Binder_ implementations.
   
   .Spring Cloud Stream Application
   image::{github-raw}/docs/src/main/asciidoc/images/SCSt-with-binder.png[width=800,scaledwidth="75%",align="center"]
  
positive.code: 
  Spring Cloud Stream models this behavior through the concept of a consumer group.
  (Spring Cloud Stream consumer groups are similar to and inspired by Kafka consumer groups.)
  Each consumer binding can use the `spring.cloud.stream.bindings.<channelName>.group` property to specify a group name.
  For the consumers shown in the following figure, this property would be set as `spring.cloud.stream.bindings.<channelName>.group=hdfsWrite` or `spring.cloud.stream.bindings.<channelName>.group=average`.
  
  .Spring Cloud Stream Consumer Groups
  image::{github-raw}/docs/src/main/asciidoc/images/SCSt-groups.png[width=800,scaledwidth="75%",align="center"]
  
negative.code: Spring Cloud Stream also includes a test binder for integration testing of your applications as spring-cloud-stream application. See <<Testing>> section for more details.
  
  Spring Cloud Stream uses Spring Boot for configuration, and the Binder abstraction makes it possible for a Spring Cloud Stream application to be flexible in how it connects to middleware.
  For example, deployers can dynamically choose, at runtime, the mapping between the external destinations (such as the Kafka topics or RabbitMQ exchanges) and inputs
  and outputs of the message handler (such as input parameter of the function and its return argument).
  Such configuration can be provided through external configuration properties and in any form supported by Spring Boot (including application arguments, environment variables, and `application.yml` or `application.properties` files).
  In the sink example from the <<spring-cloud-stream-overview-introducing>> section, setting the `spring.cloud.stream.bindings.input.destination` application property to `raw-sensor-data` causes it to read from the `raw-sensor-data` Kafka topic or from a queue bound to the `raw-sensor-data` RabbitMQ exchange.
  
  Spring Cloud Stream automatically detects and uses a binder found on the classpath.
  You can use different types of middleware with the same code.
  To do so, include a different binder at build time.
  For more complex use cases, you can also package multiple binders with your application and have it choose the binder( and even whether to use different binders for different bindings) at runtime.
  
  [[spring-cloud-stream-overview-persistent-publish-subscribe-support]]
  === Persistent Publish-Subscribe Support
  