开发者社区> 寻剑> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

如何快速开发一个IM系统

简介: 本文将会给大家介绍如何开发一个简单的即时通讯系统(IM)。 Timeline 模型是 TableStore团队针对消息数据场景所新创的一个数据模型,它的特色在于能够满足消息数据场景对消息保序、海量消息存储、实时同步的特殊需求。
+关注继续查看

本文将会给大家介绍如何开发一个简单的即时通讯系统(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的队列

具体的文章可以参考:

介绍

接下来我们来完成这样的一个即时通讯产品的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) 类型
groupName String
userName String

3. 工程结构

工程采用springboot做的后端框架,前端用了vue.js用来简单展示数据,具体代码附件中。

1

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。

2

3. 运行代码

  1. 下载指定分支代码

    从附件中下载源码。

  2. 在源码中编译代码

    1. linux下  ./gradlew build  

    2. windows下:   gradlew.bat build

    3. 提示:网络不好时间可能会比较久,如果自己本机安装过gradle的话,也可以直接使用 gradle build 来进行编译

  3. 启动项目

    其中xxxx相关的要换成自己的阿里云实际的配置。

    java -jar build/libs/im-demo.jar  \
        --aliyun.tablestore.endpoint="xxxxx" \
        --aliyun.tablestore.AccessKeyID="xxxxx" \
        --aliyun.tablestore.AccessKeySecret="xxxxx" \
        --aliyun.tablestore.instanceName="xxxxx" 
  4. 浏览器访问 http://localhost:8081/ 自己多开几个页面孤独聊天,或者将地址发给好友一起体验!

    3

感受

  1. tableStore提供的timeline模型,把IM的开发变得如此简单,任何人都能够简单的使用,在并发、容量、消息顺序等各种问题上都不用担心。

  2. 简单的demo开发很容易,但是一个功能完善的IM产品开发,还是需要开发人员了解Timeline如何和其他组件一起使用。Timeline仅仅是提供了IM产品的核心支持,作为一个企业级的IM产品支柱而存在。如果Timeline产品能提供补充IM产品的完整设计,那么相信更多的人会感觉IM易如反掌。

  3. Demo的细节设计上目前都是从简的,仅为了体验Timeline模型。

最后,欢迎加入我们的钉钉群(群号:11722164)进行交流。

4f6f24e167e6591539aa711ade249e76ba5a8f22.png

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

附件下载:https://developer.aliyun.com/topic/download?id=593

相关文章
如何快速开发一个简单实用的MES系统?
现在越来越多的企业已经开始应用mes系统,所以对于MES软件系统开发工程师的需求有所上升,那么开发MES系统需要掌握哪些信息?mes系统怎么开发?MES软件系统开发要点有哪些?假如真的想开发一个MES系统,需要从业务和开发两个方面入手。下面就来了解下MES软件系统开发知识吧。
218 0
如何快速理解复杂业务,系统思考问题?
对于复杂问题的思考其实是有层次的,从最表面的事件,到事件背后的规律,再到这个问题的结构模式,再到价值观,层层递进。在画完自己的业务系统因果回路图之后,再结合这个心智模型,思考自己的思考在哪个层次,是否可以有机会再下钻到更深的层次。
563 0
Windows系统中,如何快速找到端口被占用的进程?
在本地调试代码时,经常遇到端口被占用导致启动失败的问题,又不能很快找到哪个进程占用了端口,很是恼火。 今天,我们用shell命令轻松搞定。
42 0
SAP系统如何快速上手?
SAP系统如何快速上手?
37 0
直播系统开发如何有效地留住用户
进入18年以来,直播的热潮似乎慢慢降下去,直播已经进入到了冷静期,这是为什么呢?过去直播门槛低,良莠不齐的内容、急功近利的心态使得部分直播平台走向了错误的方向,最终下架。现在的直播是“内容为王”的时代,过去靠哗众取宠吸引观众的方式已经不起作用,现在直播内容同质化开始变得严重,如何留住观众成了大问题。
1245 0
如何快速开发一个 Dubbo 应用?
导读:在分布式系统中,远程调用是最基础也是最重要的基石。历史上,曾经先后出现过 CORBA、RMI、EJB、WebService 等技术和规范,在服务化以及微服务日趋流行的今天,更多的被广泛使用的是包括 gRPC、Finagle、以及国内的 Dubbo 为代表的轻量级框架。
906 0
系统思考
最近发现一本关于提高系统思维能力的书,是一本你读起来很容易接受,逻辑很清楚的书,下面我就总结下,给大家参考下 背景 一般在我们工作或者生活的过程中都会碰到下面三中情况 遇到事情突然想不清楚 表达时说不清楚 学习的时候学的慢 以上的场景可能不是所有人都遇到过,但这个不是最关键的。
1622 0
推荐系统
推荐系统的目标:根据用户的喜好,为不同的用户推荐不同的物品,促成更多的交易。 1.协同过滤 具有相似消费行为的人,可以相互推荐。比如用户a、b同时购买了手机,a又购买了手机壳,那么b也是手机壳的潜在买家。 往往需要一个物品评分矩阵R,元素ri,jr_{i,j}表示用户i对物品j的评分。一般采用5分制,从1(非常不喜欢)到5(非常喜欢)。形如: 表1.1 一个
1519 0
系统调用(一)
版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/46609877 (一):与内核通信 系统调用在用户空间和硬件设备之间添加了一个中间层。
771 0
如何安装双系统
  长痛不如短痛啊,该不该装个双系统呢,纠结。。一般的组合为windows xp和windows 7,不过也有win7和win8的,三者同时有的也有不少。双系统的好处就不用我多说了,今天我就来说一下xp和7双系统的安装方法。
1118 0
+关注
14
文章
0
问答
来源圈子
更多
阿里云存储基于飞天盘古2.0分布式存储系统,产品包括对象存储OSS、块存储Block Storage、共享文件存储NAS、表格存储、日志存储与分析、归档存储及混合云存储等,充分满足用户数据存储和迁移上云需求,连续三年跻身全球云存储魔力象限四强。
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载