我正在写一个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)
答案 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());
}