将nd_service_registry与uwsgi + Django堆栈一起使用时,将寄存器代码放在zookeeper的哪个位置?

时间:2015-07-30 11:17:15

标签: python django uwsgi apache-zookeeper

我使用nd_service_registry将我的django服务注册到使用uwsgi启动的zookeeper。

版本:

  

uWSGI == 2.0.10

     

的Django == 1.7.5

我的问题是,将nd_service_registry.set_node代码注册到zookeeper服务器的正确方法是什么,避免重复注册或取消注册。

我的uwsgi config ini, processes = 2,enable-threads = true,threads = 2

[uwsgi]
chdir = /data/www/django-proj/src
module = settings.wsgi:application
env = DJANGO_SETTINGS_MODULE=settings.test
master = true
pidfile = /tmp/uwsgi-proj.pid
socket = /tmp/uwsgi_proj.sock
processes = 2
threads = 2
harakiri = 20
max-requests = 50000
vacuum = true
home = /data/www/django-proj/env
enable-threads = true
buffer-size = 65535
chmod-socket=666

注册码:

from nd_service_registry import KazooServiceRegistry
nd = KazooServiceRegistry(server=ZOOKEEPER_SERVER_URL)
nd.set_node('/web/test/server0', {'host': 'localhost', 'port': 80})

我已经测试了这样的情况并且两者都按预期工作,django服务只在uwsgi主进程启动时注册了一次。

  1. 将代码放入settings.py
  2. 将代码放在wsgi.py
  3. 即使我杀死了uwsgi工作进程(然后主进程将重新启动另一个工作程序)或让工作程序通过uwsgi harakiri选项进行kill + restart,也没有触发新的注册操作。

    所以我的问题是我的注册码对于启用了进程和线程的django + uwsgi是否正确,以及放置它的位置。

1 个答案:

答案 0 :(得分:0)

当您使用uwsgi与master / worker时发生问题。当uwsgi主进程生成worker时,与zookeeper客户端中的线程维护的zookeeper的连接无法正确复制到worker。因此,在应用uwsgi时,应该使用uwsgi decorators:uwsgidecorators.postfork来初始化寄存器代码。在生成新工人时,将调用由@postfork修饰的函数。

希望它会有所帮助。