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. Codeforces Round #329 (Div. 2)A 字符串处理

    A. 2Char time limit per test 2 seconds memory limit per test 256 megabytes input standard input outp ...

  2. [转载][mysql]mysql字符集干货

    源地址:http://www.blogjava.net/zyskm/archive/2013/04/09/361888.html 字符集的概念大家都清楚,校对规则很多人不了解,一般数据库开发中也用不到 ...

  3. udhcpd源码分析4--获取client报文及发包动作

    1:重要的结构体 获取的报文是UDP的payload部分,结构体struct dhcpMessage描述了dhcp报文的结构. /* packet.h */ struct dhcpMessage { ...

  4. POJ 3111 二分

    K Best Time Limit: 8000MS   Memory Limit: 65536K Total Submissions: 10507   Accepted: 2709 Case Time ...

  5. Jade模板引擎学习(一)安装及基本语法

    Jade是一款高性能简洁易懂的模板引擎,Jade是Html的Javascript实现,在服务端(NodeJS)及客户端均有支持. 一.功能 客户端支持  超强的可读性 灵活易用的缩进 块扩展 代码默认 ...

  6. You can't specify target table 'table' for update in FROM clause

    delete from table1 where ID not in(select max(ID) ID from table1 group by row1) and row1 ) # 出现错误 # ...

  7. Java反射中method.isBridge() 桥接方法

    桥接方法是 JDK 1.5 引入泛型后,为了使Java的泛型方法生成的字节码和 1.5 版本前的字节码相兼容,由编译器自动生成的方法.我们可以通过Method.isBridge()方法来判断一个方法是 ...

  8. Windows、Linux及Mac查看端口和杀死进程

    本文介绍如何在Windows.Linux及Mac下查看端口和杀死进程. Windows下查看端口和杀死进程 查看占用端口号的进程号:netstat –ano | findstr "指定端口号 ...

  9. 例子Architecting Android…The clean way?----代码分析

    Presention层:   整个应用启动的时候,就执行依赖的初始化.编译项目之后,Dagger依赖框架使用ApplicationComponent生成一个DaggerApplicationCOmpo ...

  10. Android控件——ImageView

     android:orientation="vertical"  修改布局文件垂直排列 放置图片: 1.通过src引入图片: 2.通过background引入背景图片 3.baco ...