2016-06-17

一个简单的聊天或者私信系统设计

Views: 17071 | 1 Comment

不少网站都会内置聊天或者私信系统, 为了方便更多人, 现将一个最简单的聊天系统的接口设计放在这里, 这是一个基于 HTTP 的聊天系统设计.

首先是视图设计:

# view:

msg/unread
	(全局)未读消息列表
chat
	一对一聊天窗口
chat/history
	我的聊天记录(按人组织)列表

接着是数据接口设计:

# ajax:

msg/unread/get
	获取(全局)未读消息列表
	@last_msg_id: 获取比此消息更晚的未读消息, 不包含该条消息.
chat/get
	获取一对一聊天记录
	@user_id: (msg_id, user_id 必须传一个)聊天者
	@msg_id: (msg_id, user_id 必须传一个)根据此消息, 可得到聊天者, 并可在显示聊天记录时定位到对应的消息
chat/get_new
	@user_id: 聊天者
	@last_msg_id: 获取比此消息更晚的消息, 不包含该条消息.
chat/send
	发送消息
chat/history/get
	我的聊天记录(按人组织)列表

其中, 带有 last_msg_id 参数的接口, 可用于轮询获取新消息, 以便在缺少推送机制(PUSH)时提供一种替代方案. 大多数情况下, 10秒一次的刷新频率能达到"实时聊天"的效果.

当有推送机制时, 如采用 iComet, 推送机制只推送通知(notify), 实际的消息内容仍然通过带 last_msg_id 的接口获取. 也就是说, 把固定刷新频率, 改为受通知时刷新(PUSH + PULL 结合).

另外, 消息的持久化可以使用 MySQL 数据库, 但更推荐 SSDB NoSQL 数据库, 可以 SSDB 能存储超过十亿条的聊天历史记录并能快速查询.

基于 SSDB + iComet 的聊天系统 demo: https://github.com/ideawu/icomet-demos

Related posts:

  1. 热烈庆祝icomet成为oschina推荐项目!
  2. HTTP 长连接技术 Comet
  3. 为什么iComet比nginx-push-stream-module更好?
  4. iComet 的一个应用场景
Posted by ideawu at 2016-06-17 17:51:27

One Response to "一个简单的聊天或者私信系统设计"

Leave a Comment