Message Queue中的推与拉(转)
Message Queue的设计和实现(7)
http://mp.weixin.qq.com/s/zQdDBAHu1UgJJzxH2eCHgQ
数据发送中的推与拉。
当MQ要把数据给消费者的时候,就涉及到数据的传递方式。一种是MQ主动的将数据推给消费者;而另一种,则是消费者主动去拉取。两种方式各有优缺,我们就一个个的来讲。(无非就是在爱情中谁主动的问题^_^)
推模式
推模式很明显,主动方应该是MQ。在实现的时候却有两种方式。
1、MQ知道消费者的IP和端口,主动发起连接,推送数据。
这种方式是最容易想到和实现的。socket在connect的时候,需要IP:Port。只要这两个数据存在了,MQ就很轻松的将数据推送出去。但是,问题来了,怎么知道IP和Port。
这里有两种方式:
A、MQ存储有所有消费者的列表。就是手动或者半自动的将所有消费者的列表配置到MQ中。这种方式实现简单,但是灵活性太差,扩展性不好;
B、消费者自动注册到MQ。当消费者启动以后,调用MQ提供的regist方法,自动将自己的IP和Port提交到MQ。注册成功后,MQ将信息放入发送meta数据中,进行推送。
第二种方式扩展性比第一种好很多,但是复杂性也相对比第一种要大一些。
2、消费者主动连接到MQ,再由MQ进行信息推送。
这种方式的实现必须采用长连接的方式。即:消费者主动connect到MQ,然后两者维持连接不断开。当有数据到来时,MQ利用这个已有的长连接,将对应的数据推送到消费者。
这种方式实现的难度比较高,涉及到长连接维持,以及连接的存活管理。而且如果后端有大量的消费者的话,MQ会消耗比较多的连接资源。
以上聊的是推的模式。这种模式及时性非常好,数据一到达,立马可以push到消费者,基本没有延迟。但是实现复杂度和灵活性会稍微麻烦一些。
拉模式
这种模式就比较简单,就是消费者主动。每次由消费者主动去获取信息。不论长短连接都可以。MQ也不用维持连接状态和消费者信息,只要你来获取,我就把数据给你。
这种方式的好处在于实现非常简单,MQ无负担,不用记录消费者的信息。如果服务挂掉或者重启,也不用担心消费者信息状态丢失。因为他自己会来主动获取。
不足之处在于有可能存在短暂延迟。
在实现的时候,也可以有改进。比如,消费者去MQ拉取数据,如果拉取后没有数据,可以停留一定时间(比如:100毫秒)再去拉取。如果拉取有数据,则不用停留,直接拉取。拉的时候也可以走批量拉取,避免数据堆积。
总的来讲,推拉模式都是可行的,实现复杂度其实也都还好,大家可以根据自身业务的特点来定制这两种模式。
Message Queue中的推与拉(转)的更多相关文章
- 微软消息队列-MicroSoft Message Queue(MSMQ)队列的C#使用
目录 定义的接口 接口实现 建立队列工厂 写入队列 获取消息 什么是MSMQ Message Queuing(MSMQ) 是微软开发的消息中间件,可应用于程序内部或程序之间的异步通信.主要的机制是:消 ...
- (七)RabbitMQ消息队列-通过fanout模式将消息推送到多个Queue中
原文:(七)RabbitMQ消息队列-通过fanout模式将消息推送到多个Queue中 前面第六章我们使用的是direct直连模式来进行消息投递和分发.本章将介绍如何使用fanout模式将消息推送到多 ...
- 单线程模型中Message、Handler、Message Queue、Looper之间的关系
1. Android进程 在了解Android线程之前得先了解一下Android的进程.当一个程序第一次启动的时候,Android会启动一个LINUX进程和一个主线程.默认的情况下,所有该程序的组件都 ...
- 详解boost库中的Message Queue .
Message Queue(后文简写成MQ或消息队列)是boost库中用来封装进程间通信的一种实现,同一台机器上的进程或线程可以通过消息队列来进行通迅.消息队列中的消息由优先级.消息长度.消息数据三部 ...
- 聊聊Postgres中的IPC之SI Message Queue
在 PostgreSQL中,每一个进程都有属于自己的共享缓存(shared cache).例如,同一个系统表在不同的进程中都有对应的Cache来缓存它的元组(对于RelCache来说缓存的是一个Rel ...
- ActiveMQ 到底是推还是拉?
http://activemq.apache.org/destination-options.html 1. consumer 的配置参数如下图: 配置consumer的示例: public void ...
- C++ message queue 消息队列入门
说明:当我们有多个线程以不同的速度运行并且我们想要以特定的顺序从一个线程向另一个线程发送信息时,消息队列可能会有用. 这个想法是,发送线程将消息推送到队列中,而接收线程将消息按自己的步调弹出. 只要发 ...
- 初识Message Queue之--基础篇
之前我在项目中要用到消息队列相关的技术时,一直让Redis兼职消息队列功能,一个偶然的机会接触到了MSMQ消息队列.秉着技术还是专业的好为原则,对MSMQ进行了学习,以下是我个人的学习笔记. 一.什么 ...
- MSMQ(Microsoft Message Queue)
http://www.cnblogs.com/sk-net/archive/2011/11/25/2232341.html 利用 MSMQ(Microsoft Message Queue),应用程序开 ...
随机推荐
- 【树形DP】【UVA10859】 Placing Lampposts
传送门 Description 给定一个\(n\)个点\(m\)条边的无向无环图,选择尽量少的节点,使得所有边都至少有一个顶点被选择.在这个基础上,要求有两个顶点被选择的边数尽可能大 Input 多组 ...
- CentOS安装pip
环境 操作系统:CentOS 6.7 32-bit Python:2.6.6 安装 先安装setuptools和wget yum -y install wget wget https://pypi.p ...
- HDU 5651 逆元
xiaoxin juju needs help Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/ ...
- springboot-部署到centos7
环境 系统:centos7 64位 安装jdk 第一步:下载 先进入官网:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-do ...
- 阿里C++研发实习二面和三面面经
下午连着面了阿里爸爸的二面和三面,非常不明白别人的三面都是hr了,为什么我还是在技术面,难道面了个假阿里.不管怎么样,来篇面经攒攒人品. 二面 第一次遇到这么严肃的面试官,居然可以全程无表情的,面了这 ...
- PAT (Top Level)1002. Business DP/背包
As the manager of your company, you have to carefully consider, for each project, the time taken to ...
- 编译redis时 提示make cc Command not found
在linux系统上对redis源码进行编译时提示提示“make cc Command not found,make: *** [adlist.o] Error 127”. 这是由于系统没有安装gcc环 ...
- 【Foreign】光 [莫比乌斯反演]
光 Time Limit: 10 Sec Memory Limit: 128 MB Description 天猫有一个长方形盒子,长宽分别为A,B. 这个长方形盒子的内壁全部是镜面. 天猫在这个盒子 ...
- 「6月雅礼集训 2017 Day8」gcd
[题目大意] 定义times(a, b)表示用辗转相除计算a和b的最大公约数所需步骤. 那么有: 1. times(a, b) = times(b, a) 2. times(a, 0) = 0 3. ...
- 01-UIScrollView01-大图片展示
源代码下载链接:01-UIScrollView01-大图片展示.zip283.7 KB // // MJViewController.m // 01-UIScrollView01-大图 ...