基于Erlang/OTP和Django的WEB实时会话系统的设计与实现

2016-05-19 10:50纪培培何顶新
电脑知识与技术 2016年8期

纪培培+何顶新

摘要:该文设计与实现了一种符合C/S模型的WEB实时会话系统,使用Django框架实现客户端,Erlang/OTP框架实现具有分布式高并发性能特性的会话服务端,应用Comet技术在减少网络消耗的同时确保会话的实时性。

关键词:Django;Erlang/OTP;Comet;实时会话

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2016)08-0119-02

1 需求分析

随着生活节奏的加快,人们对于各类WEB应用的实时性要求也越来越高。实时通讯作为现代人生活中不可缺少的一部分,在各类社交系统中都会有所涉及,例如大型社交互动类网络游戏、大型社区服务网络系统。笔者结合C/S结构,设计实现了基于Erlang/OTP框架与django框架的实时会话系统,可以满足上述大型服务系统中的实时通讯需求。

2 关键技术简介

2.1 Erlang/OTP框架

Erlang语言是函数式编程语言,也是面向并发的通用编程语言,引人注目的FaceBook聊天系统就是使用Erlang语言开发,验证了Erlang语言在大规模并发活动中的优势。Erlang/OTP框架可以简化Erlang应用的开发,使开发者能更加专注于产品本身的功能实现,短期内可交付产品级的应用。在本次实时会话系统中用于实时会话系统的服务器端实现,负责并发处理大量的客户端请求,以及海量用户实时会话信息的管理。

2.2 Django框架

Django是基于Python语言的WEB应用框架,采用了MVC的设计模式,即模型、视图和控制模型,其中控制部分由框架负责,开发者只需要关注模型、模板和视图部分,也可以称为MTV模型。Django的设计宗旨是能够简便、快速的开发数据库驱动的网站,同时注重于代码的复用,提升开发效率。在本次实时会话系统中用于实时会话系统的客户端实现,负责与系统服务器交互,发送和接收用户信息,并通过WEB页面直观展现给用户。

2.3 Comet通讯技术

Comet是一种WEB应用架构,应用该架构可以将客户端请求保存在服务器端并能保持较长时间,直到预期的事件发生或者超时。一个请求周期结束后,又会立即发出下一个请求。在本次实时会话系统中使用Comet长轮询通讯技术来实现“服务器推”功能,客户端发出请求后,请求保持在服务器端,直到有用户实时消息到达或者等待超时事件发生时,将响应推送给相应客户端。

3 系统设计与实现

3.1 系统整体设计

本次实时会话系统整体设计如图1、图2所示:

图1所示为实时会话系统的功能展示,从功能上来讲,整个系统分为两大部分,分别为好友管理和会话信息管理,好友管理包括好友查看,增删好友以及查找用户功能;会话信息管理包括上线时的未读信息反馈、给好友发送信息以及实时会话的动态展示功能。

图2所示为本次系统实现中较为复杂的会话信息管理部分功能,在实时会话部分,获取当前用户的未读信息,采用了Comet的长轮询通讯技术来减少通讯资源消耗,并且可以保证会话的实时性。

3.2 服务器端的设计与实现

实时会话系统服务器端应用Erlang/OTP框架搭建,主要包括网关接口服、信息管理服、缓存服和数据库服,各个子服相互独立,可分布式部署在不同的物理机上,通过RPC远程过程调用方式实现相互访问。其中信息管理服涉及服务器端最重要的逻辑——实时获取用户未读信息。

3.2.1 网关接口服

网关接口服负责请求的接收与响应,当接收到用户请求时,解析相应的数据并传递给信息管理服。在应用长轮询来实现请求未读信息功能中,设置请求保持为4分钟。即若四分钟内,信息管理服有信息返回则返回请求成功的信息;若4分钟后未收到信息管理服的信息,则视为请求超时,返回相应的超时信息,结束本次请求。

3.2.2 信息管理服

信息管理服包括了整个系统的业务逻辑,首先,需要与数据库服进行交互,处理好友管理相关功能;其次,需要与缓存服进行交互,处理实时信息收发相关功能。下面将复杂的实时信息处理部分进行解析:

1) 用户发送信息

远程同步调用缓存服,将该用户发送的信息存储在缓存中。

2) 获取用户未读信息

长轮询中,设置请求保持时间为4分钟,即在请求获取用户未读信息时最多可以等待4分钟。每一次有一个用户请求到来时,开辟两个进程P1和P2。P1一方面用于间隔3秒轮询访问缓存服,如果有信息则通过消息将信息传递给P2,同时结束轮询;另一方面用于接收P2传送过来的终止轮询或超时信息,同时结束轮询。P2用于控制4分钟的请求时间,若4分钟之内接收到P1传来的数据,则将信息返回给网关服;若4分钟之内没有收到P1传来的数据,则表示超时,在给P1发送终止轮询的消息的同时将超时信息反馈给网关服。

3.2.3 缓存服

缓存服的设计主要是为了减少获取数据的响应时间,提升用户体验。本次实时会话系统的缓存服主要实现如下几个功能:

1) 缓存当日所有用户已读信息

2) 缓存当日所有用户未读信息并提供获取未读信息的接口

3) 每日凌晨系统维护期间,将缓存中的所有未读和已读信息增量补偿到数据库

其中功能(2)中提供获取未读信息的接口,用户发送的信息会先被存储到缓存服未读信息表中,当对应的用户来获取到了该信息后,首先将该信息存入已读信息表中,再从未读信息表中删除该信息。功能(3)中在凌晨将缓存中的昨日用户信息增量补偿到数据库中,一来可以减轻缓存负担,二来可以保证用户信息的永久性。

3.2.4 数据库服

数据库服主要用于提供数据库相关操作接口,在本次系统中,主要实现的功能有:

1) 好友信息表的维护,包括提供数据库的好友信息的增删查改接口和用户查找接口。

2) 会话信息表的维护,包括提供历史未读信息表的管理和每日流水已读信息表的动态管理接口。

其中在会话信息表的维护中,由于历史未读信息从总量上来讲比每日已读信息要少很多,并且会动态增加与减少,所以为了减少管理的难度和查询所需的时间,设计了10张表,按照未读信息用户的id将信息映射到对应的表中;而每日已读信息是与日俱增的,并且总量相对大,为了便于管理和查看,采用每日动态建表的方式将每日已读信息存入对应日期的表中。

3.3 客户端的设计与实现

实时会话系统客户端采用基于Python语言的Django框架设计实现。用户完成登录认证后,首先会获取用户的好友列表,在会话页面,一方面可以给好友发送信息,另一方面应用jQuery库Ajax技术来实现轮询,查看当前用户是否有未读信息。使用Ajax可以在不需要重新载入整个网页的情况下,动态更改网页局部的内容,这点非常适合于会话内容的动态更新。

其中,在请求当前用户未读信息,客户端对会话服务器进行HTTP访问时,应用长轮询技术,即客户端发出请求后保持请求为4分钟,如果4分钟内可以收到服务器返回的信息,则将信息交给页面展示,如果4分钟后服务器没有反馈,则放弃本次请求,开启下一次长轮询请求。由此,可以确保用户信息的动态实时显示。

4 结语

本文介绍的实时会话系统,使用Erlang/OTP框架来实现服务端,在实时会话功能的同时,比一般会话服务器具有更强的多并发能力,响应更迅速;使用Django框架来实现客户端,结合Ajax长轮询技术,可以确保当前用户与好友进行实时会话。设计实现的系统用户体验良好。

参考文献:

[1] 张琴.基于HTTP长连接的WEB实时通信技术的研究[D].电子科技大学,2014:8-10.

[2] 昊亚峰.李志昕.索依娜.用Ajax+Comet 轻松实现实时WEB聊天系统[J].电脑编程技巧与维护,2010,24(4):