求教lua如何读etcd

754 views
Skip to first unread message

brilla...@gmail.com

unread,
Apr 27, 2016, 10:21:42 PM4/27/16
to openresty

求教一个问题,在处理web request时需要先从etcd取出配置信息,我对配置的实时性要求挺高的,如果有其他服务修改了etcd里的配置,openresty要能在秒级别感知到,而且也不太想每个request都要connect 一次etcdcost太高,所以我想到以下方案:

 

1.       openresty里起一个线程watch etcd,发生变化就把最新的值放到openrestyshare cache里。

           问题:nginxmaster worker架构,这个watch线程是每个worker一个还是全局只有一个(怎么实现全局唯一)。而且如果etcd挂了或者某个worker挂了怎么办?

2.       开发一个etcdlua client,需要支持connection pool,类似lua-redis的实现,因为目前还没有带connection pooletcd lua client

  问题:开发难度偏大



Guanglin Lv

unread,
Apr 28, 2016, 4:28:24 AM4/28/16
to openresty

现在需要独立干活的worker的诉求有很多,呵呵,都在期待;

使用etcd的,前段时间有位同学写了一个,你可以参考下 https://github.com/rrfeng/lua-resty-upstream-etcd



在 2016年4月28日星期四 UTC+8上午10:21:42,brilla...@gmail.com写道:

Guanglin Lv

unread,
Apr 28, 2016, 4:32:10 AM4/28/16
to openresty
补充几点,

1、你可以让一个worker全职做这个事情,也可以启动一个轻线程来做
2、使用cosocket和etcd通信就行,connection pool都是支持的,甚至可以直接用一些封装好的http client库,比如https://github.com/pintsized/lua-resty-http
     



在 2016年4月28日星期四 UTC+8上午10:21:42,brilla...@gmail.com写道:

求教一个问题,在处理web request时需要先从etcd取出配置信息,我对配置的实时性要求挺高的,如果有其他服务修改了etcd里的配置,openresty要能在秒级别感知到,而且也不太想每个request都要connect 一次etcdcost太高,所以我想到以下方案:

brilla...@gmail.com

unread,
May 2, 2016, 11:08:42 PM5/2/16
to openresty
多谢lv解答。

就着你的回复我再问一下:
1.如何只让一个worker全职做,这个worker怎么保证存活
2.启动一个轻线程做是指在init master的时候启动一个轻线程还是说init worker的时候

从一个原java程序员的角度思考,如果java实现一个etcd的client 应该会启动一个thread来全职做watch的工作的,所以感觉在init master的时候起一个thread比较接近java的设计思路啊?

Yichun Zhang (agentzh)

unread,
May 3, 2016, 3:35:14 PM5/3/16
to openresty
Hello!

2016-05-02 20:08 GMT-07:00 <brilla...@gmail.com>:
> 1.如何只让一个worker全职做,这个worker怎么保证存活

这其实是一个 FAQ 了,你的某一个 worker 只需在 lua_shared_dict 里面置一个标志(使用 add 方法),这样其他
worker 置不上标志,就自然不做事了。比如 lua-resty-upstream-healthcheck 库就这么做的,可以参考。

> 2.启动一个轻线程做是指在init master的时候启动一个轻线程还是说init worker的时候
>

nginx 的 master 进程只负责监听外部信号,包括来自其负责监管的各个 worker 进程的信号。自然只能在 init worker 里面建立轻线程了。

> 从一个原java程序员的角度思考,如果java实现一个etcd的client 应该会启动一个thread来全职做watch的工作的,所以感觉在init
> master的时候起一个thread比较接近java的设计思路啊?
>

OpenResty/NGINX 不是 Java :) JVM 的进程与线程模型,和 NGINX 的很不一样,没有可比性。

Regards,
-agentzh

brilla...@gmail.com

unread,
May 4, 2016, 4:21:25 AM5/4/16
to openresty
懂了!

解决了困扰这几天的问题,多谢春哥和LV!
Reply all
Reply to author
Forward
0 new messages