1、最近项目规划升级kafka版本,从之前的0.11版本升级最新版本的2.4.1;升级过过程遇到了坑,特此记录一下。
背景:
项目中的有两个不同业务数据处理方式,一个是核心数据,一个用户的非核心数据,由于非核心数据的量巨大,所以项目中打算使用两个kafka集群来处理,非核心数据继续使用之前的kafka集群;
其目的就是防止非核心数据在量过大的情况影响kafka的稳定性,进而影响核心数据处理业务。
项目中的flink处理没问题,但是在openresty的使用过程中遇到了问题。
出现的现象如下:
1、openresty中使用了两个不同端口的kafka集群;
2、在核心数据的kafka收到数据的时候,对应的新集群可以收到,但是非核心数据并没有发到对应的老集群,而是发到了新集群,由于新集群没有手动创建topic,报了找不到topic的异常;
3、非核心数据先发数据,可以发到对应的老kafka集群,但是核心数据没有发到新集群,而是继续发到了老集群。
问题分析:
根据现象分析,可以推测,两个不同的kafka集群配置openresty中,只生效了一个,第一个初始化成功的生效了,但是openresty肯定是可以支持不同集群配置。
根据问题定位,查看openresty引用的kafka中的开源代码,代码如下:
同时openresty的代码中使用的new方式为:
local bp = producer:new(broker_list, { producer_type = "async" })
从这里看可以一目了然了,原来在初始话的时候,未使用第三个参数,导致后边的kafka返回的时候,还是返回第一次创建生成的默认kafka。导致只有一个生效。
处理措施:
local bp = producer:new(broker_list, { producer_type = "async" }, "kafka2.4.1")
local bp = producer:new(broker_list, { producer_type = "async" }, "kafka0.1.1")
针对使用的不同的集群,给集群初始化不同的 cluster_name。
处理结果:
发布部署后,问题解决,两个不同的集群可以同时接收不同的上报数据。