时间:2022-08-27 22:37:40 | 浏览:794
本文将会给大家介绍如何开发一个简单的即时通讯系统(IM)。
我们的站点加一个即时通讯(IM)的功能,那么我们怎么做?
在回家的路上,问了同是实习生(网络方向)的舍友这样一个问题,他回答:“很简单,只需要在服务端保存一个list,收到一个人的message后,我转发给list中指定的另一个人就好啦”
接着,我们讨论了一晚上下面的几个问题
最后讨论的结果是:开发一个稳定高效的IM产品是相对困难的,上面这些难题,QQ、微信等产品都遇到过。而且IM产品一旦量达到一定程度,性能、稳定性、可用性等的挑战会越来越大,开发维护都十分困难,需要不断的打磨锤炼,才能保证是一个可靠稳定的IM产品。
同样是一个IM的小白,在看到 tableStore产品的 timeline模型后,只花了一个下午的时间,就理解了IM和做出一个可使用的demo。
Timeline 模型是 TableStore 团队针对消息数据场景所新创的一个数据模型,它的特色在于能够满足消息数据场景对消息保序、海量消息存储、实时同步的特殊需求。目前 Timeline 模型主要能够解决以下场景的需求:
具体的文章可以参考:
接下来我们来完成这样的一个即时通讯产品的demo。正因为是一个demo,我们关注核心功能,所以在设计和其他功能上都会从简,方便大家理解和阅读。
1. 设计功能
2. 表结构
目前版本的 timeline 只解决消息存储和同步问题,其他元数据相关的表还是需要我们自己来完成的。下面所有的表都使用tableStore 这款NoSQL分布式数据库进行存储,存储量和并发不用担心。
1.User 表
主要包含用户相关的信息。虽然大部分信息在demo中并没有使用。
private String userName; //用户名,为了简化,我们使用userName作为id,在tablestore中作为pk
private int age; //年龄
private String gender; //性别
private String sign; //个性签名
2.Group 表
主要包括群组的信息。demo中实际上我们仅仅使用了 groupName
private String groupName; //群名,为了简化,我们使用groupName作为id,在tablestore中作为pk
private String groupType; //群标签,群类别
private String groupDescription; //群描述
3.groupUser 表
主要记录了一个群中包含哪些群成员,这样当收到一条群消息就知道了同步给哪些成员。在 tablestore中这样设计。
主键(pk)类型
groupNameStringuserNameString
3. 工程结构
工程采用springboot做的后端框架,前端用了vue.js用来简单展示数据,具体代码附件中。
4. 核心代码逻辑
工程上其实主要在使用框架(springboot、vue.js),这里就不在一一列举,下面主要介绍timeline相关的一些使用。而这些核心代码在官方的github仓库(
https://github.comliyun/tablestore-timeline)的测试用例里也有样例代码,不仅仅有IM相关的,还有朋友圈、微博这种feed流场景的样例代码,而我作为一个使用者只需要拿过来直接用就好啦,十分方便!
4.1 给指定好友发送消息
/**
* 发送个人消息
*/
public void sendPersonalMessage(String userNameFrom, String userNameTo, IMessage message) {
//创建发送方的timeline
Timeline sender = new Timeline(userNameFrom, store);
//存储消息:发送者存到自己的发件箱
sender.store(message);
//创建接收者的timeline
Timeline receiver = new Timeline(userNameTo, sync);
//同步消息:存到接收者的收件箱
receiver.store(message);
logger.debug("【" + userNameFrom + "】send Message to 【" + userNameTo + "】");
}
4.2 群发消息
/**
* 发送群组消息
*/
public void sendGroupMessage(String groupName, IMessage message) {
//获取该群组所有的人员列表
List<String> groupMembers = userAndGroupService.listGroupMembers(groupName);
logger.debug("Begin send Message to " + groupMembers.size() + " members");
//存储消息:存到自己的发件箱
Timeline sender = new Timeline(groupName, store);
sender.store(message);
//同步消息:给群里的所有人发一份,
for (String user : groupMembers) {
Timeline receiver = new Timeline(user, sync);
receiver.store(message);
}
logger.debug("End send Message to " + groupMembers.size() + " members");
}
4.3 元数据、消息内容搜索
IM产品经常需要搜索数据,其中主要包括:
这些功能将会在上线 TableStore 2.0的SearchIndex功能后一起发布,届时Timeline模型将原生支持强大的搜索能力,满足开发者不同的需求。
大家可以尝试自己运行一下代码,很简单的几个步骤就把系统运行起来了。
1. 开通服务(免费)
tablestore有足够多的免费额度,可以做很多事情。我们去官网
https://www.aliyun.com/product/ots 开通实例,通过控制台创建一个实例
2. 获取AK
阿里云所有的服务几乎都是通过AccessKeyID 和AccessKeySecret来做鉴权的。我们点击用户的如下按钮,按照提示获取一个AccessKeyID 和AccessKeySecret。
3. 运行代码
在2022成都车展上,几何品牌旗下全新车型几何G6正式亮相,新车采用全新设计风格,并搭载Harmony(鸿蒙)OS系统,今天就带大家来看看它的静态表现如何。几何G6采用了全新的设计风格,相比目前在售的几何A有了明显的不同,整体细节更丰富且精
全球操作系统格局众所周知,移动操作系统主要分为苹果公司推出的iOS和谷歌推出的Android,其中苹果公司自研的iOS是一款闭源操作系统主要搭载自家的iPhone产品,这也给谷歌的Android系统创造了机会。安卓系统是谷歌推出的开源系统,
刘文豪 摄今年以来,河北秦皇岛开发区实施“重点项目建设提质提效”行动,推动一批产业项目、基础设施项目、工业技改项目、城乡建设项目尽早落地建设,确保重点项目早。↑9月7日,秦皇岛开发区一家在建的汽车零部件研发制造基地项目即将完工(无人机照片)。