无法在多个消费者的同一主题上阅读相同的消息

时间:2018-06-12 12:28:03

标签: spring-boot apache-kafka

我正在向topicX发布消息。为了让多个消费者使用此消息,我写了以下ConsumerConfig(注意,每个消费者都有不同的groupd_id

@EnableKafka
@Configuration
public class ConsumerConfig {
    @Value("${spring.kafka.bootstrap-servers}")
    private String bootstrapServers;

    @Bean
    public Map<String, Object> consumerConfigs(String groupId) {
        Map<String, Object> props = new HashMap<>();
        props.put(BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
        props.put(GROUP_ID_CONFIG, "my.groupid." + groupId);
        props.put(AUTO_OFFSET_RESET_CONFIG, "earliest");
        return props;
    }

    @Bean
    public ConsumerFactory<String, Car> consumerFactory(String groupId) {
        return new DefaultKafkaConsumerFactory<>(consumerConfigs(groupId), new StringDeserializer(),
                new JsonDeserializer<>(Car.class));
    }

    @Bean
    public ConcurrentKafkaListenerContainerFactory<String, Car> consumerOneKafkaListenerContainerFactory() {
        ConcurrentKafkaListenerContainerFactory<String, Car> factory = new ConcurrentKafkaListenerContainerFactory<>();
        factory.setConsumerFactory(consumerFactory("one"));
        return factory;
    }

    @Bean
    public ConcurrentKafkaListenerContainerFactory<String, Car> consumerTwoKafkaListenerContainerFactory() {
        ConcurrentKafkaListenerContainerFactory<String, Car> factory = new ConcurrentKafkaListenerContainerFactory<>();
        factory.setConsumerFactory(consumerFactory("two"));
        return factory;
    }
}

然后在特定消费者上,我添加了以下注释(指定了组ID和容器工厂)

@KafkaListener(id = "my.groupid.one", topics = "${app.topic.topicname}", containerFactory = "consumerOneKafkaListenerContainerFactory")

但是当我发布消息时,只有一个消费者会消费它。我如何配置kafka以便多个消费者使用每个已发布的消息?

我试过这个代码有1个分区和 n 分区(其中n =消费者数量),但我遇到了这个问题。

更新

这是我的主题制作人类

@Service
@Slf4j
public class TopicProducer {

    @Autowired
    private KafkaTemplate<String, TopicPayload> kafkaTemplate;

    public void send(String topicName, TopicPayload payload) {
        log.info("sending message={} to topic={}", payload, topicName);
        kafkaTemplate.send(topicName, payload);
    }

}

这是我的TopicProducerConfig

@Configuration
public class TopicProducerConfig {
    @Value("${spring.kafka.bootstrap-servers}")
    private String bootstrapServers;

    @Bean
    public Map<String, Object> producerConfigs() {
        Map<String, Object> props = new HashMap<>();
        props.put(BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
        props.put(KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
        props.put(VALUE_SERIALIZER_CLASS_CONFIG, JsonSerializer.class);
        return props;
    }

    @Bean
    public ProducerFactory<String, TopicPayload> producerFactory() {
        return new DefaultKafkaProducerFactory<>(producerConfigs());
    }

    @Bean
    public KafkaTemplate<String, TopicPayload> kafkaTemplate() {
        return new KafkaTemplate<>(producerFactory());
    }
}

我通过致电producer.send(topicName, payload)发布消息。

0 个答案:

没有答案