不少网站都会内置聊天或者私信系统, 为了方便更多人, 现将一个最简单的聊天系统的接口设计放在这里, 这是一个基于 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_unread @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