
# Kafka应用开发规则
#### 调用Kafka API（AdminZkClient.createTopic）创建Topic
- 对于Java开发语言，正确示例：
  ```
  import kafka.zk.AdminZkClient;
  import kafka.zk.KafkaZkClient;
  import kafka.admin.RackAwareMode;
  … 
  KafkaZkClient kafkaZkClient = KafkaZkClient.apply(zkUrl, JaasUtils.isZkSecurityEnabled(), zkSessionTimeoutMs, zkConnectionTimeoutMs, Int.MaxValue(), Time.SYSTEM, "", "", null);
  AdminZkClient adminZkClient = new AdminZkClient(kafkaZkClient);
  adminZkClient.createTopic(topic, partitions, replicas, new Properties(), RackAwareMode.Enforced$.MODULE$);
  …
  ```
  
- 对于Scala开发语言，正确示例：
  ```
  import kafka.zk.AdminZkClient;
  import kafka.zk.KafkaZkClient;
  … 
  val kafkaZkClient: KafkaZkClient = KafkaZkClient.apply(zkUrl, JaasUtils.isZkSecurityEnabled(), zkSessionTimeoutMs, zkConnectionTimeoutMs, Int.MaxValue, Time.SYSTEM, "", "")
  val adminZkClient: AdminZkClient = new AdminZkClient(kafkaZkClient)
  adminZkClient.createTopic(topic, partitions, replicas)
  ```
  
 
#### Partition的副本数不要超过节点个数
Kafka中Topic的Partition的副本是为了提升数据的可靠性而存在的，同一个Partition的副本会分布在不同的节点，因此副本数不允许超过节点个数。
#### Consumer客户端的配置参数"fetch.message.max.bytes"大小
Consumer客户端的配置参数"fetch.message.max.bytes"必须大于等于Producer客户端每次产生的消息最大字节数。如果参数的值太小，可能导致Producer产生的消息无法被Consumer成功消费。
