mq 探究
一 mq简介(message queue)
消息队列技术是分布式应用间交互信息的一种技术。
消息队列可驻留在内存或磁盘上,队列存储消息直到它们被应用程序读走
通过消息队列,应用程序可独立地执行-它们不需要知道彼此的位置,或在继续执行前不需要等待程序接收此消息
它接受收据,存储消息数据,转发消息
使用场景: 解耦,提高峰值处理能力,送达和排序保证,缓冲等
二 mq术语
1 producer
消息发送者,在mq称为生产者
2 consumer
消息接收者,在mq称为消费者
3 Queue
消息存储在队列(queue)中, 一个队列不受任何限制,它可以存储你想要存储的消息量,它本质上是一个无限的缓冲区。
多个生产者可以向同一个队列发送消息,多个消费者可以尝试从同一个队列中接收数据
在rabbitmq中,队列消息可以设置为持久化, 临时或自动删除
(1) 设置为持久化的队列,queue中的消息会在server本地硬盘存储一份,防止系统crash,数据丢失
(2) 设置为临时队列,queue中的数据在系统重启之后就会丢失
(3) 设置为自动删除的队列,当不存在用户连接到server,队列中的数据会被自动删除
4 Exchange
Exchange类似于数据通信网络中的交换机,提供消息路由策略。rabbitmq中,producer不是直接通过信道直接将消息发送给queue,而是先发送给Exchange。一个Exchange可以和多个Queue进行绑定,producer在传递消息的时候,会传递一个ROUTING_KEY,Exchange会根据这个ROUTING_KEY按照特定的路由算法,将消息路由给指定的queue。和queue一样,exchange也可设置为持久化,临时或者删除。
Exchange又下面4种类型,direct(默认),fanout, topic, headers,分别对应不用类型的转发策略
(1) direct
直接交互器,工作方式类似于单播,Exchange会将消息发送完全匹配ROUTING_KEY的queue
(2) fanout
广播式交互器,不管消息的ROUTING_KEY设置为什么,Exchange都会讲消息转发给所有绑定的Queue
(3) topic
主题交互器,工作方式类似于组播。Exchange会将消息转发和ROUTING_KEY匹配模式相同的所有队列,比如,ROUTING_KEY为user.stock的Message会转发给绑定匹配模式为 * .stock,user.stock, * . * 和#.user.stock.#的队列。( * 表是匹配一个任意词组,#表示匹配0个或多个词组)
(4) headers
消息体的header匹配(ignore)
5 Binding
所谓绑定就是将一个特定的 Exchange 和一个特定的 Queue 绑定起来。Exchange 和Queue的绑定可以是多对多的关系。
6 virtual host
在rabbitmq server上可以创建多个虚拟的message broker,又叫做virtual hosts (vhosts)。每一个vhost本质上是一个mini-rabbitmq server,分别管理各自的exchange,和bindings。vhost相当于物理的server,可以为不同app提供边界隔离,使得应用安全的运行在不同的vhost实例上,相互之间不会干扰。producer和consumer连接rabbit server需要指定一个vhost。
三 通信过程
假设P1和C1注册了相同的Broker,Exchange和Queue。P1发送的消息最终会被C1消费。基本的通信流程大概如下所示:
- P1生产消息,发送给服务器端的Exchange
- Exchange收到消息,根据ROUTINKEY,将消息转发给匹配的Queue1
- Queue1收到消息,将消息发送给订阅者C1
- C1收到消息,发送ACK给队列确认收到消息
- Queue1收到ACK,删除队列中缓存的此条消息
Consumer收到消息时需要显式的向rabbit broker发送basic.ack消息或者consumer订阅消息时设置auto_ack参数为true。在通信过程中,队列对ACK的处理有以下几种情况:
- 如果consumer接收了消息,发送ack,rabbitmq会删除队列中这个消息,发送另一条消息给consumer。
- 如果consumer接收了消息,但在发送ack之前断开连接,rabbitmq会认为这条消息没有被deliver,在consumer在次连接的时候,这条消息会被redeliver。
- 如果consumer接收了消息,但是程序中有bug而忘记了ack,rabbitmq会重复发送消息。
- rabbitmq2.0.0和之后的版本支持consumer reject某条(类)消息,可以设置参数中的reject为true达到目的,那么rabbitmq将会把消息发送给下一个注册的consumer。
Exchange和Queue是最核心的组件,Exchange和Queue是在rabbitmq server端(又叫broker端),producer和consumer在应用端
生产者:
首先创建一个connection通过socket连接去和服务器连接起来(需要传目的服务器的ip,用户名,密码)
接着创建一个channel,这是大部分要做的事情所在
要发送消息,必须声明一个队列,然后我们可以向队列发布消息
消息的内容是字节数组,在使用时,注意编码问题。
消费者:
当队列里有消息时,消费者要随时能够从队列里获取消息,所以我需要一直运行它,让它监听消息。
生产者要发送消息,一定要事先知道消费消息的程序的对列是哪个。所以,在运行生产者程序前,需要先启动消费者程序。因此声明队列,就应该在消费者程序中完成。
这个好好看下: 写的好到爆
http://blog.csdn.net/lovesomnus/article/details/51776942
mq 探究的更多相关文章
- 【框架学习与探究之消息队列--EasyNetQ(1)】
前言 本文欢迎转载,实属原创,本文原始链接地址:http://www.cnblogs.com/DjlNet/p/7603554.html 废话 既然都是废话了,所以大家就可以跳过了,这里是博主有事没事 ...
- RocketMQ专题2:三种常用生产消费方式(顺序、广播、定时)以及顺序消费源码探究
顺序.广播.定时任务 前插 在进行常用的三种消息类型例子展示的时候,我们先来说一说RocketMQ的几个重要概念: PullConsumer与PushConsumer:主要区别在于Pull与Pus ...
- 探究:nuget工具对不再使用的dll文件的处理策略
背景介绍 nuget是.net平台有效的包管理工具,相信每个C#开发者对它都不陌生. 本文我们来探究一下nuget对不再使用的dll文件的处理策略,分为如下2个场景: 场景A:包A1.0原来包含New ...
- 探究javascript对象和数组的异同,及函数变量缓存技巧
javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...
- [原] KVM 虚拟化原理探究(1)— overview
KVM 虚拟化原理探究- overview 标签(空格分隔): KVM 写在前面的话 本文不介绍kvm和qemu的基本安装操作,希望读者具有一定的KVM实践经验.同时希望借此系列博客,能够对KVM底层 ...
- [原] KVM 虚拟化原理探究 —— 目录
KVM 虚拟化原理探究 -- 目录 标签(空格分隔): KVM KVM 虚拟化原理探究(1)- overview KVM 虚拟化原理探究(2)- QEMU启动过程 KVM 虚拟化原理探究(3)- CP ...
- [原] KVM 虚拟化原理探究(6)— 块设备IO虚拟化
KVM 虚拟化原理探究(6)- 块设备IO虚拟化 标签(空格分隔): KVM [toc] 块设备IO虚拟化简介 上一篇文章讲到了网络IO虚拟化,作为另外一个重要的虚拟化资源,块设备IO的虚拟化也是同样 ...
- [原] KVM 虚拟化原理探究(5)— 网络IO虚拟化
KVM 虚拟化原理探究(5)- 网络IO虚拟化 标签(空格分隔): KVM IO 虚拟化简介 前面的文章介绍了KVM的启动过程,CPU虚拟化,内存虚拟化原理.作为一个完整的风诺依曼计算机系统,必然有输 ...
- [原] KVM 虚拟化原理探究(4)— 内存虚拟化
KVM 虚拟化原理探究(4)- 内存虚拟化 标签(空格分隔): KVM 内存虚拟化简介 前一章介绍了CPU虚拟化的内容,这一章介绍一下KVM的内存虚拟化原理.可以说内存是除了CPU外最重要的组件,Gu ...
随机推荐
- [线性代数] 矩阵代数基础 Basic Matrix Algebra
Overview: Matrix algebra Matrix algebra covers rules allowing matrices to be manipulated algebraical ...
- combobox放入数据
页面 <th width="15%">国际分类号</th><td width="30%"> <select cla ...
- create table:使用SELECT语句创建表
oracle下直接(创建表) create table newtablename as select * from oldtablename sqlserver的语法是(自动创建表) : select ...
- SVG动画示例
package com.loaderman.customviewdemo; import android.graphics.drawable.Animatable; import android.os ...
- Java中声明泛型方法
泛型是什么意思在这就不多说了,而Java中泛型类的定义也比较简单,例如:public class Test<T>{}.这样就定义了一个泛型类Test,在实例化该类时,必须指明泛型T的具体类 ...
- 017-mac下project
下载安装使用 http://www.3322.cc/soft/35716.html
- Greenwich.SR2版本的Spring Cloud Feign实例
前面我们了解了Spring Cloud Ribbon和Hystrix,在使用上它们基本上会成队出现,那么是不是可以把它们组合起来使用?而且我们发现,在服务消费方a-beautiful-client里通 ...
- 最简单的freemarker用法实例
1.下载freemarker-2.3.19.jar到web项目的lib下. 2.新建freemarker引擎协助类 package com.bxsurvey.sys.process.uti ...
- Github排名靠前的iOS库
//iOS第三方开源库的吐槽和备忘 http://blog.ibireme.com/2013/09/23/ios-third-party-libs/#more-41361 //整理了一份Github上 ...
- LNMP一键环境安装多PHP版本共存的方法
多PHP版本只支持LNMP模式,LNMPA.LAMP模式下不支持!要使用多PHP先安装多PHP版本,在lnmp1.4源码(lnmp1.3的不行哦)目录下运行:./install.sh mphp 按提示 ...