实现服务器端推送的几种方式

Web 应用都是基于 HTTP 协议的请求/响应模式,无法像 TCP 协议那样保持长连接,因此 Web 应用就很难像手机那样实现实时的消息推送。就目前来看,Web 应用的消息推送方式主要有以下几种:

1.Ajax 短轮询

Ajax 轮询主要通过页面端的 JS 定时异步刷新任务来实现数据的加载,但这种方式实时效果较差,而且对服务端的压力也较大。

2. 长轮询

长轮询主要也是通过 Ajax 机制,但区别于传统的 Ajax 应用,长轮询的服务器端会在没有数据时阻塞请求直到有新的数据产生或者请求超时才返回,之后客户端再重新建立连接获取数据,具体实现方式见图 1 所示。但长轮询服务端会长时间地占用资源,如果消息频繁发送的话会给服务端带来较大的压力。

图 1. 长轮询实现方式

3.WebSocket 双向通信

WebSocket 是 HTML5 中一种新的通信协议,能够实现浏览器与服务器之间全双工通信。如果浏览器和服务端都支持 WebSocket 协议的话,该方式实现的消息推送无疑是最高效、简洁的。并且最新版本的 IE、Firefox、Chrome 等浏览器都已经支持 WebSocket 协议,Apache Tomcat 7.0.27 以后的版本也开始支持 WebSocket。

RabbitMQ 简介

AMQP,即 Advanced Message Queuing Protocol,高级消息队列协议是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。AMQP 的主要特征是面向消息、队列和路由,可靠且安全。RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP 等,支持 Ajax。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。RabbitMQ 中有一些概念需要我们在使用前先搞清楚,主要包括以下几个:Broker、Exchange、Queue、Binding、Routingkey、Producter、Consumer、Channel。

1.Broker

简单来说就是消息队列服务器的实体。

2.Exchange

接收消息,转发消息到绑定的队列上,指定消息按什么规则,路由到哪个队列。

3.Queue

消息队列载体,用来存储消息,相同属性的 queue 可以重复定义,每个消息都会被投入到一个或多个队列。

4.Binding

绑定,它的作用就是把 Exchange 和 Queue 按照路由规则绑定起来。

5.RoutingKey

路由关键字,Exchange 根据这个关键字进行消息投递。

6.Producter

消息生产者,产生消息的程序。

7.Consumer

消息消费者,接收消息的程序。

8.Channel

消息通道,在客户端的每个连接里可建立多个 Channel,每个 channel 代表一个会话。

安装 RabbitMQ 服务

本文提出的方案是基于 RabbitMQ 消息服务器,因此最开始需要安装 RabbitMQ 服务及相关插件。RabbitMQ 是基于 Erlang 语言开发的,所以首先必须安装 Erlang 运行时环境。下面以 CentOS6.5 64 位服务器为例,讲述整个服务的安装过程:

1. 下载 erlang-R15B-02.1.el5.x86_64.rpm 并安装

1

# rpm -ivh erlang-R15B-02.1.el5.x86_64.rpm

2. 下载 rabbitmq-server-3.2.1-1.noarch.rpm 并安装

1

# rpm -ivh rabbitmq-server-3.2.1-1.noarch.rpm

3. 启用相关插件

1

# rabbitmq-plugins enable rabbitmq_management rabbitmq_web_stomp rabbitmq_stomp

4. 重启 RabbitMQ 服务

1

# service rabbitmq-server restart

5. 验证是否安装成功

此时我们可能通过 Web 浏览器来查看 RabbitMQ 的运行状态,浏览器中输入 http://{server_ip}:15672,用 guest/guest 默认的用户和密码登录后即可查看 RabbitMQ 的运行状态。

基于 RabbitMQ 的实时消息推送

RabbitMQ 有很多第三方插件,可以在 AMQP 协议基础上做出许多扩展的应用。Web STOMP 插件就是基于 AMQP 之上的 STOMP 文本协议插件,利用 WebSocket 能够轻松实现浏览器和服务器之间的实时消息传递,具体实现方式如下图 2 所示:

图 2. 浏览器和服务器之间的实时消息传递实现

消息发送者

下面举个例子来说明整个过程,以 Java 作为 RabbitMQ 客户端消息发送者,Web 浏览器作为消息消费者。

清单 1.Java 端代码

import java.io.IOException;import java.util.concurrent.TimeoutException;import com.rabbitmq.client.Channel;import com.rabbitmq.client.Connection;import com.rabbitmq.client.ConnectionFactory;public class Program { public static void main(String[] args) throws IOException, TimeoutException { ConnectionFactory factory = new ConnectionFactory(); factory.setHost("192.168.1.101"); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); channel.exchangeDeclare("rabbitmq

.net 实时通信_基于 RabbitMQ 的实时消息推送相关推荐

  1. 基于 RabbitMQ 的实时消息推送

    博主新开公众号"不太灵光的程序员" , 关注公众号,每日八点有干货推送 1 实现服务器端推送的几种方式 Web 应用都是基于 HTTP 协议的请求/响应模式,无法像 TCP 协议那 ...

  2. Worktile中的实时消息推送服务实现

    在团队协同工具worktile的使用过程中,你会发现无论是右上角的消息通知,还是在任务面板中拖动任务,还有用户的在线状态,都是实时刷新.Worktile中的推送服务是采用的是基于xmpp协议.erla ...

  3. Worktile 中百万级实时消息推送服务的实现

    Worktile 中百万级实时消息推送服务的实现 转自:http://www.360doc.com/content/15/0907/19/1073512_497529854.shtml 这是一个创建于 ...

  4. 未读消息(小红点),前端 与 RabbitMQ 实时消息推送实践,贼简单~

    前几天粉丝群里有个小伙伴问过:web 页面的未读消息(小红点)怎么实现比较简单,刚好本周手头有类似的开发任务,索性就整理出来供小伙伴们参考,没准哪天就能用得上呢. 之前在 <springboot ...

  5. 基于websocket的网页实时消息推送与在线聊天(上篇)

    文章目录 @[toc] 基于websocket的网页实时消息推送与在线聊天(上篇) "使用dwebsocket在django中实现websocket" websocket原理图 d ...

  6. 企业微信推送消息延迟_一种基于企业微信的消息推送方法与流程

    本发明涉及消息推送技术领域,特别涉及一种基于企业微信的消息推送方法. 背景技术: 随着微信公众号的普及,微信企业号也越来越受到人们的关注.而腾讯公司在微信企业号的基础上又进行了进一步的升级,提供了类似 ...

  7. 基于SpringBoot、RabbitMQ的Android消息推送平台搭建

    消息推送,类似于微信来新消息时出现在通知栏那种情景.很多APP都有这个功能.现在有很多第三方平台可以实现这个需要,但是有的公司对所要推送的消息保密要求比较高,不希望被第三方看到,可以使用此种方式进行消 ...

  8. 消息推送技术干货:美团实时消息推送服务的技术演进之路

    本文由美团技术团队分享,作者"健午.佳猛.陆凯.冯江",原题"美团终端消息投递服务Pike的演进之路",有修订. 1.引言 传统意义上来说,实时消息推送通常都是 ...

  9. Web 实时消息推送详解

    title: Web 实时消息推送详解 category: 系统设计 head: meta name: keywords content: 消息推送,短轮询,长轮询,SSE,Websocket,MQT ...

最新文章

  1. mysql创建外键级联更新_MySQL中利用外键实现级联删除、更新
  2. C语言以递归实现插入排序Insertion Sort算法(附完整源码)
  3. 机器学习-算法背后的理论与优化(part5)--结构风险最小(下)
  4. SAP WebIDE一个和Destination相关的问题 - OData下拉菜单里的Destination从哪里来的
  5. pid调节软件_非常实用的PID算法和PID控制原理
  6. docker中更新镜像——基于Prometheus
  7. CentOS 7安装配置vsftpd做FTP服务
  8. 剑指 Offer II 117. 相似的字符串
  9. gpt linux双系统安装win7系统分区格式化,如何在GPT分区格式上安装win7 64位系统
  10. NUC1429 WERTYU【输入输出+水题】
  11. Happy Birthday to You
  12. .NET实现中英文验证码
  13. ubuntu使用笔记
  14. 树莓派如何安装 Python 环境
  15. 谷歌翻译SDK (Google Translate SDK)的使用
  16. simditor 图片上传成功后修改图片地址
  17. html 链接长宽,CSS实现长宽比的几种方案【转载】
  18. Win11蓝屏代码0x0000001A的解决方法
  19. MODIS 产品介绍
  20. 我的推荐系统入门经验~

热门文章

  1. Qt-Focus事件处理,重写qpushbutton实现背景切换鼠标样式及eventFilter的用法
  2. 入门 Kotlin 和 Java 混合开发
  3. C++ 定时器的用法:SetTimer和Ontimer
  4. 各种优秀依赖库,大赞
  5. 单例模式双重校验锁_滴滴面试官:如何实现一个线程安全的单例模式
  6. powerdesigner显示工具面板_10分钟看懂Photoshop 绘画(画笔面板1-3)
  7. java线程runnable_Java 线程状态之 RUNNABLE
  8. Vue 消除Token过期时刷新页面的重复提示
  9. tensor flow lstm 图像 一条直线_【开源计划】图像配准中变形操作(Warp)的pytorch实现...
  10. python是如何实现进程池和线程池的_进程、线程、线程池和协程如何理解?