If I use functionRouter
with Spring Cloud Stream Kafka Binders (SpringBoot 3.0.4, Spring Cloud version 2022.0.1), where the functionRouter
consumes messages from multiple topics, is there a performance impact in comparison to using a separate functionRouter
for each topic? There's a functional Consumer
bean for each header['Type']
.
application.properties
for single functionRouter
:
spring.cloud.stream.bindings.functionRouter-in-0.destination=plane-events,flight-events
spring.cloud.stream.bindings.functionRouter-in-0.group=airplane
spring.cloud.stream.bindings.functionRouter-in-0.consumer.concurrency=8
spring.cloud.function.definition=functionRouter
spring.cloud.stream.function.routing.enabled=true
spring.cloud.function.routing-expression=headers['Type']
application.properties
for multiple functionRouter
s:
spring.cloud.stream.bindings.planeEventRouter-in-0.destination=plane-events
spring.cloud.stream.bindings.planeEventRouter-in-0.group=airplane
spring.cloud.stream.bindings.planeEventRouter-in-0.consumer.concurrency=8
spring.cloud.stream.bindings.flightEventRouter-in-0.destination=flight-events
spring.cloud.stream.bindings.flightEventRouter-in-0.group=airplane
spring.cloud.stream.bindings.flightEventRouter-in-0.consumer.concurrency=8
spring.cloud.function.definition=planeEventRouter;flightEventRouter
spring.cloud.stream.function.routing.enabled=true
spring.cloud.function.routing-expression=headers['Type']
Bean definitions for multiple functionRouter
s:
@Bean
RoutingFunction planeEventRouter(FunctionCatalog functionCatalog, FunctionProperties functionProperties, BeanFactory beanFactory, @Nullable MessageRoutingCallback routingCallback) {
return new RoutingFunction(functionCatalog, functionProperties, new BeanFactoryResolver(beanFactory), routingCallback);
}
@Bean
RoutingFunction flightEventRouter(FunctionCatalog functionCatalog, FunctionProperties functionProperties, BeanFactory beanFactory, @Nullable MessageRoutingCallback routingCallback) {
return new RoutingFunction(functionCatalog, functionProperties, new BeanFactoryResolver(beanFactory), routingCallback);
}
Consumer beans:
@Bean("PlaneEvent")
public Consumer<Message<PlaneEvent>> planeEventConsumer() {
return planeEventMsg -> {
System.out.println("Plane consumed " + planeEventMsg.getPayload());
};
}
@Bean("FlightEvent")
public Consumer<Message<FlightEvent>> flightEventConsumer() {
return flightEventMsg -> {
System.out.println("Flight consumed " + flightEventMsg.getPayload());
};
}