Kafka API和/或协议是否提供查询服务器属性的方法?

时间:2018-10-23 18:17:39

标签: apache-kafka

我正在写一个Kafka生产者,它有时会发送带有超过最大允许请求大小的消息的请求。似乎我无法直接访问向其发送消息的Kafka集群的服务器属性,也没有找到一种方法来查询服务器以获取server.properties文件中设置的值( s。

示例

尝试发送太大的消息会触发Kafka日志,提示...

11:47:37 kafka.1     | Topic and partition to exceptions: 
page-visits-0 -> org.apache.kafka.common.errors.RecordTooLargeException 
(kafka.server.KafkaApis)

2 个答案:

答案 0 :(得分:1)

您可以使用https://192.30.253.112/ API来获取集群信息。它可以提供代理级别以及主题级别的信息。下面的代码将为每个节点提供服务器配置。

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.ExecutionException;

import org.apache.kafka.clients.admin.AdminClient;
import org.apache.kafka.clients.admin.Config;
import org.apache.kafka.clients.admin.DescribeClusterResult;
import org.apache.kafka.clients.admin.DescribeConfigsResult;
import org.apache.kafka.common.Node;
import org.apache.kafka.common.config.ConfigResource;
import org.apache.kafka.common.config.ConfigResource.Type;


public class ListTopics {

    public static void main(String[] args) throws IOException, InterruptedException, ExecutionException {
        Properties prop = new Properties();
        prop.setProperty("bootstrap.servers","localhost:9092");
        AdminClient admin = AdminClient.create(prop);
        DescribeClusterResult describeClusterResult = admin.describeCluster();
        List<Node> nodes = new ArrayList<>(describeClusterResult.nodes().get());
        // Pass the broker node ID here. You can use for loop in case of multiple broker nodes.
        ConfigResource resource = new ConfigResource(Type.BROKER, String.valueOf(nodes.get(0).id()));

        DescribeConfigsResult configs = admin.describeConfigs(Collections.singletonList(resource));
        Map<ConfigResource, Config> config = configs.all().get();
        System.out.println(config   );
    }
}

P.S。此API仅可用于Kafka 0.11及更高版本的安装。

答案 1 :(得分:0)

假设您的集群至少运行Kafka 0.11,则可以使用AdminClient describeConfigs() API检索代理配置。

例如:

Properties configs = new Properties();
configs.setProperty(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
AdminClient client = AdminClient.create(configs);

List<ConfigResource> resources = Arrays.asList(new ConfigResource(Type.BROKER, "0"));
DescribeConfigsResult dcr = client.describeConfigs(resources);
for (Map.Entry<ConfigResource, Config> entry : dcr.all().get().entrySet()) {
    System.out.println(entry.getKey() + " - " + entry.getValue());
}