今天想对牛客网进行一个项目总结,随便点了几个功能,测试发帖功能的时候,没有发帖成功,页面卡主了,进入到服务器中查看项目日志:
略过了许多看不懂的报错之后,看到了几行看得懂的报错信息,内容如下图片所示,提示'Topic publish not present in metadata after 60000ms'发送失败。
因为我发帖之后会把帖子也往Elasticsearch中也存一份,这其中是通过kafka来传递这个存储事件,事件的topic就叫 ‘publish’, 既然这里出现了发送失败的异常,很有可能是kafak挂掉了。
通过查看kafka的所有主题来判断kafka是否正常运行,发现连不上broker,报错了
bin/kafka-topics.sh --list --bootstrap-server localhost:9092;
根据这个报错提示,应该就是kafka没有启动。所以得出原因应该是kafka挂了,导致发送消息事件失败,从而导致发帖异常。
解决方案:
既然挂了那就重启呗,但是启动kafka提示'cannot allocate memory'意思是不能分配内存, 还附带了一个错误日志报告的文件路径。
查看那个刚才提示的错误日志报告,OOM异常
分析前两行的意思:
// Java运行时环境的内存不足,无法继续运行。
## There is insufficient memory for the Java Runtime Environment to continue.
// 1073741824刚好是1G, 这句话的意思是本机内存分配未能为提交保留内存分配1G内存。
# Native memory allocation (malloc) failed to allocate 1073741824 bytes for committing reserved memory.
从这两行提示信息来看,应该是内存不够,经过百度,发现是kafka默认启动内存是1G, 而JVM默认内存也是1G, JVM自然不能所有内存都分配给kafka, 所以kafka就启动不了,解决方法是把kafka的最小启动内存设置为小于1G的值,即把kafka-server-start.sh中把'export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G"'中的Xms设置为256M, 这样,kafka最小只需要256M即可启动。
修改完后保存,进入bin目录重新启动, 没有报错信息。
cd bin
./kafka-server-start.sh ../config/server.properties
通过查看kafka的所有主题来判断kafka是否正常运行,成功打印出了所有现存的topic,可知kafka启动成功了。
因为我们需要kafka持久的在后台不停运行,所以还需要把kafka设置为守护线程方式启动。Ctrl + Z终止前台启动的kafka程序后,输入以下命令让kafka以守护线程的方式启动。
cd bin
./kafka-server-start.sh -daemon ../config/server.properties
通过查看kafka的所有主题来判断kafka是否正常运行,成功打印出了所有现存的topic,可知kafka启动成功了。
本来以为问题应该解决了,访问网页,刷新网页后,出现了网关错误。
不知道是什么原因,但是重启tomcat之后就没问题了,这里不知道是什么原因导致的。解决了问题就没有去深究了,等以后碰到这个问题再来解决。
参考:kafka启动时内存异常