网络基础:3. Reactor的应用场景

Reactor

1. reactor为什么搭配非阻塞IO?

  1. 多线程环境将一个listenfd放到多个epoll去处理
  2. 边缘触发的情况下,读事件触发时,read在一次事件循环中把read buffer读空
  3. select有bug,当一个数据到达时,select将会报告读事件;但是可能这个数据没有通过校验和检测所以丢弃了,而select已经上报读事件了,如果此时用阻塞的io read去读将会阻塞线程

2. IO多路复用一定要搭配非阻塞IO吗?

不是

  1. 以MySQL为例,select接收连接,每条连接是一个线程
  2. libevent是加一个系统调用,查看缓冲区有多少数据,但是效率比较低

Redis

1. Redis是什么?

Redis是一种基于内存的键值对存储数据库,可以用作缓存、消息队列和数据存储。它支持多种数据结构(如字符串、哈希表、列表、集合和有序集合),提供了丰富的命令操作,并具有高效的读写性能和可靠性。Redis还支持主从复制、持久化和集群等特性,使其成为一个流行的开源数据库解决方案。

2. Redis为什么使用单Reactor?

  1. 单线程业务逻辑
  2. 操作具体命令的时候,时间复杂度比较低

3. Redis针对Reactor做了哪些优化?

  1. Redis采用了多线程模型,将网络I/O和命令执行分离到不同的线程中,使得Redis可以同时处理多个客户端请求。
  2. Redis在网络I/O方面采用了epoll等高效的事件驱动机制,能够快速响应大量并发请求。
  3. Redis使用了一些基于异步I/O的技术,如AOF重写和RDB持久化操作,可以在不影响主线程性能的情况下完成磁盘操作。
  4. Redis实现了自己的消息通信机制,并且通过优化网络数据包结构、压缩数据等方式来提高消息传输效率。
  5. Redis采用了零拷贝技术,减少了数据复制的开销,提高了网络I/O性能。

Memcached

1. Memcached是什么?

Memcached是一种高性能、分布式内存对象缓存系统,常用于加速动态Web应用程序和减轻数据库负载。Memcached可以将数据存储在内存中,从而避免了每次访问数据库的开销。它支持多种编程语言和操作系统,并且具有可扩展性和高可用性。

2. Memcached为什么使用多Reactor?

  1. kv数据操作简单
  2. 可以高并发处理业务

Memcached使用多Reactor主要是为了提高系统的并发处理能力和吞吐量。Memcached是一个高性能的分布式内存对象缓存系统,它需要处理大量的客户端请求,并且需要快速地响应这些请求。采用多Reactor可以将请求分散到不同的线程中进行处理,增加服务器的吞吐量;同时,多Reactor可以充分利用多核CPU的优势,提高系统的并发处理能力。另外,多Reactor还可以保证Memcached对于来自不同客户端的请求均等地进行处理,避免因为某一客户端请求过多而导致其他客户端请求被阻塞的情况。

Nginx

1. Nginx的特点?

  1. 反向代理
  2. 多进程处理业务

Nginx是一个高性能、开源的Web服务器和反向代理服务器。它可以作为HTTP服务器、SMTP服务器以及TCP/UDP代理服务器,支持多种不同的应用程序平台和语言,并且具有高并发、低内存消耗等优点,在Web服务器中被广泛使用。

2. Nginx为什么要使用多进程?

  1. 业务类型复杂
  2. 通过进程隔离运行可以避免加锁
  3. 请求之间比较独立

Nginx使用多进程的主要原因是为了提高服务器的性能和并发能力。Nginx采用Master/Worker模型,Master进程负责管理Worker进程,而Worker进程处理客户端请求。

当一个客户端连接到Nginx时,Master进程会将这个连接分配给某个Worker进程来处理,如果这个Worker进程正在处理其他请求,则可以同时处理多个请求,从而提高了并发能力。同时,每个Worker进程都是独立的,互相之间不会影响,故而在Worker进程出现问题时,Master进程可以快速重新启动一个新的Worker进程,保证了服务器的稳定性和可靠性。

此外,Nginx还使用事件驱动模型,即基于事件回调的方式来处理请求,避免了线程上下文切换导致的性能损耗,也是Nginx高性能的重要原因之一。

3. Nginx怎么处理Reactor?

  1. 通过锁在用户态解决惊群,目的是为了在用户层处理连接的负载均衡
  2. 进程到达7/8*connections的时候,不再处理连接,让其他进程处理连接
  3. 当所有进程都达到7/8*connections的时候,连接处理将变得缓慢

Nginx使用Reactor模式来处理并发连接。在这个模式下,Nginx将所有的IO操作都交给一个单独的线程(或者进程),称为“主进程”。当有新的连接请求到达时,这些请求会被放置在一个队列中,并且主进程会周期性地检查这个队列,以便进行处理。

当主进程检测到一个新的连接请求时,它会创建一个称为“worker”的子进程,该子进程会处理实际的请求。由于Reactor模式是基于事件驱动的,worker进程会等待事件发生,而不是轮询文件描述符来检查是否有数据可用。当事件发生时,worker进程会触发相应的回调函数来处理事件。

通过使用Reactor模式,Nginx可以高效地管理大量的并发连接,而不会出现资源竞争或阻塞的情况。此外,由于Nginx的架构非常模块化,因此可以轻松地添加新的功能和扩展。

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:

Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习

你可能感兴趣的:(网络,数据库,memcached)