即时通讯(Instant Messaging,简称IM)是一个实时通信系统,允许两人或多人使用网络实时的传递文字消息、文件、语音与视频交流。实现方式有两种。第一种基于Server转发的,Client双方通信会经过Server转发来完成消息传递。例如QQ、微信。
第二种是基于P2P(点对点)的。P2P的实现依赖于客户端之间的互联,但由于NAT与防火墙的存在,客户端无法直接互联,需要coturn服务器用来穿越NAT网络。
本文主要讲述基于Server转发实现的即时通讯原理和实现过程,包括私聊和群聊两类。私聊和群聊,原理基本类似,但私聊是单次转发,群聊属于遍历转发。不同点为,群聊以群ID(多人)划分,私聊以会话ID(两人)划分,其次消息存储上也有较大差异。
接入层的目的:1保证IM服务的可靠性,避免用户同时集中在同一聊天服务器中。2当聊天服务器压力过大时,能实现扩容。接入层可采用ngx_lua实现,保证性能。
连接逻辑比较简单,Socket connect的过程。
上一步连接成功后,用户触发进群(聊天窗口)操作,订阅该群消息。订阅消息用来保证,用户通过socket实时接收到该群其他用户发送的消息。否则,服务端会采用推送完成消息转发。
用户完成订阅群ID(群聊)或者订阅会话ID(私聊)后,可主动发送消息到该订阅ID(群ID和会话ID)中。
用户退出聊天窗口,触发disconnect事件。服务端关闭socket句柄,标示用户下线。
广播逻辑,主要用在运营管理上。是对所有在线用户或者特定群ID(会话ID),发送消息(系统消息)。实现方法为:遍历所有在线socket句柄,发送内容。
在运营管理或者监控上,需要对聊天服务性能加以判定。
希望转载的朋友能够尊重作者的劳动成果,加上转载地址。谢谢! http://gglinux.com/2017/04/15/IM_design/
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。