Startalk 是一套开源IM系统平台。涵盖了所有你所能想到的目标平台和目标系统。且性能优异。
Startalk主攻 toB 场景。
Startalk的目标是想解决企业在近20年的时间内没有统一的IM系统的问题:
相比之下,各大操作系统经过近20年的演化,以及nginx的出现,已经让http服务变得非常简单了。
简单来说,我们的优点很明显:
第一,性能、稳定性以及平台适应性可以算是业界最好的,理论上支持所有平台
第二,公开了几乎全部的代码
第三,团队仍旧在持续迭代
缺点也有:
1. 系统很庞大和复杂
2. 涉及到的技术栈面很广,通常情况下您需要先想好自己要做什么,想实现什么功能,以及需要哪方面帮助
之前写过一篇介绍。本篇希望在叙述上更针对典型用户的需求,如果对上一个版本的介绍文档感兴趣,可以看看这里。
人类从有沟通需求开始,追求无止境。
沟通即表达,传递信息和想法
我们的口号是
不做里程碑,也要做铺路石!
IM系统本身很复杂。投入产出比不高。常见的开源方案的目标并不是性能和稳定性,大多以实现功能为主。
星语Startalk主要针对底层实现进行了较长时间的积累和沉淀。 这个也契合了我们的口号
谈到系统特性,主要围绕以下几个方面展开:
- 自有协议
不同于常见的im协议,startalk的协议是自有协议。
由于是自有协议,增大了传输过程中被窃听的复杂度和难度。
- 二进制协议
区别于常见的文本协议(例如xmpp,又或者是http),startalk的通信协议是二进制的。
这个设计也增大了传输过程中被窃听的复杂度和难度。
- TCP长连接,默认全程TLS,保持端到端加密
由于连接开启了TLS,进一步增加了传输过程中被窃听的难度。
- 服务端在自己机房,客户端在自己用户手中
startalk作为开源软件,区别于常见的通信软件服务,推荐用户进行私有化部署。
当用户私有化部署完成之后,用户间的通信过程就像公司内部的邮件和bbs一样,只于内部系统可见了。
- 轻松支持百万级用户在线,支持横向扩展
因为支持几亿人同时在线的IM已经做的太强大了。
所以,startalk的目标和典型场景,是支持一个正常团队的人数协同工作。
这个数量从十几、几十到上百上千甚至上万。
startalk非常善于轻松支持这个人数的用户进行协作。
当然,由于Startalk的后端基于erlang。这使得横向扩展变得非常容易。
通常我们需要支持上百万用户的时候,
除了加内存之外,还可以选择买机器,然后用集群来解决问题。
一切都是非常的简单和自然。
- 客户端更省电,最高可达90%
我们测试了常见的xmpp服务端。
由于startalk用了二进制协议和自有协议,这使得协议在解析过程中更加的节省CPU,
从而节约了最高90%的电能损耗。
目前startalk的耗电量跟微信在同一水平线上(比常见的xmpp客户端省电90%)。
- 客户端更省流量,最高可达90%
相信很多使用xmpp客户端的用户都有同感,每天没怎么聊流量用的很多。
同样由于优化了协议和传输,使得startalk比常见的xmpp客户端最高可节约90%流量。
同样的,目前startalk的流量损耗跟微信也在同一水平线上(比常见的xmpp客户端节约90%流量)。
- 不丢消息
看起来是个很简单、很容易做到的功能,
然而对聊天软件来说,丢消息、消息不实时是致命的。
可怕的是,这个功能对很多产品来说却很难做好。
startalk经过了近3年的高强度测试和改进,终于做到了这个目标。
- 消息量大了不卡顿
同丢消息一样,这个点也是看起来很简单,很容易做到的功能,
然而确是大量软件不太容易做到的功能。
这个问题的现象是,起初刚开始用的时候很好用。等消息多起来之后,
列表页卡顿,消息页卡顿,优化也很耗精力和时间。
星语可以做到10G左右的聊天数据不卡顿。(微信还要更猛一些)
使用星语做您软件的底层可以尽可能的避免遇到这些问题。
与市面上主流面向web的通信服务工具不同,Startalk 面向平台,为了实现更强大的性能上限,客户端用了本地化的代码实现。
Startalk 由以下客户端组成:
(建设中)
- 企业办公OA
- 企业应用整合
- SDK嵌入(企业自有业务支撑)
- 商业客服
- [通信]
- [邮件]
- [审批]
- [APP整合]
- [客户端SDK]
- [OA二次开发]
-
IOS sdk嵌入:
QIMSDK最低支持iOS9 默认依赖React-Native的CocoaPods集成 1. 在Podfile中加入以下内容: source 'https://github.com/startalkIM/libqimkit-ios-cook.git' source '[email protected]:CocoaPods/Specs.git' target 'YourApp' do pod 'QIMUIKit', '~> 4.0' end post_install do |installer_representation| installer_representation.pods_project.targets.each do |target| target.build_configurations.each do |config| config.build_settings['APPLICATION_EXTENSION_API_ONLY'] = 'NO' end end end 2. 在项目根目录执行 `pod install`
-
Android sdk嵌入:
配置Gradle
buildscript {
repositories {
google()
jcenter()
}
}
allprojects {
repositories {
maven { url 'https://dl.google.com/dl/android/maven2' }
maven {
url "https://raw.githubusercontent.com/froyomu/im/master"
}
maven {
url "http://developer.huawei.com/repo/"
}
jcenter {
url "http://jcenter.bintray.com/"
}
maven {
url "https://jitpack.io"
}
google()
jcenter()
mavenCentral()
}
}
dependencies {
compile project(':imsdk')//compile 'com.qunar.im:sdk-im:3.0.7'
}
配置manifestPlaceholders
flavorDimensions "qim"
//Mutiple channels
productFlavors {
//startalk
startalk {
dimension "qim"
manifestPlaceholders = [
PACKAGE_NAME : "sdk.im.qunar.com.qtalksdkdemo",//Replace it with the application ID of your own project
serverDoMain : true,
baiduMap :"xxxxx",//key of Baidu map (for sending location)
HUAWEI_APPID : "123",//HUAWEI push
OPPO_APP_ID : "123",//OPPO push
OPPO_APP_KEY : "123",
OPPO_APP_SECRET : "123",
MIPUSH_APP_ID : "123",//XIAOMI push
MIPUSH_APP_KEY : "123",
MEIZU_APP_ID : "123",//MEIZU push
MEIZU_APP_KEY : "123",
VIVO_APP_ID : "123",//vivoo
VIVO_APP_KEY : "123",
SCHEME : "qtalkaphone",
currentPlat : "QTalk",
MAIN_SCHEMA : "start_qtalk_activity"
]
}
}
- [Web嵌入]
(暂缺)
详细和原始的内容请参考这里
- ejabberd (erlang)
IM核心组件,负责维持与客户端的长连接和消息路由
- openresty 组件(LUA)
IM负载均衡组件,负责验证客户端身份,以及转发http请求到对应的后台服务
- im_http_service (JAVA服务)
IM HTTP接口服务,负责IM相关数据的查询、设置以及历史消息同步(基于tomcat的java服务)
- qfproxy(JAVA服务)
IM文件服务,负责文件的上传和下载(基于tomcat的java服务)(JAVA服务)
- push_service(JAVA服务)
IM的push服务,用于离线消息的推送(基于tomcat的java服务)(JAVA服务)
- search_serivce(JAVA服务)
提供远程搜索好友、群、聊天记录的服务
- redis
IM缓存服务
- postgresql
数据持久化服务
(建设中)
技术文档可以先参阅这里
(建设中) 技术文档可以先参阅这里
(建设中) 技术文档可以先参阅这里
- 最开始,用户希望服务器部署在自己家。而不是打开之后注册登录公共的服务器。
- 接着,用户把自己的服务器建立起来之后,发现还需要有客户端应用程序才可以。
- 用户自建app,那么问题到此结束。导航是不需要配置的。
- 如果用户手里没有app,也就是说没有客户端、用户端应用程序。
- 接下来,用户发现有一个选择,就是用开源社区提供的app。
- 紧接着,用户发现需要配置app(应用程序),使其去连用户自己配置的服务器。
- 登录页面中的选择导航按钮的作用就是让app去连你自己的服务器(而不是公有服务器)
我们希望我们的平台可以构建在企业环境中,因此我们推荐用户做私有化部署。
但是在私有化部署之前,有必要了解这套系统是怎么工作的,需要哪些服务,都有哪些功能。
所以在部署前进行有效的测试,将会让各位更加明晰当前版本的功能范围和性能指标。
我们推荐的试用分为两个方向:
- 注册公共域试用
- docker部署试用
https://i.startalk.im/home/#/download_easy
Docker起测试服务是我们目前推荐的方式。
Docker 可以在Windows上起服务,这使得很多Windows用户不需要额外准备Linux主机就可以体验到startalk的各方面能力。
- 获取资源文件 并解压:
wget https://i.startalk.im/pubapi/soft/download/startalk_docker.zip
- 解压文件
unzip -x startalk_docker.zip
得到:
-rw-r--r--. 1 root root 1.3K 12月 10 2019 Dockerfile
drwxr-xr-x. 2 root root 33 12月 11 2019 images
-rw-------. 1 root root 22M 12月 10 2019 permfile.zip
-rw-r--r--. 1 root root 1.9K 12月 11 2019 README.md
-rw-r--r--. 1 root root 93K 12月 10 2019 success.png
之后再解压:
unzip -x permfile.zip
得到:
-rw-r--r--. 1 root root 1.3K 12月 10 2019 Dockerfile
drwxr-xr-x. 2 root root 33 12月 11 2019 images
drwxr-xr-x. 6 root root 57 12月 9 2019 permfile
-rw-------. 1 root root 22M 12月 10 2019 permfile.zip
-rw-r--r--. 1 root root 1.9K 12月 11 2019 README.md
-rw-r--r--. 1 root root 93K 12月 10 2019 success.png
- 用docker加载镜像
docker load < images/startalk_docker.tar
- 创建 Volume
为什么要创建volume?
简单来说,Docker环境在虚拟机下无法保存数据。你需要用你的宿主机来保存这些文件,比如日志,比如图片,比如聊天记录。
docker volume create startalkpgdata
- 获取 docker image id
docker images
回车
然后,在结果中复制SIZE最大的那一列对应的IMAGE ID
- 启动镜像
需要提前准备:
- 自己宿主机的IP (下文中的hosturl)
- 上一步获得的docker image id (下文中的镜像id)
- liunx 用户使用:
假设:
permfile 全路径为 /home/xxx/permfile
宿主机IP是 192.168.0.1
docker image id 是 1e977139e6ba
那么直接运行:
docker run -v /home/xxx/permfile:/startalk/permfile -v startalkpgdata:/startalk/data -p 8080:8080 -p 5202:5202 -e hosturl="192.168.0.1" 1e977139e6ba
注意,Docker当前版本必须使用全路径加载permfile,否则可能大概率启动失败
- Windows 用户使用:
假设:
宿主机IP是 192.168.0.1
docker image id 是 1e977139e6ba
那么直接运行:
docker run -v permfile:/startalk/permfile -v startalkpgdata:/startalk/data -p 8080:8080 -p 5202:5202 -e hosturl="192.168.0.1" 1e977139e6ba
注意:
- docker run 加 -v参数,后面接的是持久性文件在宿主机上的绝对路径。 如您将permfile.zip 解压到了 /home/startalk/permfile 则-v /startalk/permfile:/startalk/permfile.冒号后面的路径不需改动
- docker run 加了-p参数,配置了宿主机与container的端口映射。本例中需要用到宿主机暴露两个端口8080 5202
- hosturl 是宿主机的ip,作为参数传给container。如果您配置的是内网ip 那整套IM 只能在内网使用。否则,如果您配置的是公网ip 则外网也可以使用
- docker 版本:build image 是用的 Docker version 18.09.2,避免因为版本问题,建议使用>=18.09
这里是原文 地址
起先我们是推荐在线上注册登录试用的。因为设备费用等问题以及人手的问题, 我们慢慢不太建议少量用户试用公共域了(当然您还可以继续使用它)。
如果您目前处于:
- 需要一款完全私有化部署的系统
- 暂时没精力折腾
- 能接受暂时的公有域使用,当自己条件满足之后切成私有部署
那么您可以尝试暂时在公共域入驻了!
- 请在这里下载各平台最新版本客户端
[返回目录列表]
这个部分是后来写的。如有需要,请参见 原始文档
当前startalk生成用户的部分主要是通过执行sql,在后台生成,目的是扩展性。
需要手动生成用户,首先要明确几个问题:
-
startalk后台使用秘文密码。密码规则: 参照密码规则
-
用户id (大部分文档中会称之为user_id)生成规则:只能包含小写字母、数字、_、-、.,建议使用用户中文名的拼音当作user_id。
-
为了让变更生效,在变更完信息后,需要:
- host_users需要把version变成max(version) + 1
- vcard_version需要把version=version + 1
插入用户 (使这个人存在)
insert into host_users (host_id, user_id, user_name, department, dep1, pinyin, frozen_flag, version, user_type, hire_flag, gender, password, initialpwd, pwd_salt, ps_deptid) values ('1', 'file-transfer', '文件传输助手', '/智能服务助手', '智能服务助手', 'file-transfer', '1', '1', 'U', '1', '1', 'CRY:fd540f073cc09aa98220bbb234153bd5', '1', 'qtalkadmin_pwd_salt_d2bf42081aab47f4ac00697d7dd32993', 'qtalk');
插入名片 (变更这个人的信息,例如名称,头像,等)
insert into vcard_version (username, version, profile_version, gender, host, url) values ('file-transfer', '1', '1', '1', 'qtalk', '/file/v2/download/avatar/new/daa8a007ae74eb307856a175a392b5e1.png?name=daa8a007ae74eb307856a175a392b5e1.png&file=file/daa8a007ae74eb307856a175a392b5e1.png&fileName=file/daa8a007ae74eb307856a175a392b5e1.png');
数据字典(db schema)
host_users:
序号 字段名称 字段描述 字段类型
1 host_id 域信息id bigint
2 user_id 用户名 text
3 user_name 中文名 text
4 department 组织架构 text
5 tel 电话 text
6 email 邮箱 text
7 dep1 一级部门 text
8 dep2 二级部门 text
9 dep3 三级部门 text
10 dep4 四级部门 text
11 dep5 五级部门 text
12 pinyin 拼音 text
13 frozen_flag 禁止标志 smallint
14 version 版本号 integer
15 user_type 用户类型(U) character
16 hire_flag 在职标志 smallint
17 gender 性别,1(男)2(女)0(未知) smallint
18 password 密码 text
19 initialpwd 是否是初始密码,1(是)0(否) smallint
20 ps_deptid 根级组织名字 text
21 pwd_salt 密码盐值 character varying(200)