Объясните параметры GetMetadata - PullRequest
1 голос
/ 23 сентября 2019

Как документация функции GetMetaData:

// GetMetadata queries broker for cluster and topic metadata.
// If topic is non-nil only information about that topic is returned, else if
// allTopics is false only information about locally used topics is returned,
// else information about all topics is returned.
// GetMetadata is equivalent to listTopics, describeTopics and describeCluster in the Java API.
func (a *AdminClient) GetMetadata(topic *string, allTopics bool, timeoutMs int) (*Metadata, error) {
    return getMetadata(a, topic, allTopics, timeoutMs)
}

Так что я думаю, что если тема не ноль, результат всегда возвращает только информацию конкретной темы.Однако, когда я пытаюсь проверить, я вижу очень странный результат.

Допустим, у меня уже есть тема Кафки.Затем я вызываю метод GetMetadata, как показано ниже:

topic := "sample_topic"
admin.GetMetadata(nil, false, timeout)
admin.GetMetadata(nil, true, timeout)
admin.GetMetadata(&topic, false, timeout)
admin.GetMetadata(&topic, true, timeout)

Только admin.GetMetadata(&topic, false, timeout) возвращает информацию о теме.Во всех остальных случаях возвращается информация обо всех темах.

Однако при тестировании несуществующей темы в кластере ошибка только 101 * * приведет к ошибке.

data, err := admin.GetMetadata(&topic, false, admin.timeOutMs())
fmt.Println(data.Topics[topic]) //   Broker: Unknown topic or partition

При повторном вызове-при заказе кода результат также меняется.

Я прочитал исходный код и вижу, что он использует некоторые функции из librdkafka, такие как rd_kafka_metadata или _getMetadata_broker_element.Но мне трудно понять эти функции.

Я тестировал на кластере Kafka с 3-мя брокерами.Пожалуйста, объясните мне, в чем заключается логика.

...