IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

标签:Event-driven

共 7 篇相关文章

IT 累计浏览 2,061

探究 Node.js 中的 drain 事件

这篇讲的是 Node.js 中一个容易被忽视的事件——`drain`,作者从自己频繁看到却不知其所以然的使用场景出发,带着“什么时候触发”和“能用来干嘛”的疑问,进行了一番探究。 核心发现直指 `socket.write` 的返回值与底层“高水位线”(`highWaterMark`,默认 16KB)的关系:只有当写入的数据量累积超过这个阈值,`write` 才会返回 `false`,并在缓冲区被清空后触发 `drain` 事件。这解释了为什么简单的数据写入或高并发但数据处理极快的场景下,事件往往不会出现。 作者通过传输大文件的 HTTP 服务器实验,成功复现了事件触发,并揭示了它的核心作用——**用于实现流量控制,避免内存无限增长**。最佳实践是:当 `write` 返回 `false` 时暂停读取或生产数据的流,在 `drain` 事件触发后恢复,从而根据消费速度反向调节生产速度。 文章最后通过内存监控数据的对比,直观地验证了这种流控制策略在防止内存泄漏方面的必要性和有效性。

IT 累计浏览 5,341

memcached 源码阅读笔记

这篇讲的是作者深入阅读 memcached 源码后梳理出的核心流程。作者从程序的入口函数 `main()` 出发,剖析了 memcached 如何基于 libevent 构建起高效的事件驱动模型。初始化过程涉及事件中心、内部数据结构、空闲连接池以及工作线程的创建与配置。 文章重点分析了 memcached 两种可配置的服务模式:UNIX 域套接字与 TCP/UDP。前者在本地通信中性能更优,后者则提供了更通用的网络接入能力。两者通过注册 `event_handler()` 回调来处理客户端连接。 在多线程协作方面,文章揭示了一个巧妙的设计:每个工作线程拥有独立的连接队列(CQ)和 libevent 事件中心,并通过创建读写管道进行线程唤醒。主线程通过 `dispatch_conn_new()` 将新连接分发到指定线程的队列,工作线程则监听管道事件,按需取出并执行任务。这种基于事件驱动和管道通信的线程调度机制,保证了高并发下的处理效率。 作者从全局到细节,清晰展现了 memcached 如何用简洁的 C 代码,借助 libevent 实现了一个高性能、多线程的网络服务框架。

IT 累计浏览 2,381

libev ev_io源码分析

这篇深入分析了libev事件库中负责I/O事件监听的ev_io组件。作者从项目实践中的疑问出发,首先梳理了libev的核心抽象:所有watcher的基类`ev_watcher`,以及统一管理所有watcher状态的`ev_loop`结构。 文章重点剖析了ev_io的实现机制。它解释了ev_io如何“继承”`ev_watcher_list`以实现链表管理,并与一个名为`ANFD`的结构(用于映射文件描述符与事件链表)协同工作。对ev_io最关键的几个操作——添加、执行回调和删除——进行了流程拆解。 例如,添加watcher时并非立即调用`epoll_ctl`,而是先记录到一个待处理队列中,在下次循环的`epoll_wait`前才批量修改内核事件,这是一个精巧的优化。唤醒与回调过程则展示了如何根据epoll返回的结果,从事件链表中找到匹配的watcher并触发其回调函数。 整体来看,这篇文章清晰地展示了libev如何用简洁的C结构实现高效的事件驱动模型,对于想理解事件循环底层机制,特别是I/O多路复用与应用层封装之间交互的开发者来说,提供了很好的实现视角。

IT 累计浏览 4,362

Redis源代码分析

这篇讲的是作者兑现承诺,从文件结构入手深度剖析Redis服务端源代码的硬核文章。作者没有直接钻进某段代码,而是先从宏观视角把Redis服务端所有源码文件铺开,逐一厘清它们各自承担的职责。这种从架构布局切入的写法,能让读者先建立起清晰的“地图”,再跟着作者深入实现细节。 Redis以高性能著称,其单线程模型、高效的网络协议处理与内存数据结构是关键。文章将带领读者跟随代码,看Redis如何巧妙地将事件驱动、非阻塞I/O等机制编织在一起,从而在单线程内实现高并发的命令处理。作者对每个文件核心逻辑的解读,旨在揭示Redis在工程实现上的精巧与克制,比如其简洁的协议解析和极致优化的内存管理。对于想超越表面使用、一窥Redis内部运作奥秘的开发者来说,这份逐文件的源码导读提供了一个扎实的起点。

IT 累计浏览 2,721

从同步到异步,从匿名到实名

这篇讲的是作者从完成一本正则表达式技术书稿后的反思出发,结合自己从1997年至今超过二十年的上网亲历,提出对网络发展的两个核心趋势观察。 文章并非技术分析,而是一篇带有个人史色彩的散记。作者指出,早期的互联网更像“同步”工具(如IRC、早期论坛),要求参与者同时在线;而如今则彻底转向“异步”(如微信、微博、播客),信息可以自由异时传递。第二个趋势则从“匿名”走向“实名”——早期网络社区的匿名文化,与如今需要绑定手机号、鼓励实名认证的主流平台形成鲜明对比。 作者认为,这两个转变深刻地重塑了网络的气质、交流方式乃至社会结构。这篇文章的价值在于,它用具体而微的个人体验串联起技术变迁的大历史,为我们理解当下数字生活提供了一个清晰而感性的坐标系。

IT 累计浏览 5,041

Nginx源码分析-Epoll模块

作者从Nginx在Linux平台高并发服务的基石——epoll模块切入,探讨的不是epoll原理,而是Nginx如何围绕它构建自己的事件驱动模型。这篇分析没有停留在函数调用层面,而是清晰地梳理了Nginx对epoll的封装与使用哲学。 文章的核心,是顺着Nginx的事件循环主轴,剖析其事件结构体如何承载连接信息、每个工作进程如何管理自己的epoll实例,以及一次请求的生命周期如何在epoll的“收”与“发”之间流转。特别值得关注的是,文中详细拆解了Nginx如何通过“惊群”问题的处理机制,确保了多个Worker进程能高效协作而不互相冲突。 这种自顶向下、聚焦于实现细节的剖析方式,让我们看到一个高性能服务器的设计并非魔法,而是将操作系统的异步IO能力,通过清晰的数据结构和精巧的流程控制,发挥到极致的艺术。理解了Nginx对epoll的这种“用法”,也就抓住了其处理海量并发连接的心脏。

IT 累计浏览 1,941

Nginx事件驱动的初始化

这篇讲的是Nginx如何通过事件驱动实现其标志性的高性能,作者直接从src/event目录的源码入手,深入剖析了事件驱动的初始化过程。文章指出,事件驱动是Nginx的核心架构,初始化主要由三步组成,并通过图示清晰展示了从模块加载到事件循环启动的完整流程,帮助读者理解底层逻辑。 在实现细节上,初始化过程巧妙地将事件注册、连接池管理和操作系统I/O模型(如epoll或kqueue)结合起来。第一步设置事件模块,第二步创建文件描述符池,第三步启动非阻塞事件循环,确保每个并发连接都能高效处理。这种设计让Nginx能以极低的资源消耗支撑数万并发请求,文章通过代码片段和流程图揭示了这些步骤如何协同工作,避免了传统阻塞模型的性能瓶颈。 对于关注服务器性能优化的开发者,这篇文章提供了从源码角度审视事件驱动机制的视角,展示了如何通过精巧的初始化设计提升整体吞吐量。