java实现生产者非常简单,可以直接使用kafka-clients包,也可以使用spring-kafka这样的框架。
我们为了便于内外网向kafka(0.10.0)上报数据,所以封装了一个http接口专门接收数据(做一些合法性校验)并将数据生产到kafka中。
运行了快一年,随着数据量的增大,业务变重,开始出现问题:
1、高峰期有时候出现接口不可用,全部上报都返回失败;
2、日志中大量打印alloc memery timeout;
在网上搜了一下错误码,其他人也有遇到过,给出的建议是将batchsize配置改为0来解决分配不到内存的问题。实测无效!!
然后回去看了官方文档,从官方文档的意思上看,由于我们使用了batchsize和lingerms来提升性能, send操作会将数据暂存到本地的buffermemory中,一定时间(lingerms)过后才会尝试将数据发送到kafka集群上。但是由于我们的buffermemory使用了kafka给的33M左右大小的块,在我们当前系统中会被快速消耗完毕。本来这个时候kafka内部有一个block直到有内存可用为止的方法,但是为了提升性能快速失败,我们配置了maxblockms为1000毫米,所以出现了很多分配不到内存的问题,将buffermemory增大10倍过后,分配不到内存的问题解决。
另外有个小知识点:
生产者的send函数,返回的是Future对象,该future是kafka包里面实现的,其中的get函数超时并不会导致任务失败。