最近两个月,项目开发用到kafka,今天终于跑通了线上环境,这期间也踩了不少坑,在这里做一个总结。
大致需求:做一个图像处理工具,每天处理10w的图片,由于机房分布在不同地方,这里有两套kafka集群环境,业务系统也有好几个
开发思路:1.先准备内网环境
2.创建单机kafka
3.开发业务系统
4.跑通业务流程
5.配置两套kafka、和集群kafka
6.每个子系统配置双机,模拟集群
7.迁移到线上环境
大体是这样,我就说些kafka的注意事项
1.分区是消费者的整数倍,我是用2倍
kafka 启动和关闭的命令:
bin/kafka-server-start.sh config/server.properties
bin/kafka-server-stop.sh config/server.properties
2.主题的命名要规范,topic_作用_接受者_发送者
创建的命令是:
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 2--topic topic_info_receiver_sender
3.服务器查看kafka消费状态
kafka-consumer-groups.sh --zookeeper xxx.xxx.xxx.xxx:2181 --group groupid--describe
GROUP TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG OWNER
xxx xxx xxx xxx xxx xxx
LAG 表示生产消息,但是还未被消费
LOG-END-OFFSET 表示该队列已经被消费的消息总数
4.主题删除
先用命令:
bin/kafka-topics.sh --delete --zookeeper localhost:2181 --topic xxx
若该命令无效,则进入zookeeper/bin
./zkCli.sh
ls /brokers/topics 查看所有的topic
rmr /brokers/topics/xxx 删除
5.集群配置
把zookeeper、kafka 复制到新机器上,改两个文件就行,这个网上有很多,不在重复
6.代码层面
因为不止一个业务系统,把kafka的操作,produce和comsumer封装在两个项目里面,通过注解配置,其他项目通过maven引入
<dependency>
<groupId>com.xxx.kafka</groupId>
<artifactId>kafka-producer</artifactId>
<version>0.0.1</version>
</dependency>
<dependency>
<groupId>com.xxx.kafka</groupId>
<artifactId>kafka-consumer</artifactId>
<version>0.0.1</version>
</dependency>
7.如果一个子系统需要连接两套kafka集群,也就是有两个生产者,要注意缓存,最好在发送之前更新下代码的brokerList
<bean id="southKafkaProducer" class="com.xxx.kafka.producer.KafkaProducer" init-method="init" lazy-init="true">
<property name="brokerlist" value="${metadata.broker.list}"></property>
<property name="partion" value="${partion}"></property>
<property name="bufferingMaxMs" value="${bufferingMaxMs}"></property>
<property name="bufferingmaxmessages" value="${bufferingmaxmessages}"></property>
</bean>
<bean id="northKafkaProducer" class="com.xxx.kafka.producer.KafkaProducer" init-method="init" lazy-init="true">
<property name="brokerlist" value="${metadata.broker.list2}"></property>
<property name="partion" value="${partion}"></property>
<property name="bufferingMaxMs" value="${bufferingMaxMs}"></property>
<property name="bufferingmaxmessages" value="${bufferingmaxmessages}"></property>
</bean>
8.关于调优
- 内存方面,多多益善,比如机器有8G,kafka给7.9G
- 日志定时清理,用脚本
- 防止某个主题的消息堆积,可以加队列,个数限制,超过总数不发送到kafka队列,具体的在上两篇博文中有介绍
- 消息大小限制,由于业务需要,照顾不了吞吐量,也是往大了设置,保证稳定性
props.put("fetch.message.max.bytes", "2000000000");
props.put("fetch.message.max.bytes", "2048576000");
- 没什么事不要操作kafka!没什么事不要操作kafka!没什么事不要操作kafka!