1. simpleshm 系统设计

1.1. 概述

  • 在许多的web的应用中,cgi程序需要通过多种方式访问数据:
    1)直接访问本地/远端数据库;
    2)通过socket发送报文与远端服务程序通讯。
    在第二种方式中,一般的处理方式是:由cgi程序与远端服务器直接建立socket连接、交换数据、断开链接。而web请求的压力是非常巨大的,每次的远端数据请求都需要创建一次连接,造成了系统的无谓负载。这种与远端服务连接方式我们称之为“短连接”。造成这一问题的原因是cgi没有“持久性”,处理每次cgi的请求,必须fork出一个子进程,因此连接也就无法“持久”。 为了降低负载,使连接“持久”,我们需要一个高速的交换空间,cgi进程往这个共享池写入数据,并等待数据返回,而转发进程则读出共享池的数据,利用它的“持久性”连接(我们称之为“长连接”)与远端服务程序交换数据,并写回共享池;cgi进程从共享池中读入返回数据,继续进行后续处理。 两种通讯模式的进程、数据流向如下图所示:


    说明:上图为了简单起见,只画出了单个cgi程序和单个远端服务进程进行通信的情形,实际也表达了多cgi对多服务进程的概念。
    短连接:每次的数据请求(可能有几个往返)都需要建立新的连接。
    长连接:保持连接,传送多次大量的连接。

1.2. 特性需求

  • 考虑到web服务程序编程语言的多样性,应支持多种语言访问接口:c语言、python、php、perl(optional)。
  • 考虑到有多个“生产者”、多“消费者”都需要访问共享空间,所以应支持锁机制。
  • 为了方面程序的控制、对共享池中的数据提供多种访问方式。
    • 哈希:插入(insert)、读取(get)、删除(delete)
    • 队列:压入(push)、拉出(pull)
    • 栈:压入(push)、弹出(popup)
  • 提供共享空间管理功能:监控数据量、强制删除共享数据、口令控制(optional)。
  • 性能要求:需要满足同时800个cgi进程同时交换数据。

1.3. 系统结构

  • 静态结构


  • 动态结构


1.4. 讨论


-- samhoo [2004-08-17 18:06:22]