gpt4 book ai didi

plugins - 我的 nginx 模块可以在主进程中建立连接吗?

转载 作者:行者123 更新时间:2023-12-04 08:52:18 24 4
gpt4 key购买 nike

我正在编写一个 nginx 模块,它想要订阅 zeromq pubsub 套接字并根据它接收到的消息更新内存中的数据结构。为了节省带宽,只有一个进程进行订阅是有意义的,并且数据结构应该在 shm 中,以便所有进程都可以使用它。对我来说,一个进程应该是主进程似乎很自然(因为如果它是一个 worker ,代码将不得不以某种方式决定哪个 worker )。

但是当我调用 ngx_get_connection来自我的init_masterinit_module回调,它的段错误,显然是由于 ngx_cycle尚未初始化。谷歌搜索在主进程中工作的插件似乎相当悲观。有没有更好的方法来实现我的目标,即每台服务器与 pubsub 套接字建立一个传出连接,而不管它有多少工作人员?

这是一个在工作上下文中工作但不是来自主上下文的代码示例:

void *zmq_context = zmq_ctx_new();
void *control_socket = zmq_socket(zmq_context, ZMQ_SUB);
int control_fd;
size_t fdsize = sizeof(int);
ngx_connection_t *control_connection;

zmq_connect(control_socket, "tcp://somewhere:1234");
zmq_setsockopt(control_socket, ZMQ_SUBSCRIBE, "", 0);
zmq_getsockopt(control_socket, ZMQ_FD, &control_fd, &fdsize);
control_connection = ngx_get_connection(control_fd, cycle->log);
control_connection->read->handler = my_read_handler;
control_connection->read->log = cycle->log;
ngx_add_event(control_connection->read, NGX_READ_EVENT, 0);

和其他地方
void my_read_handler (ngx_event_t *ev) {
int events;
size_t events_size = sizeof(events);

zmq_getsockopt(control_socket, ZMQ_EVENTS, &events, &events_size);
while (events & ZMQ_POLLIN) {
/* ...
read a message, do something with it
... */
events = 0;
zmq_getsockopt(control_socket, ZMQ_EVENTS, &events, &events_size);
}
}

最佳答案

To save bandwidth, it makes sense that only one process should make the subscription, and the data structure should be in shm so that all processes can make use of it. To me it seems natural that that one process should be the master (since if it was a worker, the code would have to somehow decide which worker).



正如我已经说过的,你所需要的只是拒绝你的自然想法,只为你的目的使用一个工作进程。

哪个 worker ?好吧,让它成为第一个开始。

关于plugins - 我的 nginx 模块可以在主进程中建立连接吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21803623/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com