Je veux vérifier si le serveur Kafka est en cours d'exécution ou non avant de démarrer les travaux de production et de consommation. Il est dans l'environnement Windows et voici le code de mon serveur kafka dans Eclipse ...
Properties kafka = new Properties();
kafka.setProperty("broker.id", "1");
kafka.setProperty("port", "9092");
kafka.setProperty("log.dirs", "D://workspace//");
kafka.setProperty("zookeeper.connect", "localhost:2181");
Option<String> option = Option.empty();
KafkaConfig config = new KafkaConfig(kafka);
KafkaServer server = new KafkaServer(config, new CurrentTime(), option);
server.startup();
Dans ce cas, if (server != null)
n'est pas suffisant car c'est toujours vrai. Alors, y a-t-il un moyen de savoir que mon serveur Kafka est en cours d'exécution et prêt pour le producteur Il est nécessaire pour moi de vérifier cela car cela entraîne la perte de certains paquets de données de départ.
Merci.
Un broker.id
doit être attribué à tous les courtiers Kafka. Au démarrage, un courtier crée un nœud éphémère dans Zookeeper avec un chemin de /broker/ids/$id
. Le nœud étant éphémère, il sera supprimé dès que le courtier se déconnectera, par exemple. en arrêtant.
Vous pouvez afficher la liste des nœuds de courtier éphémère de la manière suivante:
echo dump | nc localhost 2181 | grep brokers
L’interface client de ZooKeeper expose un certain nombre de commandes; dump
répertorie toutes les sessions et tous les nœuds éphémères du cluster.
Remarque, ce qui précède suppose:
2181
) sur localhost
et localhost
est le leader du cluster.zookeeper.connect
Kafka ne spécifie pas d’environnement chroot pour votre cluster Kafka, c’est-à-dire qu’il s’agit juste de Host:port
et non de Host:port/path
La réponse de Paul est très bonne et c'est en fait la façon dont Kafka & Zk travaillent ensemble du point de vue d'un courtier.
Je dirais qu'une autre option facile pour vérifier si un serveur Kafka est en cours d'exécution est de créer un simple KafkaConsumer pointant vers le cluste et d'essayer une action, par exemple,listTopics () . Si le serveur kafka n'est pas en cours d'exécution, vous obtiendrez un TimeoutException et vous pourrez utiliser une phrase try-catch
.
def validateKafkaConnection(kafkaParams : mutable.Map[String, Object]) : Unit = {
val props = new Properties()
props.put("bootstrap.servers", kafkaParams.get("bootstrap.servers").get.toString)
props.put("group.id", kafkaParams.get("group.id").get.toString)
props.put("key.deserializer", "org.Apache.kafka.common.serialization.StringDeserializer")
props.put("value.deserializer", "org.Apache.kafka.common.serialization.StringDeserializer")
val simpleConsumer = new KafkaConsumer[String, String](props)
simpleConsumer.listTopics()
}
J'ai utilisé le AdminClient api.
Properties properties = new Properties();
properties.put("bootstrap.servers", "localhost:9092");
properties.put("connections.max.idle.ms", 10000);
properties.put("request.timeout.ms", 5000);
try (AdminClient client = KafkaAdminClient.create(properties))
{
ListTopicsResult topics = client.listTopics();
Set<String> names = topics.names().get();
if (names.isEmpty())
{
// case: if no topic found.
}
return true;
}
catch (InterruptedException | ExecutionException e)
{
// Kafka is not available
}
vous pouvez utiliser le code ci-dessous pour rechercher les courtiers disponibles si le serveur est en cours d'exécution.
import org.I0Itec.zkclient.ZkClient;
public static boolean isBrokerRunning(){
boolean flag = false;
ZkClient zkClient = new ZkClient(endpoint.getZookeeperConnect(), 10000);//, kafka.utils.ZKStringSerializer$.MODULE$);
if(zkClient!=null){
int brokersCount = zkClient.countChildren(ZkUtils.BrokerIdsPath());
if(brokersCount > 0){
logger.info("Following Broker(s) {} is/are available on Zookeeper.",zkClient.getChildren(ZkUtils.BrokerIdsPath()));
flag = true;
}
else{
logger.error("ERROR:No Broker is available on Zookeeper.");
}
zkClient.close();
}
return flag;
}
La bonne option est d'utiliser AdminClient comme ci-dessous avant de commencer à produire ou à utiliser les messages.
private static final int ADMIN_CLIENT_TIMEOUT_MS = 5000;
try (AdminClient client = AdminClient.create(properties)) {
client.listTopics(new ListTopicsOptions().timeoutMs(ADMIN_CLIENT_TIMEOUT_MS)).listings().get();
} catch (ExecutionException ex) {
LOG.error("Kafka is not available, timed out after {} ms", ADMIN_CLIENT_TIMEOUT_MS);
return;
}
J'ai trouvé un événement OnError
à Kafka confluent:
consumer.OnError += Consumer_OnError;
private void Consumer_OnError(object sender, Error e)
{
Debug.Log("connection error: "+ e.Reason);
ConsumerConnectionError(e);
}
Et sa documentation en code:
//
// Summary:
// Raised on critical errors, e.g. connection failures or all brokers down. Note
// that the client will try to automatically recover from errors - these errors
// should be seen as informational rather than catastrophic
//
// Remarks:
// Executes on the same thread as every other Consumer event handler (except OnLog
// which may be called from an arbitrary thread).
public event EventHandler<Error> OnError;