0

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 functionRouters:

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 functionRouters:

@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());
    };
}
Karthik
  • 129
  • 11

0 Answers0