# 配置RocketMQ客户端
本章节介绍RocketMQ客户端的配置建议。
#### Java客户端版本
Java客户端版本建议使用5.1.4及以上版本。
#### 避免ClientId相同
客户端的ClientId默认为进程号、本机IP、instanceName进行组合。如果同一个进程内，一个消费组下启动两个消费者，则会导致两者ClientId相同，从而出现有的队列重复消费、有的队列无法消费的情况。
**配置建议**
由于ClientId生成时会拼接消费者的clientIP属性，同一 IP下不同消费者的clientIP相同会导致ClientId相同，所以建议添加如下代码手动设置instanceName。
```
consumer.setInstanceName(String.valueOf(System.nanoTime()))
```
#### 开启生产者异常检测机制
**Java客户端5.1.4及以上版本才支持该功能。**
建议客户端开启异常检测机制，当客户端连接Broker超时后，能快速剔除超时的Broker，使生产的消息到其他Broker。
```
producer.setSendLatencyFaultEnable(true)
```
#### 生产者重试的错误码增加SYSTEM_BUSY
建议生产者配置重试的错误码，当Broker出现写盘繁忙、主备倒换等异常，导致返回SYSTEM_BUSY时，可重试发送消息到其他正常的Broker，减小业务影响。
```
producer.addRetryResponseCode(ResponseCode.SYSTEM_BUSY);
```
仅4.9.2版本及以上的客户端才支持使用addRetryResponseCode函数。需要注意的是，5.2.1及以上版本的客户端已默认增加SYSTEM_BUSY，无需再额外添加。
#### 获取SDK日志
RocketMQ客户端与服务端的通信协议是比较复杂的，例如消费队列的分配，主题的寻址，都是客户端SDK的实现决定的，这些过程的重要信息都保存在SDK日志里。因此，当出现生产或消费问题时，SDK日志是排查问题的最重要手段之一，请务必保存这些日志。通常情况，SDK日志不与业务日志打印在同一个文件中，我们给出常用SDK的日志默认路径，如[表1]所示。
 表1SDK日志默认路径 
| SDK 语言 | SDK 协议 | 路径                                           |
|:---|:---|:---|
| Java   | TCP   | \~/logs/rocketmqlogs/rocketmq_client.log     |
| Java   | gRPC  | \~/logs/rocketmq/rocketmq_client.log         |
| Go     | TCP  | /tmp/rocketmq-client.log                      |
| Go     | gRPC  | \~/logs/rocketmqlogs/rocketmq_client_go.log |
   
