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中的推与拉(转)的更多相关文章

  1. 微软消息队列-MicroSoft Message Queue(MSMQ)队列的C#使用

    目录 定义的接口 接口实现 建立队列工厂 写入队列 获取消息 什么是MSMQ Message Queuing(MSMQ) 是微软开发的消息中间件,可应用于程序内部或程序之间的异步通信.主要的机制是:消 ...

  2. (七)RabbitMQ消息队列-通过fanout模式将消息推送到多个Queue中

    原文:(七)RabbitMQ消息队列-通过fanout模式将消息推送到多个Queue中 前面第六章我们使用的是direct直连模式来进行消息投递和分发.本章将介绍如何使用fanout模式将消息推送到多 ...

  3. 单线程模型中Message、Handler、Message Queue、Looper之间的关系

    1. Android进程 在了解Android线程之前得先了解一下Android的进程.当一个程序第一次启动的时候,Android会启动一个LINUX进程和一个主线程.默认的情况下,所有该程序的组件都 ...

  4. 详解boost库中的Message Queue .

    Message Queue(后文简写成MQ或消息队列)是boost库中用来封装进程间通信的一种实现,同一台机器上的进程或线程可以通过消息队列来进行通迅.消息队列中的消息由优先级.消息长度.消息数据三部 ...

  5. 聊聊Postgres中的IPC之SI Message Queue

    在 PostgreSQL中,每一个进程都有属于自己的共享缓存(shared cache).例如,同一个系统表在不同的进程中都有对应的Cache来缓存它的元组(对于RelCache来说缓存的是一个Rel ...

  6. ActiveMQ 到底是推还是拉?

    http://activemq.apache.org/destination-options.html 1. consumer 的配置参数如下图: 配置consumer的示例: public void ...

  7. C++ message queue 消息队列入门

    说明:当我们有多个线程以不同的速度运行并且我们想要以特定的顺序从一个线程向另一个线程发送信息时,消息队列可能会有用. 这个想法是,发送线程将消息推送到队列中,而接收线程将消息按自己的步调弹出. 只要发 ...

  8. 初识Message Queue之--基础篇

    之前我在项目中要用到消息队列相关的技术时,一直让Redis兼职消息队列功能,一个偶然的机会接触到了MSMQ消息队列.秉着技术还是专业的好为原则,对MSMQ进行了学习,以下是我个人的学习笔记. 一.什么 ...

  9. MSMQ(Microsoft Message Queue)

    http://www.cnblogs.com/sk-net/archive/2011/11/25/2232341.html 利用 MSMQ(Microsoft Message Queue),应用程序开 ...

随机推荐

  1. requireJs使用方法项目实例

    首先,定义 main.js  和 事件处理的公共 js main.js 主要是定义引用名称和路径的对应关系 事件绑定模块: 写jsp页面: jsp中先引入 require.js 和 main.js 然 ...

  2. spring 整合 redis 单机版

    增加spring配置文件: application-jedis.xml <?xml version="1.0" encoding="UTF-8"?> ...

  3. ACE的安装

    转载于:http://www.cnblogs.com/TianFang/archive/2006/12/03/580714.html ACE的安装是一件比较麻烦的事情,这里简单的记录了我在VS2005 ...

  4. Codeforces Round #401 (Div. 2) A B C 水 贪心 dp

    A. Shell Game time limit per test 0.5 seconds memory limit per test 256 megabytes input standard inp ...

  5. HDU 3507 斜率优化dp

    Print Article Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)To ...

  6. [LeetCode] 递推思想的美妙 Best Time to Buy and Sell Stock I, II, III O(n) 解法

    题记:在求最大最小值的类似题目中,递推思想的奇妙之处,在于递推过程也就是比较求值的过程,从而做到一次遍历得到结果. LeetCode 上面的这三道题最能展现递推思想的美丽之处了. 题1 Best Ti ...

  7. [LeetCode] 18. 4Sum ☆☆

    Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = tar ...

  8. LightOJ 1151 - Snakes and Ladders 高斯消元+概率DP

    首先来个期望的论文,讲的非常好,里面也提到了使用线性方程组求解,尤其适用于有向图的期望问题. 算法合集之<浅析竞赛中一类数学期望问题的解决方法> http://www.lightoj.co ...

  9. HDU5875 Function

    题意:给定序列,有m个区间的询问,求每个询问a[l]%a[l+1]...%a[r]后的值.(N<=10^5) 思路:这题如果使用线段树,可能会由于姿势和卡常数原因TLE,由于数据好像比较奇怪(? ...

  10. C11简洁之道:函数绑定

    1.  可调用对象 在C++中,有“可调用对象”这么个概念,那么什么是调用对象呢?有哪些情况?我们来看看: 函数指针: 具有operator()成员函数的类对象(仿函数): 可以被转换为函数指针的类对 ...