开源im系统哪家好(如何快速开发一个IM系统)
开源im系统哪家好(如何快速开发一个IM系统)接下来我们来完成这样的一个即时通讯产品的demo。正因为是一个demo,我们关注核心功能,所以在设计和其他功能上都会从简,方便大家理解和阅读。具体的文章可以参考:最后讨论的结果是:开发一个稳定高效的IM产品是相对困难的,上面这些难题,QQ、微信等产品都遇到过。而且IM产品一旦量达到一定程度,性能、稳定性、可用性等的挑战会越来越大,开发维护都十分困难,需要不断的打磨锤炼,才能保证是一个可靠稳定的IM产品。同样是一个IM的小白,在看到 tableStore产品的 timeline模型后,只花了一个下午的时间,就理解了IM和做出一个可使用的demo。Timeline 模型是 TableStore 团队针对消息数据场景所新创的一个数据模型,它的特色在于能够满足消息数据场景对消息保序、海量消息存储、实时同步的特殊需求。目前 Timeline 模型主要能够解决以下场景的需求:
本文将会给大家介绍如何开发一个简单的即时通讯系统(IM)。
为什么不简单我们的站点加一个即时通讯(IM)的功能,那么我们怎么做?
在回家的路上,问了同是实习生(网络方向)的舍友这样一个问题,他回答:“很简单,只需要在服务端保存一个list,收到一个人的message后,我转发给list中指定的另一个人就好啦”
接着,我们讨论了一晚上下面的几个问题
- 对方不在线怎么办?
- 内存里保存list的话,人多了怎么办?
- 怎么查看历史记录?怎么多端同步数据?
- 为什么微信用户只能建立有限个群,并且群聊功能很晚才开放?为什么微信好友数是有上线的?
- 怎么保证消息有序、不丢失数据?
- 如何保证消息的时效性?
- 如何承担高并发流量?
最后讨论的结果是:开发一个稳定高效的IM产品是相对困难的,上面这些难题,QQ、微信等产品都遇到过。而且IM产品一旦量达到一定程度,性能、稳定性、可用性等的挑战会越来越大,开发维护都十分困难,需要不断的打磨锤炼,才能保证是一个可靠稳定的IM产品。
为什么简单同样是一个IM的小白,在看到 tableStore产品的 timeline模型后,只花了一个下午的时间,就理解了IM和做出一个可使用的demo。
Timeline 模型是 TableStore 团队针对消息数据场景所新创的一个数据模型,它的特色在于能够满足消息数据场景对消息保序、海量消息存储、实时同步的特殊需求。目前 Timeline 模型主要能够解决以下场景的需求:
- IM : 如钉钉、微信
- Feed流:如微博、朋友圈
- IOT消息下推:如天猫精灵
- 无限Topic的队列
具体的文章可以参考:
- TableStore Timeline:轻松构建千万级IM和Feed流系统
- TableStore数据模型 - WideColumn和Timeline
接下来我们来完成这样的一个即时通讯产品的demo。正因为是一个demo,我们关注核心功能,所以在设计和其他功能上都会从简,方便大家理解和阅读。
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产品经常需要搜索数据,其中主要包括:
- 用户、群的元数据搜索
- 历史消息内容的搜索
这些功能将会在上线 TableStore 2.0的SearchIndex功能后一起发布,届时Timeline模型将原生支持强大的搜索能力,满足开发者不同的需求。
运行大家可以尝试自己运行一下代码,很简单的几个步骤就把系统运行起来了。
1. 开通服务(免费)
tablestore有足够多的免费额度,可以做很多事情。我们去官网 https://www.aliyun.com/product/ots 开通实例,通过控制台创建一个实例
- endpoint : 自己的实例的网址,类似 https://xxxxxx.cn-hangzhou.ots.aliyuncs.com
- instanceName :自己的实例的名字,即上面网址的前缀
2. 获取AK
阿里云所有的服务几乎都是通过AccessKeyID 和AccessKeySecret来做鉴权的。我们点击用户的如下按钮,按照提示获取一个AccessKeyID 和AccessKeySecret。
3. 运行代码
- 下载指定分支代码
- 从附件中下载源码。
- 在源码中编译代码
- linux下 ./gradlew build
- windows下: gradlew.bat build
- 提示:网络不好时间可能会比较久,如果自己本机安装过gradle的话,也可以直接使用 gradle build 来进行编译
- 启动项目
- 其中xxxx相关的要换成自己的阿里云实际的配置。
- java -jar build/libs/im-demo.jar \
- --aliyun.tablestore.endpoint="xxxxx" \
- --aliyun.tablestore.AccessKeyID="xxxxx" \
- --aliyun.tablestore.AccessKeySecret="xxxxx" \
- --aliyun.tablestore.instanceName="xxxxx"
- 浏览器访问 http://localhost:8081/ 自己多开几个页面孤独聊天,或者将地址发给好友一起体验!
- tableStore提供的timeline模型,把IM的开发变得如此简单,任何人都能够简单的使用,在并发、容量、消息顺序等各种问题上都不用担心。
- 简单的demo开发很容易,但是一个功能完善的IM产品开发,还是需要开发人员了解Timeline如何和其他组件一起使用。Timeline仅仅是提供了IM产品的核心支持,作为一个企业级的IM产品支柱而存在。如果Timeline产品能提供补充IM产品的完整设计,那么相信更多的人会感觉IM易如反掌。
- Demo的细节设计上目前都是从简的,仅为了体验Timeline模型。