- 论坛徽章:
- 4
|
看样你还是没有理解我的描述...我的架构就是完全异步通知的, 否则也没必要拿出来说.
这是nginx以及lighttpd的原原本本的实现, 我一点也不吹, 都是自己看开源代码积累下来的认识, 只是让同学们直接去读nginx/lighttpd会让同学们脱离了架构本身, 需要掌握太多了其他东西才能读得下来.
这么简单说吧, 接受到一个请求, 开始应答, 需要对socket注册write事件保持触发以便轮询检测plugin是否完成, 那么开始应答的时候要把一个task丢到队列里传递给线程, 线程里监听pipe事件读队列取task处理完成后, 向另一个pipe写1字节把task丢到另一个队列里, 这样应答就回到了主线程了(plugin在启动时刻注册了一个pipe在libevent上监听), 主线程检测到pipe, 就从另一个队列里取出一个task, 将task里引用的client的plugin的状态设置为OK就可以了. 接下来, socket的write事件触发时, 检测到plugin的状态已经OK了, 就继续调下一个plugin了.
是这样的, 整个libevent多监听了一个pipe[0], 线程里监听另一个pipe[0], 两个队列, 一个送请求, 一个送应答, 请求和应答是一个引用了对应client的task, 最终由libevent监听的pipe[0]的event callback取出task应答, 设置task->client->plugin-data->status = OK, 最终由socket本身的event callback中检查Plugin status=OK而完成. |
|