文档章节

Comet技术在IM上的应用

通九互联科技
 通九互联科技
发布于 2015/07/17 11:19
字数 838
阅读 4185
收藏 93

对于数据转发我们一般就两种模式,一种时推模式,一种时拉模式。下面我们简单介绍一下推模式和拉模式。

推模式

该模式下,一般是消息源直接推送给目标群体或推送给Broker,由Broker推送给目标群体。

这个模式下,每一个接收者都有一份数据复制。这种情况下,写入压力非常大,但是读取的压力非常小并且实时性非常高。是一种以空间换时间的模式。

拉模式

该模式下,一般是消息源将数据推送到存储中,目标群体定时或因为某些原因触发拉取动作。

这个模式下,所有接收者共享一份数据复制。这种情况下,写入压力小,但是读取压力偏大,并且实时性偏弱。是一种以时间换空间的模式。

两种模式在系统设计上的影响

推模式,实现上看起来比较简单,但考虑到订阅群体的变化等情况,其实并不是很简答的,并且在存储的消耗上也是很巨大的。

拉模式,实现上触发的随机性很大,并且需要考虑到同步的数据的数量是否会给网络和存储带来巨大的压力。

Comet和两种模式的关系

Comet本质上,是一个http请求服务器而服务器当前没数据,等服务器有数据或超过一定时间才返回给客户端。从这个层面上Comet是一个拉模式和推模式的混合体,为什么这么说?

因为有下面几个原因:

  1. Comet请求连上服务器的瞬间,它所关注的数据已经发生了很多变化,服务器可以立刻返回给客户端。那么这相当于是一个拉模式,客户端和服务器进行了基于检查点的同步。

  2. Comet请求连上服务器时,它所关注的数据还没有发生变化,在该链接没有超时的阶段内,数据发生了变化,服务器将数据返回给客户端。这样就相当等于通过拉取动作去完成了一个推模式。

Comet在IM上的应用

我在前面的博客中介绍了我的IM群组设计。我们可以通过Comet来实现它。下面我就简单讲下如何实现该功能。

  1. 客户端使用POST方法发起一个http请求,其中请求的形式{channel1:sync_key1},{channel2:sync_key2}。

  2. 当服务器接收到这个请求的时候,按要求遍历所有的channel,如果存在数据变化就以{channel1:{sync_key:sync_key1,data:[.....]},{channel2:{sync_key:sync_key2,data:[....]}}这种数据形式返回。

  3. 如果服务器上任何channel都没有变化,就将自己加入所有channel的订阅中。当接收到任何变化的时候,我们就再次遍历所有channel,并按照前面的数据返回数据。

  4. 当客户端收到数据返回的时候,将数据展示,同时用新的sync_key发起http请求,关注数据变化。


© 著作权归作者所有

通九互联科技
粉丝 133
博文 37
码字总数 21775
作品 1
大连
个人站长
私信 提问
加载中

评论(12)

通九互联科技
通九互联科技 博主

引用来自“叫我刀刀”的评论

websocket 感觉不错
http://javacore.cn/pages/143/springguidswebsocket-push-messages.html
websocket确实不错,很适合一些场景。不过这不代表Comet没有生存空间。根据观察WebQQ和桌面版微信似乎都是用类似的技术。
叫我刀刀
叫我刀刀
websocket 感觉不错
http://javacore.cn/pages/143/springguidswebsocket-push-messages.html
通九互联科技
通九互联科技 博主

引用来自“hantsy”的评论

WebSocket, SSE 都可以了, Comet 是在 Websocket 没标准化之前的一种方案,好像 DOJO Foundation 那时主推的技术。

Spring 中可以集成 RabbitMQ AMQP 协议和 Websocket扩展 SockJS,我们已经在项目中使用 WebSocket 和 Android、Web 页面交互的应用。
个人感觉Websocket比HTTP 2更实在一些。RabbitMQ作为系统内部队列是很好的选择,我们内部大量的使用RabbitMQ。
通九互联科技
通九互联科技 博主

引用来自“蛙牛”的评论

目前xmpp 的服务器提供了 BOSH (Bidirectional-streams Over Synchronous HTTP)的传输协议,可以应用于webim0
BOSH是不错的选择,不过XMPP在群组和离线上还是需要付出一些努力。
hantsy
hantsy
WebSocket, SSE 都可以了, Comet 是在 Websocket 没标准化之前的一种方案,好像 DOJO Foundation 那时主推的技术。

Spring 中可以集成 RabbitMQ AMQP 协议和 Websocket扩展 SockJS,我们已经在项目中使用 WebSocket 和 Android、Web 页面交互的应用。
蛙牛
蛙牛
目前xmpp 的服务器提供了 BOSH (Bidirectional-streams Over Synchronous HTTP)的传输协议,可以应用于webim0
通九互联科技
通九互联科技 博主

引用来自“zigzagroad”的评论

引用来自“zigzagroad”的评论

推模式和拉模式的主要区别是及时性,应该不存在文中所说的推模式下的“以空间换时间”的问题,因为这是业务相关性的设计问题:完全可以设计为“一份数据、多个接收者ID进行数据关联”的方式以节省存储空间、减小写入压力,这种设计也满足拉模式的要求。<br/><br/>关于读压力应该再说清楚一些:由于拉模式的先天不足(接收者不知道是否有自己的新的业务数据),需要根据业务需求定时向服务器请求获取业务数据,因为服务器存在数据读取压力:接收者一直询问“有没有我的数据”,服务器端在绝大多数情况下回复“没有”,这个回复“没有”的过程即是多出来的“读压力”。

推模式 可以设计为在独立线程(队列)或进程中进行消息推送,以避免影响操作发送消息的用户体验。<br/><br/>
拉模式则需要根据接收者的在线数量配备相应的服务器以应对巨量请求;也可以使用缓存来减轻(从数据库中)读取数据的压力。
其中推模式,我提的Broker,就是所谓的独立线程或进程。至于拉取模式使用缓存确实是一个好方式,我在前面关于IM群组数据同步的Blog中提到过。
通九互联科技
通九互联科技 博主

引用来自“zigzagroad”的评论

推模式和拉模式的主要区别是及时性,应该不存在文中所说的推模式下的“以空间换时间”的问题,因为这是业务相关性的设计问题:完全可以设计为“一份数据、多个接收者ID进行数据关联”的方式以节省存储空间、减小写入压力,这种设计也满足拉模式的要求。<br/><br/>关于读压力应该再说清楚一些:由于拉模式的先天不足(接收者不知道是否有自己的新的业务数据),需要根据业务需求定时向服务器请求获取业务数据,因为服务器存在数据读取压力:接收者一直询问“有没有我的数据”,服务器端在绝大多数情况下回复“没有”,这个回复“没有”的过程即是多出来的“读压力”。
拉取模式补充的非常好,确实我在文中没有写清楚。但是对于推送模式,由于在推送的一瞬间,所有的接收者都收到了一份数据复制,这个就造成了一定的空间换时间。你说的“一份数据、多个接收者ID进行数据关联”是一个不错的方式,不过和拉取模式中所有接收者共享一份数据相比,还是浪费了一定空间。
zigzagroad
zigzagroad

引用来自“zigzagroad”的评论

推模式和拉模式的主要区别是及时性,应该不存在文中所说的推模式下的“以空间换时间”的问题,因为这是业务相关性的设计问题:完全可以设计为“一份数据、多个接收者ID进行数据关联”的方式以节省存储空间、减小写入压力,这种设计也满足拉模式的要求。<br/><br/>关于读压力应该再说清楚一些:由于拉模式的先天不足(接收者不知道是否有自己的新的业务数据),需要根据业务需求定时向服务器请求获取业务数据,因为服务器存在数据读取压力:接收者一直询问“有没有我的数据”,服务器端在绝大多数情况下回复“没有”,这个回复“没有”的过程即是多出来的“读压力”。

推模式 可以设计为在独立线程(队列)或进程中进行消息推送,以避免影响操作发送消息的用户体验。<br/><br/>
拉模式则需要根据接收者的在线数量配备相应的服务器以应对巨量请求;也可以使用缓存来减轻(从数据库中)读取数据的压力。
zigzagroad
zigzagroad
推模式和拉模式的主要区别是及时性,应该不存在文中所说的推模式下的“以空间换时间”的问题,因为这是业务相关性的设计问题:完全可以设计为“一份数据、多个接收者ID进行数据关联”的方式以节省存储空间、减小写入压力,这种设计也满足拉模式的要求。<br/><br/>关于读压力应该再说清楚一些:由于拉模式的先天不足(接收者不知道是否有自己的新的业务数据),需要根据业务需求定时向服务器请求获取业务数据,因为服务器存在数据读取压力:接收者一直询问“有没有我的数据”,服务器端在绝大多数情况下回复“没有”,这个回复“没有”的过程即是多出来的“读压力”。
php+ajax长轮询实现web即时聊天

web im的实现方式有很多种: 1.普通轮询,原理通过js定时重复发送ajax请求服务端,获取数据后显示。 2. 长轮询,ajax请求服务端,服务端有数据会立即返回。服务端无数据时会一直等待,直到有...

hgditren
2017/01/10
0
0
Web消息推送的技术实现

说到Web推送技术,或者IM即时通讯技术,由于浏览器各种限制条件,很多情况下我们借助轮询技术的思想,实际上web推送技术不在少数。 1.轮询技术(Pull) 轮询技术具有更多的优点,其中之一便是兼...

IamOkay
2016/05/24
690
1
八问WebSocket协议:为你快速解答WebSocket热门疑问

本文由“小姐姐养的狗”原创发布于“小姐姐味道”公众号,原题《WebSocket协议 8 问》,收录时有优化和改动。感谢原作者的分享。 一、引言 WebSocket是一种比较新的协议,它是伴随着html5规范...

JackJiang2011
04/25
0
0
如何选择即时通讯应用的数据传输格式

前言 即时通讯应用(包括IM聊天应用、实时消息推送应用等)开发的前期技术选型时,关于数据传输格式的选择,在即时通讯开发者同行的眼里,是个极富争议话题。 精略分析一下,大概的原因在于:...

JackJiang-
2016/08/04
586
1
八问WebSocket协议:为你快速解答WebSocket热门疑问

一、引言 WebSocket是一种比较新的协议,它是伴随着html5规范而生的,虽然还比较年轻,但大多主流浏览器都已经支持。它使用方面、应用广泛,已经渗透到前后端开发的各种场景中。 对http一问一...

首席大胸器
04/25
117
0

没有更多内容

加载失败,请刷新页面

加载更多

Rust:最小化窗口后 CPU占用率高 (winit,glutin,imgui-rust)

最近试着用 imgui-rust 绘制界面,发现窗口最小化后CPU占用会增大。 查询的资料如下: https://github.com/rust-windowing/winit/issues/783 https://github.com/ocornut/imgui/issues/1151 ...

reter
16分钟前
4
0
cloud-zuul路由网关

九、zuul路由网关 概述 1.1 能干嘛 路由、过滤 路由基本配置 路由访问映射规则 十、springCloud config分布式配置中心

榴莲黑芝麻糊
17分钟前
5
0
Circuit Breaker模式

Circuit Breaker模式会处理一些需要一定时间来重连远程服务和远端资源的错误。该模式可以提高一个应用的稳定性和弹性。 问题 在类似于云的分布式环境中,当一个应用需要执行一些访问远程资源...

mskk
29分钟前
7
0
写论文之前的准备都有哪些?干货来了!

原文链接:https://www.lwfdy.com/archives/144.html 之前跟大家谈了许多有关于初稿修改以及写作事项需要注意的问题,那么今天我们来说一说,在写之前,我们需要做哪些准备呢,为了做到下笔如...

辅导员
36分钟前
6
0
idea快捷键

Alt + Enter 引入类 Ctrl + O 查看我们继承的类或者接口中的方法,以及我们要实现的方法 Ctrl + Alt + b 查看接口实现类中方法(就是我们使用接口编程时,在调用实现类方法处直接Ctrl+鼠标左...

行者终成事
44分钟前
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部