Nginx——事件驱动机制(惊群问题,负载均衡)

事件框架处理流程

         每个worker子进程都在ngx_worker_process_cycle方法中循环处理事件,处理分发事件则在ngx_worker_process_cycle方法中调用ngx_process_events_and_timers方法,循环调用该方法就是 在处理所有事件,这正是事件驱动机制的核心。该方法既会处理普通的网络事件,也会处理定时器事件。

ngx_process_events_and_timers方法中核心操作主要有以下3个:

1)  调用所使用事件驱动模块实现的process_events方法,处理网络事件

2)  处理两个post事件队列中的事件,实际上就是分别调用ngx_event_process_posted(cycle, &ngx_posted_accept_events)和ngx_event_process_posted(cycle,&ngx_posted_events)方法

3)  处理定时事件,实际上就是调用ngx_event_expire_timers()方法

下面是ngx_process_events_and_timers方法中的时间框架处理流程图以及源代码,可以结合理解:



源代码如下:

void
ngx_process_events_and_timers(ngx_cycle_t *cycle)
{
    ngx_uint_t  flags;
    ngx_msec_t  timer, delta;
	/*如果配置文件中使用了timer_resolution配置项,也就是ngx_timer_resolution值大于0,
	则说明用户希望服务器时间精度为ngx_timer_resolution毫秒。这时,将ngx_process_changes
	的timer参数设为-1,告诉ngx_process_change方法在检测时间时不要等待,直接搜集所有已经
	就绪的时间然后返回;同时将flag参数初始化为0,它是在告诉ngx_process_changes没有任何附加
	动作*/
    if (ngx_timer_resolution) {
        timer = NGX_TIMER_INFINITE;
        flags = 0;

    } else {
	/*如果没有使用timer_resolution,那么将调用ngx_event_find_timer()方法,获取最近一个将要
	触发的时间距离现在有多少毫秒,然后把这个值赋予timer参数,告诉ngx_process_change方法在
	检测事件时如果没有任何事件,最多等待timer毫秒就返回;将flag参数设置为UPDATE_TIME,告诉
	ngx_process_change方法更新换成的时间*/
        timer = ngx_event_find_timer();
        flags = NGX_UPDATE_TIME;

#if (NGX_THREADS)

        if (timer == NGX_TIMER_INFINITE || timer > 500) {
            timer = 500;
        }

#endif
    }
	 /*ngx_use_accept_mutex表示是否需要通过对accept加锁来解决惊群问题。
	 当nginx worker进程数>1时且配置
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值