lua-resty-kafka模块使用

github:https://github.com/doujiang24/lua-resty-kafka

安装

该客户端是使用纯lua脚本写的,借助了openresty的cosocket api实现了非阻塞IO。不过该客户端支持的kafak协议不是很完全。
这种纯lua的模块安装很简单,直接解压,然后将对应的文件拷贝到openresty下即可。(先下载安装openresty)

cd /usr/local
wget https://github.com/doujiang24/lua-resty-kafka/archive/master.zip
unzip lua-resty-kafka-0.07.zip

cd cd lua-resty-kafka-0.07/lib/resty/
mv kafka /usr/local/openresty/lualib/resty/

安装完成后,可以看到该库主要的一些lua脚本:

-rw-r--r-- 1 root root  1390 Aug 31  2019 broker.lua
-rw-r--r-- 1 root root  5537 Aug 31  2019 client.lua
-rw-r--r-- 1 root root   710 Aug 31  2019 errors.lua
-rw-r--r-- 1 root root 11354 Aug 31  2019 producer.lua
-rw-r--r-- 1 root root  5046 Aug 31  2019 request.lua
-rw-r--r-- 1 root root  2211 Aug 31  2019 response.lua
-rw-r--r-- 1 root root  1494 Aug 31  2019 ringbuffer.lua
-rw-r--r-- 1 root root  4845 Aug 31  2019 sendbuffer.lua

2、使用:

http {
    include       mime.types;
    default_type  text/html;

    log_format  main  '$remote_addr [$time_local] "$request" '
                      '"$http_x_forwarded_for"';

    access_log  /data/logs/nginx/access.log  main;
    error_log   /data/logs/nginx/error.log warn;
    underscores_in_headers on;
	server {
        listen       80;
        server_name  localhost;
        access_log  /data/logs/nginx/access.log  main;
	
		location /kafka {
		   content_by_lua '
			  ngx.say("hello lua-resty-kafka")
		   ';

		   log_by_lua '
			  local producer = require "resty.kafka.producer"
			  local broker_list = {
				{ host = "10.19.80.82", port = 9092 },
			  }
			  local message = "hello openresty..."
			  local bp = producer:new(broker_list, { producer_type = "async" })
			  local ok, err = bp:send("test1", nil, message)
			  if not ok then
				ngx.log(ngx.ERR, "kafka send err:", err)
				return
			  end
		   ';
		}
	}
}

参考:

https://www.cnblogs.com/gxyandwmm/p/11298912.html
https://www.cnblogs.com/linzepeng/p/12643158.html

3、使用中常见问题:

3.1)lua-kafka attempt to call upvalue 'timer_every' (a nil value)
github issue:https://github.com/doujiang24/lua-resty-kafka/issues/88
lua-resty-kafka >=0.08版本,使用了openresty最新的一个函数,所以需要编译、安装新版本的openresty。
解决方法:安装新版本openresty,我使用的版本是nginx version: openresty/1.15.8.1
注:下载编译、安装新版本openresty后,不会覆盖原nginx二进制文件,会将其重命名为nginx.old

3.2)buffered messages send to kafka err: no resolver defined to resolve

或者报:buffered messages send to kafka err: not found topic, retryable: true...
github issue:
https://github.com/doujiang24/lua-resty-kafka/issues/78
https://github.com/doujiang24/lua-resty-kafka/issues/5

这两个错是一类问题,主要原因是:客户端用IP连接kafka的broker,然后到zookeeper拿到broker集群信息,这时如果kafka服务端没有配置listener,zk会返回kafka服务器的域名给客户端,而nginx不能解析域名(及时配置在hosts文件中)所以会报错。

  • 如果kafka服务端Listen配置成IP,那么在zookeeper记录的是IP地址
  • 如果kafka服务端Listen配置成域名,那么在zookeeper记录的是域名
  • 如果kafka服务端有advertised.listeners配置成域名,那么zookeeper会记录成域名,不管Listen配置成什么

参考:https://www.cnblogs.com/gxyandwmm/p/11298912.html

注:这个问题不光lua客户端有,java也会有此问题。

解决方法:

1)修改kafka的server.properties,增加:

listeners=PLAINTEXT://10.19.80.82:9092

然后重启kafka、重启nginx。

2)修改producer.lua源码,将ip写死在源码里(不推荐):

 

参考:https://my.oschina.net/qiongtaoli/blog/1577915

最后:由于发送kafka是会占用带宽资源,建议发送前使用zlib进行压缩。如何使用lua-zlib见:https://blog.csdn.net/liuxiao723846/article/details/107210760

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赶路人儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值