手把手教你开发简单的即时通讯系统(IM)

本文将会给大家介绍如何开发一个简单的即时通讯系统(IM)。

为什么不简单

我们的站点加一个即时通讯(IM)的功能,那么我们怎么做?

在回家的路上,问了同是实习生(网络方向)的舍友这样一个问题,他回答:“很简单,只需要在服务端保存一个list,收到一个人的message后,我转发给list中指定的另一个人就好啦”

接着,我们讨论了一晚上下面的几个问题

  1. 对方不在线怎么办?
  2. 内存里保存list的话,人多了怎么办?
  3. 怎么查看历史记录?怎么多端同步数据?
  4. 为什么微信用户只能建立有限个群,并且群聊功能很晚才开放?为什么微信好友数是有上线的?
  5. 怎么保证消息有序、不丢失数据?
  6. 如何保证消息的时效性?
  7. 如何承担高并发流量?

最后讨论的结果是:开发一个稳定高效的IM产品是相对困难的,上面这些难题,QQ、微信等产品都遇到过。而且IM产品一旦量达到一定程度,性能、稳定性、可用性等的挑战会越来越大,开发维护都十分困难,需要不断的打磨锤炼,才能保证是一个可靠稳定的IM产品。

为什么简单

同样是一个IM的小白,在看到 tableStore产品的 timeline模型后,只花了一个下午的时间,就理解了IM和做出一个可使用的demo。

Timeline 模型是 TableStore 团队针对消息数据场景所新创的一个数据模型,它的特色在于能够满足消息数据场景对消息保序、海量消息存储、实时同步的特殊需求。目前 Timeline 模型主要能够解决以下场景的需求:

  1. IM : 如钉钉、微信
  2. Feed流:如微博、朋友圈
  3. IOT消息下推:如天猫精灵
  4. 无限Topic的队列

具体的文章可以参考:

  • TableStore Timeline:轻松构建千万级IM和Feed流系统
  • TableStore数据模型 – WideColumn和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用来简单展示数据,具体代码附件中。

手把手教你开发简单的即时通讯系统(IM)

4. 核心代码逻辑

工程上其实主要在使用框架(springboot、vue.js),这里就不在一一列举,下面主要介绍timeline相关的一些使用。而这些核心代码在官方的github仓库(https://github.com/aliyun/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产品经常需要搜索数据,其中主要包括:

  1. 用户、群的元数据搜索
  2. 历史消息内容的搜索

这些功能将会在上线 TableStore 2.0的SearchIndex功能后一起发布,届时Timeline模型将原生支持强大的搜索能力,满足开发者不同的需求。

运行

大家可以尝试自己运行一下代码,很简单的几个步骤就把系统运行起来了。

1. 开通服务(免费)

tablestore有足够多的免费额度,可以做很多事情。我们去官网 https://www.aliyun.com/product/ots 开通实例,通过控制台创建一个实例

  1. endpoint : 自己的实例的网址,类似 https://xxxxxx.cn-hangzhou.ots.aliyuncs.com
  2. instanceName :自己的实例的名字,即上面网址的前缀

2. 获取AK

阿里云所有的服务几乎都是通过AccessKeyID 和AccessKeySecret来做鉴权的。我们点击用户的如下按钮,按照提示获取一个AccessKeyID 和AccessKeySecret。

手把手教你开发简单的即时通讯系统(IM)

3. 运行代码

  1. 下载指定分支代码
  2. 从附件中下载源码。
  3. 在源码中编译代码
  4. linux下 ./gradlew build
  5. windows下: gradlew.bat build
  6. 提示:网络不好时间可能会比较久,如果自己本机安装过gradle的话,也可以直接使用 gradle build 来进行编译
  7. 启动项目
  8. 其中xxxx相关的要换成自己的阿里云实际的配置。
  9. java -jar build/libs/im-demo.jar
  10. –aliyun.tablestore.endpoint=\”xxxxx\”
  11. –aliyun.tablestore.AccessKeyID=\”xxxxx\”
  12. –aliyun.tablestore.AccessKeySecret=\”xxxxx\”
  13. –aliyun.tablestore.instanceName=\”xxxxx\”
  14. 浏览器访问 http://localhost:8081/ 自己多开几个页面孤独聊天,或者将地址发给好友一起体验!

手把手教你开发简单的即时通讯系统(IM)

感受

  1. tableStore提供的timeline模型,把IM的开发变得如此简单,任何人都能够简单的使用,在并发、容量、消息顺序等各种问题上都不用担心。
  2. 简单的demo开发很容易,但是一个功能完善的IM产品开发,还是需要开发人员了解Timeline如何和其他组件一起使用。Timeline仅仅是提供了IM产品的核心支持,作为一个企业级的IM产品支柱而存在。如果Timeline产品能提供补充IM产品的完整设计,那么相信更多的人会感觉IM易如反掌。
  3. Demo的细节设计上目前都是从简的,仅为了体验Timeline模型。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

(0)
上一篇 2024年5月10日 下午12:04
下一篇 2024年5月10日 下午12:15

相关推荐

  • 临床科研项目计划书

    临床科研项目计划书 本文介绍了一个临床科研项目的计划书,旨在研究一种特定的疾病,并探索新的治疗方案。该项目将涉及多个方面,包括研究设计,实验计划,数据收集和分析,以及项目成果和应用…

    科研百科 2025年3月31日
    1
  • 物流管理系统项目分析

    物流管理系统项目分析 随着经济全球化和物流市场的快速发展,物流管理系统已经成为了企业运营中不可或缺的一部分。物流管理系统可以帮助企业更好地管理物流流程,提高物流效率,降低物流成本,…

    科研百科 2025年1月17日
    0
  • 管理系统工程的

    管理系统工程概述 管理系统工程(Management Engineering)是一种以系统思想为基础,通过设计、开发、实施和维护系统来管理组织的工程领域。管理系统工程涵盖了各种组织…

    科研百科 2024年10月2日
    15
  • 巧记信息系统项目管理师

    巧记信息系统项目管理师 随着信息技术的不断发展,信息系统项目管理师这个职位越来越受到人们的关注。作为项目管理领域的专业人士,信息系统项目管理师需要掌握一系列的技能和知识,才能够有效…

    科研百科 2025年7月17日
    1
  • 局级重点科研项目

    局级重点科研项目 近年来,我国科技创新取得了长足进展,科技对经济增长的贡献率不断提高。在科技创新方面,我国不断加强对基础研究的投入,鼓励创新人才的流动,推动创新链的完善。为了进一步…

    科研百科 2025年2月24日
    1
  • 项目管理可视化看板

    项目管理可视化看板是一种重要的管理工具,可以帮助项目经理和团队更好地理解项目进展和风险,提高项目效率和质量。本文将介绍项目管理可视化看板的重要性,以及如何创建和使用它。 项目管理可…

    科研百科 2024年7月24日
    31
  • 医院科研经费管理制度及流程(医院科研经费管理制度)

    医院科研经费管理制度医院科研经费管理制度是否该科学合理当前的学校环境,往往带有很多新鲜的情绪。报告显示,根据《报告》,受访,学校均要求各地各校要学会心理健康课,各校将心理健康课列入…

    科研百科 2024年5月17日
    44
  • 完整版部门活动经费管理办法

    完整版部门活动经费管理办法 为规范部门活动经费管理,提高部门活动效率和质量,我们制定了完整版部门活动经费管理办法。该办法适用于本部门的各类活动经费的管理和支配。 一、经费用途 部门…

    科研百科 2024年7月12日
    63
  • 1.31亿元平摊到862个项目,科研经费怎么用才更有效?(科研经费怎么算)

    近日,“广西一高校1.31亿科研经费成果转化率为0”引发关注,其中一个细节值得注意:该高校在过往3个年度里获1.31亿元科研经费,实施科研项目862个。1.31亿元经费平摊到862…

    科研百科 2023年12月16日
    38
  • 科研项目团体方向

    科研项目团体方向 科研项目团体方向是指一组研究人员和工程师共同合作,为一个特定的科研项目提供支持和指导。这种团体方向通常由一个或多个教授或研究员组成,他们负责制定研究计划,设计实验…

    科研百科 2025年2月15日
    1