通过第三方IM系统,改造私信功能

date: 2016-04-08 10:05:55
tags: 私信 环信 Im系统 聊天

一 项目背景

不论是SNS社交系统,还是电商网站,私信都是必不可少的一项功能。一般私信对实时性要求并不高,在web端通常的做法是通过定时任务,定时从服务端读取私信消息。这样的开发模式优点是开发比较简单,缺点也显而易见,当用户量上来的时候,对服务器造成的压力也会很大。因此我通过第三方的IM系统对私信进行改造,上一篇博文中已经详细做了第三方Im系统的调用报告,最终选用环信。

二 技术方案

这套方案是针对webIm的改造,首先带着几个问题来思考。

1.系统需要实现哪些私信功能? 答:点对点发送文字,图片,附件,语音。支持web,android,ios互通。
2.接收到消息以后怎么处理? 答:接收到消息后,把内容append到聊天框。
3.如何发送图片,附件? 答:自定义消息,扩展消息体ext,增加图片字段img,附件字段attach。 具体做法是,先把图片或者附件上传到本系统的文件服务器,上传成功以后,获取图片或者附件的url,把url作为消息内容添加到ext中。格式如下:ext:{img:[“XXX”,”xxx”]}, attach:[“XXX”,”xxx”]}。 对方收到消息后,通过type字段判断消息类型,解析ext字段,获取对应的图片或者附件的url,然后从文件服务器下载图片,并把本条接收到的图片消息append当前私信聊天框。
4.私信对话框中的好友栏如何显示? 答:系统设定,只要不在对方黑名单中,都可以发起私信聊天,因此我这边的好友栏概念有别于QQ之类的好友栏。 好友栏中展示的逻辑是:和我发生过聊天关系的任何user,刚刚新私信我的user,通过搜索栏查找匹配到的user list。
5.怎么在环形的用户体系中保存本系统的用户? 答:把本系统的uid和password对应环形的username和password。确保username唯一。
6.如何确保在选中好友后,准确无误的发送给正确的用户? 答:每个好友都有对应的uid,这个uid即为环形用户体系中的username,确保了他们的一一对应关系。
7.新消息提醒如何处理? 答:每次接收到新消息后,判断消息的发送者,是否是和我当前正在聊天的用户,如果不是则给对应的用户的未读消息数增加一。具体的实现方式可以用localstorage来存储未读消息数,通过本地存储可以解决网页刷新后未读消息数置0的问题。这里有几个问题要强调,第一要明确这个未读消息属于谁? 以user为单位存储数据,可以避免不同用户登录的情况下,数据串联的问题。第二要明确存储什么数据,要做到尽量精简。我设计的数据格式为:
test_uid:{total:”XXX”, userlist: [{user1:”XXX”},{user2:”xxx”},{user3:”xxx”}]}
8.环形自带表情解析功能,那么是可以定制自己的表情呢? 答:这个很简单,替换他们的表情图片即可。
9.如何获取历史聊天记录? 答:这个问题要分两部分,第一:环形提供了消息实时回调,但是收费,我用的是免费的查询历史记录的接口,但是有流量显示,每个ip一秒钟请求一次。因此我可以在后头开启定时任务,每个1.5秒请求一次,将获取的到历史聊天记录解析后保存到数据库中。第二:当我发起和某个好友的聊天后,首先请求获取和该好友的聊天记录,后面和好友的聊天内容都是通过客户端主动append到对话框的。这种方式会遇到的一个问题是要确保:聊天框中显示的消息=当前聊天过程中收到的消息+获取的历史聊天记录。 要确保数据的一致性,唯一性,完整性。
10.在某些网络情况下如开启vpn代理,websocket连接失败。 答:把ws协议切换成wss协议,具体原理我也不懂,有待研究。

  1. 发送图片,附件的方案
  2. web端 未读新消息解决方案
  3. websocket链接 wss和ws的区别, vpn模式下,要用wss
  4. 表情处理,自定义