论文部分内容阅读
CDN的全称是Content Delivery Network,即内容分发网络。其目的是通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的网络"边缘",使用户可以就近取得所需的内容,从而解决Internet网络拥挤的状况,提高用户访问网站的响应速度。本文在北京市科委“基于IPv6的下一代互联网关键技术研发及产业化推动”项目课题“IPv6流媒体分发应用系统支持系统的开发”带动下,综合了其它内容发布模式的优点,提出了一种新的内容路由系统(Content Router),并对该系统进行了设计和实现,Content Router是在CDN系统中为用户提供内容定位和发布等功能的子系统。用户通过Content Router可以搜索定位资源,发布内容。Content Router对内容还要进行管理,删除过了期的内容。Content Router同时负责自己域的边缘服务器的管理和与DHT(分布式hash表服务)网络的交互。Content Router基于Linux平台,采用模块化的思想进行设计,针对系统高网络I/O的特点,采用Linux2.6内核的epoll机制进行网络事件交互,是一个单线程非阻塞的服务器。数据库的操作一般都是阻塞进行的,Mysql并不提供非阻塞的数据库操作接口。为了能够更好地进行数据库的操作,我们采用线程池的方式(类似于磁盘的异步I/O)实现对数据库的非阻塞操作。线程池是由许多个(个数可以配置)预先创建好的工作线程构成。这些工作线程都在一个请求队列上等待,当有新的请求加入队列时,工作线程就从请求队列中取出请求,然后根据请求的类型,执行相应的操作,操作完成后,将这个请求所对应的Task的地址写入到一个管道中,这个管道被epoll监听,epoll_wait会返回这个管道的描述符,主线程可以从这个管道中读出Task的地址,调用Task的状态机,执行相应的操作。由于多个线程共享请求队列,所以放请求到请求队列要加锁,为了能够非阻塞的加锁,CR采用尝试锁的方式(pthread_mutex_trylock),如果发现请求队列已被加锁,就把这个请求放到另一个备用队列中,访问备用队列无需加锁,因为备用队列只会被主线程访问。放请求时,当发现请求队列没有加锁,就先加锁,然后把新请求和备用队列中的所有请求都放到请求队列中。经过测试,该系统能够很好地完成搜索定位资源,发布内容,删除过了期的内容等功能,给中小型机构提供了一种比较实用的内容路由系统。