2013年6月22日星期六

大文件上传解决方案

    传统的HTML方式已经难已满足超大文件的上传。别说是100MB,50MB对服务器来说都是非常大的,服务不仅要专门开一个链接等待这个文件上传完毕,还要分配同等大小的内存来保存这个文件对服务器来讲压力相当的大。

    在实际网络环境中一般10MB左右的文件都需要借助于控件来实现。一方面是因为国内的网络环境不太稳定,另一方面是从服务器的负载方面考虑。

    像QQ邮箱中的超大附件上传功能,115网盘中的超大附件上传控件,华为网盘(DBank),金山快盘他们都是使用控件来实现超大文件上传功能的。

    他们通过控件将一个大文件,比如1G划分成许多的小块,每一小块大约是128KB,然后循环上传,直到上传完。

    服务器端每接受一小块,相当于接受到一个单独的文件,会直接写入硬盘里。最后,把接受的所有文件给组合起来。

    这样做的优点就是减轻了服务端的压力,提高了服务端的负载能力,使得服务端能够处理的用户请求数多了。

jQuery File Upload 是一个Jquery图片上传组件,支持多文件上传、取消、删除和断点续传,上传前缩略图预览、列表显示图片大小,支持上传进度条显示;支持各种动态语言开发的服务器端。

2013年6月13日星期四

多台服务器实现Session的共享

    我们知道,Session是针对HTTP协议的局限性而提出的一种保持客户端和服务器间保持会话连接状态的机制。
    访问网站的来客会被分配一个唯一的标识符,即所谓的会话 ID。它要么存放在客户端的 cookie,要么经由 URL 传递。
    Session 的存储方式默认是以文件的形式存放在本地的一个硬盘目录中,所以当Session比较多时,磁盘读取文件会比较慢。还有一点就是对于大站点,它无法实现多台服务器会话的共享。
    一个解决方案是用数据库来存取 Session ,就能在不同服务器之间共享 session 信息了。
    实现代码下载
    引擎 MyISAM 最好替换成 MEMORY 引擎,因为 MEMORY 采用内存表,所有数据存储在内存,操作速度快,对于 Session 这种形式的数据正好适用。
    在大流量的网站中,session 入库存在效率不高、占据数据库 connection 资源等问题。针对这种情况,可以使用 Memcached、Redis 等 Key-Value 数据存储方案实现高并发、大流量的 Session 存储。