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),应用程序开 ...
随机推荐
- 使用restClient工具发送post请求并带参数
运行 restClient 点 Method选项卡,选中post方法 然后切换到 Body选项卡,点右边的 倒三角,选 String body 出现如下窗口: 点击右边红圈里的按钮,弹出窗口: 点是, ...
- 面向小数据集构建图像分类模型Keras
文章信息 本文地址:http://blog.keras.io/building-powerful-image-classification-models-using-very-little-data. ...
- HDU1083 :Courses(二分图匹配)
Cources Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total S ...
- java RSA加密解密实现(含分段加密)
该工具类中用到了BASE64,需要借助第三方类库:javabase64-1.3.1.jar 下载地址:http://download.csdn.net/detail/centralperk/50255 ...
- css-box-shadow
.arti_type_shadow { position: absolute; width: 100%; height: 6px; left:; right:; background-image: u ...
- Chinese Rings (九连环+矩阵快速幂)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2842 题目: Problem Description Dumbear likes to play th ...
- 微信小程序滑动选择器
实现微信小程序滑动选择效果 在wxml文件中,用一个picker标签代表选择器,bindchange是用户点击确定后触发的函数,index是picker自带的参数,用户点击确定后,bindchange ...
- CTSC/APIO2018 帝都一周游
day0 报道 上午早早就起来了,两点才到酒店,然后去简单试了试机子. 不得不说今年八十中的伙食变得瓜皮了啊,去年还是大叠的5元卷,今年变成了单张的*餐卷.不知道食堂吝啬什么,面条米饭都只有一点点,还 ...
- mysql 之修改初始密码
转载自:https://www.cnblogs.com/ivictor/p/5142809.html 为了加强安全性,MySQL5.7为root用户随机生成了一个密码,在error log中,关于er ...
- 自动化测试===Macaca环境搭建,自我总结
安装jdk 安装安卓sdk(打开sdk的时候出现问题linux===启动sdk manager下载配置sdk的时候报错的解决办法) 安装gradle,配置环境变量(MACACA===gradle下载和 ...