27.app后端搭建聊天服务器的经历

2023-05-16

         现在,聊天功能已经成了社交app的标配了。但是,众多web开发出生的程序员对聊天相关的服务的不了解,带来了很多开发上的困扰。在这篇文章中,根据下面3个方面,谈谈聊天服务。

 

1.      聊天服务的技术选型

2.      开发社交app中,实现聊天服务踩过的坑

3.      那些著名app的聊天服务

 

 

1. 聊天服务的技术选型

 

需要开发聊天服务,首先要选择用到的协议,现在,常用的聊天协议有:

 

(1)      xmpp,一个基于xml的消息协议,被广泛应用于Gtalk,Facebook,但缺点也很明显,由于基于xml,会产生大流量。

(2)      mqtt,IBM开发的即时通讯协议,一个简单的消息协议,需要自己实现加好友,群聊等IM常见的功能

(3)      类ActivitySync,微信实现的协议,省流量,性能高,但由于是私有协议,IM的所有功能都需要自己实现。

 

Xmpp协议作为一个被广泛使用的消息协议,有大量的网络资料和成熟开源模块,例如在android和ios上,就很方便集成xmpp协议。IM作为一个复杂的系统,有方方面面需要考虑,使用成熟的协议,能帮助我们避免很多问题,提高了开发效率。

 

同时,xmpp协议的缺点也很明显,基于xml,造成了费流量。

 

不信,你瞧:

 

<iq id="rosterset1" type="set">
<query xmlns="jabber:iq:roster">
<item jid="user@jabbercn.org" name="user"/>
</query>
</iq>
<presence from="contact@rooyee.biz" to="user@jabbercn.org" type="subscribe"/>

上面是xmpp协议添加好友的内容,看到了吗?这么简单的一个功能,用了多少字节!!!

 

综合上面所述,对于创业型的公司来说,如果需要在最短时间内实现聊天功能,除了使用环信,融云等第三方IM服务外,最好是选择xmpp协议。


         现在主流的实现了xmpp的两个开源项目:

 

(1)Ejobberd,用erlang语言开发,成熟稳定,集群支持,支持多进程高并发。但由于它是基于小众的erlang,也造成了很高的开发成本,例如,想招个熟悉erlang同时也熟悉聊天服务的人,很难。

 

(2)openfire, 用java开发,成熟稳定,插件多,但是对内存要求高,并发低,集群支持差,单机的并发就十多万。


         在创业公司里,我的建议是使用openfire,毕竟熟悉java的开发人员还是挺多的,而且在初期,也不会有太高的并发,等有钱有人后,再对聊天系统改造。

 

虽然,作为一名有理想有道德有职业尊严的后端工程师,想把聊天系统做好,但理想是美好的,现实是残酷的。创业初期的环境,决定了没法打造完善的系统,但最起码,使用openfire能先把聊天功能做出来。

 

2. 开发社交app中,实现聊天服务踩过的坑

 

在做第一个社交app中,使用openfire除了常规的聊天外,还需要实现两个功能:

(1)      未读消息数

(2)      保存聊天记录

 

       由于当时不具备对openfire进行二次开发的能力(或者说是因为心存恐惧),采用了一个现在看起来无比傻的方案:

        

         接收消息,App端是直接连接openfire服务器;发送消息,用php封装了相关发送消息的api,app端通过调用api来发送消息,在api层来处理”未读消息数”和” 保存聊天记录”。

 

          实现”未读消息数”的方法:每次app打开或退出前,调用一个api标识该app是否在线并在redis中记录下来,在调用 发送消息的api时,通过检测一个消息,判断是否未读消息(发送离线的消息就是未读消息)

 

         实现” 保存聊天记录”的方法:在调用 发送消息的api时,把发送的消息异步保存到数据库。

 

         实现了上面两个技术方案,体会到为了解决一个问题引引入了无数的新问题是啥情况了。”未读消息数”功能简直是恶梦,数字根本不准,特别是遇上了app闪退,断网的情况下。这个功能必须要在openfire内部去实现,聊天服务器都有记录相关的用户在线状态的。

 

         在做第二个社交app时,需要实现“发送给ios的离线消息,用apns推送”这个功能。我吸取了第一个社交app的教训,采用了开发openfire插件的方法,把所有发送给ios的离线消息在openfire内部截获下来,并用队列传送到apns系统中,愉快地解决了这个问题。最后,把这个插件开源,放到了我的github中(github.com/newjueqi/sendOfflineMsg

 

3.    那些著名app的聊天服务

 

Whatsapp:

 

初期使用开源Ejabberd服务器,使用Erlang实现。接下来的许多年一直从事Ejabberd的重写和修改,包括从XMPP转换到内部开发协议、调整代码库以及重设计一些核心组件,对Erlang VM做了大量的修改以获得高性能。

 

陌陌

 

         最初的一年是使用了xmpp,一年后改为私有的协议。

 

环信:

 

         对xmpp协议进行了改造:

(1)      登录握手的改进

(2)      心跳的改进

(3)      文件传输

(4)      在线状态的改造

(5)      把聊天室协议改为适合移动互联网的群聊

 

 

陌生人社交应用Whisper中文版“耳语”:

 

         据小道消息,把xmpp协议中的xml改为json。

 

 

----------------------------------------------------------

        本人把网络上发表的一系列“app后端”文章加以整理并增加了运维和架构方面的内容,出版了书籍《App 后台开发运维和架构实践》,该书已在京东,当当和亚马逊上销售。

《App后台开发运维和架构实践》的购买链接

京东

京东 
当当 
亚马逊 
互动出版网 
天猫

--------------------------------------------------------------------------------------------------------------------------

打开链接  app后端系列文章总目录 总目录 ,能查看本人发表过的所有原创“app后端”文章。

【作者】曾健生
【QQ】190678908
【app后端qq群】254659220 
【微信公众号】 appbackend
【新浪微博】 @newjueqi
【博客】http://blog.csdn.net/newjueqi 


 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

27.app后端搭建聊天服务器的经历 的相关文章

  • Java Web开发中路径问题小结

    文章标题 Java Web 开发中路径问题小结 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 作者声明 本人水平有限 xff0c 失误之处 xff0c 敬请各位指出 Java
  • Java中this的用法

    一 this关键字 1 this的类型 xff1a 哪个对象调用就是哪个对象的引用类型 二 用法总结 1 this data 访问属性 2 this func 访问方法 3 this 调用本类中其他构造方法 三 解释用法 1 this da
  • 带你认识Google 屌炸天的AR项目——Project Tango

    这两年虚拟现实VR和增强现实AR简直火的不要不要的 xff0c 众多巨头都在发力 xff0c Google也推出了自己的AR技术解决方案 xff0c 因为目前介绍Tango的中文资料还比较少 xff0c 所以本人结合官网文档和自己的理解写了
  • 山寨版struts的TokenProcessor类

    文章标题 山寨版 struts 的 TokenProcessor 类 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 作者声明 本人水平有限 xff0c 失误之处 xff0c
  • 用Java代理技术改造HttpServletRequest类

    文章标题 用 Java 代理技术改造 HttpServletRequest 类 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 作者声明 本人水平有限 xff0c 失误之处 x
  • app后端设计(13)--IM4JAVA+GraphicsMagick实现中文水印

    在app的后台中 xff0c 有时候为了标示版权 xff0c 需要给图片加上水印 在liunx中 xff0c IM4JAVA 43 GraphicsMagick是个高效处理图片的方案 xff0c 图片的裁剪是使用了这个技术方案 xff0c
  • app后端设计(14)--LBS的偏移问题

    刚开始做LBS的时候 xff0c 有一个问题 xff0c 通过手机获取的坐标 xff0c 放到百度地图或高德地图上 xff0c 总是会出现偏移 xff0c 例如 xff0c 当时是在微信的前总部 南方通讯大厦 附近获取的坐标 xff0c 那
  • 1.用互联网的产品思维打造一本app后端的书

    刚刚接触app后端 xff0c 是做完adidas中国的官方商城的时候 xff0c 那时不清楚app后端应该怎么架构 xff0c 只能摸着石头过河 xff0c 网络上只有一些零散的资料 xff0c 遇到问题 xff0c 只能不断地搜索 xf
  • 2. 网友对app后端写作系列文章的写作建议

    很感谢 app 后端 qq 群的网友 xff0c 在发布消息后 xff0c 就收到了大量网友的反馈 下面的建议会融入到写作当中 xff1a 1 还有 xff0c 对版本升级很感兴趣 xff0c 我们现在为了兼容旧版本 xff0c 已经把工程
  • 3.对经历过的创业项目的总结

    在传统的计算机行业 xff0c 做一个产品先做需求分析 xff0c 然后做设计 xff0c 划分里程碑 xff0c 最后测试 xff0c 上市 但在移动互联网行业 xff0c 这种做产品方法要不得 移动互联网变得太快了 xff0c 有可能之
  • 4.app是怎么炼成的

    很多刚进入app后端的小伙伴 xff0c 有的是之前没有接触过这个行业 xff0c 有的是只在学校学习了基本的技术知识 xff0c 不知道开发app的整个流程是怎么样的 xff0c 因此心里会有一股恐惧 听着别人口中的一大串app相关的术语
  • 5.两分钟让你明白app后端有啥用

    app后端 xff0c 也称为app后台 xff0c 称呼不一样 xff0c 但指的是同一个东西 我一直都以app后端有啥用这个问题不用解释 但在网络上 xff0c 有准备进行app创业的网友 xff08 是从传统行业过来的 xff09 问
  • 6.app架构基础

    app架构 xff0c 一个听起来高大尚的名字 xff0c 很多小伙伴听到这个词语感觉很迷茫 xff0c 不知道架构具体说的是啥 xff1f 在 xff51 群里 xff0c 34 app后端应该怎么架构 34 这个问题被问了无数次 通过阅
  • MSCKF

    主要数据结构 xff1a StateServer当前里程计状态 imu状态 若干相机位姿 状态协方差矩阵 噪声协方差 struct StateServer IMUState imu state CamStateServer cam stat
  • 7.app和app后端的通讯

    经常有开发者问 xff1a app和后端通讯是用http协议还是私有的协议 xff1f 是用长连接还是短连接 xff1f 通过阅读本文 xff0c 帮你解除上面的疑问 xff08 1 xff09 是用http协议还是私有的协议 xff1f
  • 8.app后端和web后端的区别

    很多从web后端转到app后端的小伙伴经常很茫然 xff0c 不知道这两者之间有啥区别 本文通过例子 xff0c 分析web后端和app后端的区别 xff0c 使各位更好地把握app后端的架构 1 app后端要慎重考虑网络传输的流量 xff
  • 9.app后端选择什么服务器

    对于很多刚入行的朋友来说 xff0c 不清楚应该选择什么样的服务器提供商 xff0c 是选择传统的IDC 租用服务器租用机柜 xff0c 还是选择现在很火的云服务器呢 xff1f 在本文中 xff0c 通过对比传统的IDC和云服务 xff0
  • 10.app后端选择什么开发语言

    在qq上 xff0c 经常看到有创业团队的创始人一直都招不到技术人员 xff0c 除了项目的因素外 xff0c 很大的原因就是所需要掌握的开发语言偏门 通过阅读本文 xff0c 详细了解选择开发语言的核心原则 xff0c 使各位心里对开发语
  • 11.如何快速进门新技术

    在app后端的工作中 xff0c 经常会接触到新的技术 作为一名后端人员 xff0c 面对开发的压力 xff0c 快速地入门新的技术 xff0c 融入到项目当中 xff0c 这已经成了一个后端人员的必备技能 在这篇文章 xff0c 根据总结
  • 12.app后端如何选择合适的数据库产品

    app后端的开发中 xff0c 经常要面临的一个问题是 xff1a 数据放在哪里 mysql xff1f redis xff1f mongodb xff1f 现在有这么多优秀的开源数据库产品 xff0c 怎么根据业务场景来选择合适的数据 常

随机推荐

  • 13.app后端为什么要用到消息队列

    很多没有实际项目经验的小伙伴 xff0c 对消息队列系统非常陌生 xff0c 看着很多架构的介绍中 xff0c 都提到消息队列 但是 xff0c 不知道为什么要用消息队列 xff1f 什么是消息队列 xff1f 常见的消息队列产品有哪些 x
  • 14.app后端如何设计api

    app和后端的交互 xff0c 一般都是通过后端提供的api实现 api的设计 xff0c 估计很多刚进入app后端的小伙伴会一无头绪 xff0c 不知道怎么入门 下面根据自己3年的app后端经验 xff0c 总结出下几个api设计原则 x
  • 15.app后端怎么设计用户登录方案

    在很多app中 xff0c 都需要用户的登录操作 登录 xff0c 就需要用到用户名和密码 为了安全起见 xff0c 暴露明文密码的次数越少越好 怎么能最大程度避免泄露用户的密码呢 xff1f 在登录后 xff0c app后端怎么去验证和维
  • Struts 1 中DispatcherAction类原理浅析

    文章标题 Struts 1 中 DispatcherAction 类原理浅析 文章作者 曾健生 作者邮箱 zengjiansheng1 64 126 com 作者 QQ 190678908 作者声明 本人水平有限 xff0c 失误之处 xf
  • Python 高级编程技巧 第二讲 内置不可变类型并修改其实例化行为、slots属性、contextmanager上下文管理器、创建可管理对象属性、类比较操作

    第二讲 一 如何派生内置不可变类型并修改其实例化行为 这里有一道练习题 xff0c 我们想定义一个新类型的元组 xff0c 对于传入的可迭代对象 xff0c 我们只保留其中int类型并且值还要大于0 或许我们可以这么写 xff0c 尝试一下
  • 16.app后端如何保证通讯安全--url签名

    app和后端的通讯过程中 xff0c api请求有可能被别人截取或不小心泄露 那么 xff0c 怎么保证api请求的安全呢 xff1f 在这篇文章中 xff0c 介绍一种常见的保证api请求安全的做法 url签名 1 url签名详解 在前一
  • 17.app后端如何保证通讯安全--aes对称加密

    在上文 16 app后端如何保证通讯安全 url签名 提到 xff0c url签名有两个缺点 xff0c 这两个缺点 xff0c 如果使用对称加密方法的话 xff0c 则完全可以避免这两个缺点 在本文中 xff0c 会介绍对称加密的具体原理
  • 18.app后端如何实现LBS

    移动互联网 xff0c 除了一直在线这个特点外 xff0c 还有一个重要特点 xff0c 能定位到手机的位置 查找附近的人 附近的餐馆等服务 xff0c 以及大量的o2o应用 都需要使用LBS Location Based Services
  • 19.最省钱的app发短信方法

    在创业团队中 xff0c 一个重要的原则是能省就省 xff0c 该花就花 xff0c 把银子用在刀刃上 现在的app xff0c 为了获取用户的社交关系 xff0c 需要用户的手机号注册 用手机号注册就涉及到一个发送短信验证码的问题 xff
  • 20.如何从app业务逻辑提炼api接口

    在app后端的工作中 xff0c 设计api是一个很考验设计能力的工作 在项目的初始阶段 xff0c 只知道具体的业务逻辑 xff0c 那怎么把业务逻辑抽象和提炼 xff0c 设计出api呢 xff1f 通过阅读本文 xff0c 可解答以上
  • 21.app后端如何高效更新内容

    在app的主页或通知栏 xff0c 经常需要通过api取最新的数据 那么 xff0c 怎么在这部分上做优化 xff0c 使获取内容的效率更高呢 xff1f 在本文中 xff0c 通过推拉和增量更新 xff0c 实现了一种高效获取数据的策略
  • 22.在创业公司中的成长

    在 app后端 qq群中 xff0c 经常被问到的一个问题 xff1a 怎么设计一个应付高并发的架构 诚然 xff0c 设计一个能应付百万流量的高并发架构 xff0c 是很令人兴奋的技术挑战 xff0c 但在创业公司中的成长 xff0c 难
  • 23.app后端如何架设文件系统

    现在app展现内容的形式多种多样的 xff0c 有文字 xff0c 图片 xff0c 声音 xff0c 视频等等 xff0c 其中文件占了一个很大的比重 随着app不断运营 xff0c 文件会越来越多 xff0c 占用的磁盘空间也不断增大
  • 24.从公众号筹集10万股份学到的商业化思维

    1 忽然间看到了卖公众号的股份的玩法 昨天 xff0c 在公众号 老鹰说 id joeytalks 看到了他要弄一个新的玩法 xff0c 卖公众号的股份 xff0c 熟人1000块一股 xff0c 陌生人2000块一股 当时不以为然 xff
  • 25.创业真的需要app吗?真的需要外包吗?

    两个星期前 xff0c 一名亲戚的朋友打算投入自己的二十多万元去搞个摄影社交app xff0c 问我有没有靠谱的外包推荐 xff0c 我赶紧劝住他 xff0c 现在app的成本已经非常高了 xff0c 初期的研发就要十几万 xff0c 加上
  • HarmonyOS鸿蒙的测试体验

    HarmonyOS 2 0手机开发者Beta公测招募 xff0c 申请开发者账号 xff0c 报名 xff0c 就可以抢先体验 除了抢先体验 xff0c 使用真机测试外 xff0c 使用模拟器也可以尝试体验 那测试人员可以使用HVD和Clo
  • 单点登录 Ucenter 分析

    原文 xff1a http blog csdn net ebw123 article details 9417231 首先我们先来了解下 Ucenter登录步骤 1 用户登录discuz xff0c 通过logging php文件中的函数u
  • 当Ucenter和应用通信失败

    http blog sina com cn s blog 775f158f010135uz html 失败是常见的 对于初次接触Ucenter的人来讲 xff0c 添加一个自己的应用最头疼的就是发现通信失败 如果要解决这个问题 xff0c
  • 26.app后端怎么架设推送服务

    推送服务已经是app的标配了 架设推送服务 xff0c 除了可以使用第三方服务商外 xff0c 也有大量的开源技术可以选择 现在推送主要分两块 xff0c android推送和ios推送 xff0c 在下面分别论述 xff1a 1 Andr
  • 27.app后端搭建聊天服务器的经历

    现在 xff0c 聊天功能已经成了社交app的标配了 但是 xff0c 众多web开发出生的程序员对聊天相关的服务的不了解 xff0c 带来了很多开发上的困扰 在这篇文章中 xff0c 根据下面3个方面 xff0c 谈谈聊天服务 1 聊天服