我已经配置了3个kafka集群,并且试图与spring-kafka一起使用。 但是当我杀死一个卡夫卡时,我无法将其他消息发送到队列中。
Kafka版本2.0.0 spring-kafka版本2.0.1
kafka-topics.sh-描述--zookeeper = zoo1:2181 打印
KAFKA_SWARM_TEST PartitionCount:1 ReplicationFactor:2 Configs:
Topic: KAFKA_SWARM_TEST Partition: 0 Leader: 2 Replicas: 1,2 Isr: 2,1
spring-kafka配置
spring.kafka.bootstrap-servers="kafka2:9094,kafka1:9093"
当我杀死kafka1时,领导者是kafka2。领导者仍然是kafka1。但春天卡夫卡会抛出
Connection to node 1 could not be established.Broker may not be available.
Discovered group coordinator kafka1:9093
看起来像spring-kafka连接,只需使用kafka1;
我的Java代码
@GetMapping(path = "/send",produces = MediaType.APPLICATION_JSON_VALUE)
public JsonNode send() throws JsonProcessingException {
ObjectNode put = JsonNodeFactory.instance.objectNode().put("status", "success");
String topic = "KAFKA_SWARM_TEST";
val msg = MessageBuilder
.withPayload(objectMapper.writeValueAsString(put))
.setHeader(KafkaHeaders.TOPIC, topic)
.build();
kafkaTemplate.send(msg);
return put;
}
@Bean
public NewTopic topic() {
return new NewTopic("KAFKA_SWARM_TEST", 1, (short) 2);
}
@KafkaListener(groupId="#{T(java.util.UUID).randomUUID().toString()}",topics = "KAFKA_SWARM_TEST")
void testGetInfo(String message) throws IOException {
log.error("getMessage: =====> " + message);
}
kafka配置
version: '3.7'
services:
zoo1:
image: wurstmeister/zookeeper
restart: always
ports:
- 2181:2181
environment:
ZOO_MY_ID: 1
ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888
zoo2:
image: wurstmeister/zookeeper
restart: always
ports:
- 2180:2181
environment:
ZOO_MY_ID: 2
ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888
kafka1:
image: wurstmeister/kafka
restart: always
ports:
- "9093:9093"
depends_on:
- zoo1
- zoo2
privileged: true
environment:
KAFKA_BROKER_ID: 1
KAFKA_ADVERTISED_HOST_NAME: $KAFKA_ADVERTISED_HOST_NAME
KAFKA_ZOOKEEPER_CONNECT: zoo1:2181,zoo2:2181
KAFKA_LOG_DIRS: /kafka
KAFKA_SSL_KEYSTORE_LOCATION: /kafka_broker_cert/server.keystore.jks
KAFKA_SSL_KEYSTORE_PASSWORD: ksstone430
KAFKA_SSL_KEY_PASSWORD: ksstone430
KAFKA_SSL_TRUSTSTORE_LOCATION: /kafka_broker_cert/server.truststore.jks
KAFKA_SSL_TRUSTSTORE_PASSWORD: stsstone430
KAFKA_LISTENERS: "PLAINTEXT://:9092,SSL://:9093"
KAFKA_ADVERTISED_LISTENERS: "PLAINTEXT://:9092,SSL://$KAFKA_ADVERTISED_HOST_NAME:9093"
KAFKA_SSL_CLIENT_AUTH: required
LEADER_IMBALANCE_CHECK_INTERVAL_SECONDS: 60
KAFKA_SSL_ENDPOINT_IDENTIFICATION_ALGORITHM: "null"
volumes:
- ./kafka_broker_cert:/kafka_broker_cert
- /var/run/docker.sock:/var/run/docker.sock
kafka2:
image: wurstmeister/kafka
restart: always
ports:
- "9094:9093"
depends_on:
- zoo1
- zoo2
environment:
KAFKA_BROKER_ID: 2
KAFKA_ADVERTISED_HOST_NAME: $KAFKA_ADVERTISED_HOST_NAME
KAFKA_ZOOKEEPER_CONNECT: zoo1:2181,zoo2:2181
KAFKA_LOG_DIRS: /kafka
KAFKA_SSL_KEYSTORE_LOCATION: /kafka_broker_cert/server.keystore.jks
KAFKA_SSL_KEYSTORE_PASSWORD: ksstone430
KAFKA_SSL_KEY_PASSWORD: ksstone430
KAFKA_SSL_TRUSTSTORE_LOCATION: /kafka_broker_cert/server.truststore.jks
KAFKA_SSL_TRUSTSTORE_PASSWORD: stsstone430
KAFKA_LISTENERS: "PLAINTEXT://:9092,SSL://:9093"
KAFKA_ADVERTISED_LISTENERS: "PLAINTEXT://:9092,SSL://$KAFKA_ADVERTISED_HOST_NAME:9093"
KAFKA_SSL_CLIENT_AUTH: required
LEADER_IMBALANCE_CHECK_INTERVAL_SECONDS: 60
KAFKA_SSL_ENDPOINT_IDENTIFICATION_ALGORITHM: "null"
volumes:
- ./kafka_broker_cert:/kafka_broker_cert
- /var/run/docker.sock:/var/run/docker.sock
答案 0 :(得分:0)
尝试杀死一个节点(例如,领导者kafka1)时,检查Kafka集群的新领导者选举是否正常工作
还要检查是否有其他配置可以覆盖spring.kafka.bootstrap-servers
。可能有一个bean仅指向kafka1:9093
作为代理。
但是,即使bootstrap-servers
属性仅指向kafka1:9093
,在进行节点调整的情况下,消费者也应该找到代理的其他节点。