• 同步过程

  • 异步过程

  • 客户端 I/O和 Linux进程解耦

  • 解耦客户端I/O和Linux进程意味着让这两个过程能够相互独立运行和扩展,不会相互依赖或阻塞彼此的执行。这种解耦可以提高系统的可伸缩性、稳定性和可维护性。

    1
    AWS Lambda

快速组件和慢速组件

在实践世界中,并发问题来自于一个应用或系统的每个组件运行速度不一样:内存访问快,磁盘访问慢,本地网络快,远程网络慢,CPU快,但 I/O 慢

在一个系统中,我们经常会遇到慢速组件和快速组件,例如数据库、文件系统、缓存、网络API等。理解两者之间的关系以及如何处理并发问题,在优化系统性能和可扩展性方面起着重要作用。

并发问题:并发是指在一个时间段内,独立执行多个任务的过程。在一个多线程或异步环境下,并发问题通常会涉及资源共享、任务调度和优先级等的处理。为了防止资源争用(是单个资源在同一时间由多个任务使用造成的问题),文件损坏和性能瓶颈,需要为系统设计合适的并发策略。

快速组件:快速组件相对便捷地完成其工作,通常是基于内存的操作,如缓存(如Redis)或提供快速服务的API。这些组件响应速度快,具有低延时,因此在处理并发任务时,通常不会成为性能瓶颈。

慢速组件:相比之下,慢速组件较为缓慢地执行任务,如磁盘I/O操作(如文件系统和数据库操作)和缓慢的网络服务等。这类组件的响应速度相对较慢,可能会在高并发场景下出现性能瓶颈。

快速组件与慢速组件之间的关系:在整个系统中,快速组件和慢速组件需要协同工作。一个请求可能需要从快速组件(如缓存)获取数据,然后从慢速组件(如数据库)获取更多数据。为了确保性能和可扩展性,系统设计者需要确定这些组件如何协同工作。

解决并发问题的策略:

  1. 避免不必要的全局锁,锁会限制资源,降低系统性能。尽量采用异步I/O,避免阻止事件循环。

  2. 在构建仅依赖快速组件的服务时,请确保足够的资源应对高并发的请求。

  3. 选择适当的空间复杂度和时间复杂度算法,以及数据结构以优化对快速和慢速组件的使用。

  4. 使用缓存和消息队列等技术来缓解慢速组件的性能瓶颈。

  5. 在代码层面上控制并发,使用连接池来复用数据库连接。

  6. 实现负载均衡、分片等方案以分散资源压力。

https://research.google/people/jeff/

并发模型

并发编程模型

Erlang中的 Actors模型
Golang中的 Communicating Sequential Processes (CSP)
Clojure 中的 So Transactional Memory (STM)
Ruby 3 中的 Guilds

Actors 和 CSP - 不通过共享内存进行通信,而是通过通信共享内存
Actors 和 CSP 有一些区别:CSP 中的进程是匿名的,而 actors 是有标识 的;CSP中的 Channel是有标识的,但在 actors的系统中没有标识; actors 也可以异步发送数据,但 CSP 中的进程却不能。

STM - 使用共享内存但不使用锁的模型