rabbitmq的扩展知识

1.消息队列:
  
    1.1 几个概念说明:
        Broker:简单来说就是消息队列服务器实体。
     Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。
     Queue:消息队列载体,每个消息都会被投入到一个或多个队列。
     Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。
     Routing Key:路由关键字,exchange根据这个关键字进行消息投递。
     vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。每个虚拟主机是隔离的,互不影响.
     producer:消息生产者,就是投递消息的程序。
     consumer:消息消费者,就是接受消息的程序。
     channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。

1.2 基本概念说明:
        exchange:交换机,决定了消息路由规则,简单的说就是消息根据规则发送到哪个队列上去.ps:交换机定义之后一般是无法在设置其它属性,除非删除了再重新定义一个新的.        queue:消息队列.
        channel:进行消息读写的通道,简单的说就是在一个Http长连接下面开设通道,类似电缆里面的光纤一样,一个电缆里面可以有很多个光纤,这些光纤共用一个电缆也就是共用一个TCP连接,性能很好.       
        Bind:绑定了queue和exchange,意即为符合什么样路由规则的消息,将会放置入哪一个消息队列;简单的说就是exchange和queue之间的桥梁,exchange定义了路由规则,bind 就把这个路由规则和消息队列绑定起来.

1.3 消息队列的使用过程大概如下:
        (1)客户端连接到消息队列服务器,打开一个channel。
     (2)客户端声明一个exchange,并设置相关属性。
     (3)客户端声明一个queue,并设置相关属性。
     (4)客户端使用routing key,在exchange和queue之间建立好绑定关系。
     (5)客户端投递消息到exchange。

2.消费模式    :推(push)模式和拉(pull)模式。
       Pull(推模式)是指由Broker(中介,这里是队列),主动推送消息至消费端,实时性较好,不过需要一定的流制机制来确保服务端推送过来的消息不会压垮消费端。而拉模式是指消费端主动向Broker端请求拉取(一般是定时或者定量)消息,实时性较推模式差,但是可以根据自身的处理能力而控制拉取的消息量。

3. 消息持久
    如何进行消息持久化操作:
        1.将交换机(exchange)持久化
        2.将通道(channel)持久化
        3.消息发送时设置可持久化

RabbitMQ支持消息的持久化,也就是数据写在磁盘上,为了数据安全考虑,我想大多数用户都会选择持久化。消息队列持久化包括3个部分:
  (1)exchange持久化,在声明时指定durable => 1
  (2)queue持久化,在声明时指定durable => 1
  (3)消息持久化,在投递时指定delivery_mode => 2(1是非持久化)

如果exchange和queue都是持久化的,那么它们之间的binding也是持久化的。如果exchange和queue两者之间有一个持久化,一个非持久化,就不允许建立绑定。

4.消息发送步骤:
  exchange接收到消息后,就根据消息的key和已经设置的binding,进行消息路由,将消息投递到一个或多个队列里。

exchange也有几个类型,完全根据key进行投递的叫做Direct交换机,例如,绑定时设置了routing key为”abc”,那么客户端提交的消息,只有设置了key为”abc”的才会投递到队列。对key进行模式匹配后进行投递的叫做Topic交换 机,符号”#”匹配一个或多个词,符号”*”匹配正好一个词。例如”abc.#”匹配”abc.def.ghi”,”abc.*”只匹配”abc.def”。还有一种不需要key的,叫做Fanout交换机,它采取广播模式,一个消息进来时,投递到与该交换机绑定的所有队列。

原文地址:https://www.cnblogs.com/zhangxue/p/9182143.html

时间: 2024-10-12 21:38:34

rabbitmq的扩展知识的相关文章

038改变状态栏的颜色(扩展知识:关于iOS不同版本的消息通知知识)

效果如下: ViewController.h 1 #import <UIKit/UIKit.h> 2 3 @interface ViewController : UIViewController 4 @end ViewController.m 1 #import "ViewController.h" 2 3 @interface ViewController () 4 - (void)userNotificationDidPush:(UIApplication *)appl

【扩展知识4】指针家的野孩子和地址打印

[扩展知识4] 1.        野指针 2.        %p的使用 ( 1 )野指针 定义:野指针"不是NULL指针,是指向"垃圾"内存的指针.[重量级危险人物] 野指针的成因: 1.        指针变量定义时没有初始化. 2.        指针变量free后没有置于NULL. 3.        指针的使用超出范围 程序举例: [ 程序1 ] //指针变量没有初始化 #include<stdio.h> int main( void) { char

【扩展知识2】函数strlen()和非函数sizeof的使用

[扩展知识2]函数strlen()和非函数sizeof的使用 [扩展目录] strlen函数 sizeof ( 1 )函数strlen() 原型:size_tstrlen ( const char * str ); 返回C字符串(仅仅支持此类型)的长度. //strlen()的使用 #include <stdio.h> int main( void ) { chararray[ ]= "zhijiandeweixiao"; //指尖的微笑 //array为数组的首个地址 p

【扩展知识3】数组的一些难事

[扩展知识3]数组的一些难事 扩展目录 1.        &array+ 1 2.        array+1 3.        &array[ 0 ]+ 1 关于&array+ .array+ 1 和&array[0]+ 1的问题,特别难缠,特难搞懂~-~.所以今天拿来讲解讲解. 由于数组中的各元素的存储单元是连续分配的,因此可以用指针形式来访问数组,数组名就是该数字的首个地址. 如: intarray[100]; array 就是该数组的首地址,其值等于&

[面试题总结及扩展知识]同一进程中的线程共享的资源

又是一道腾讯2014年的面试题: A,栈   B,数据段    C,寄存器组    D,文件描述符 这是解释以及相对应的扩展知识: 线程的共性如下: 线程共享的环境包括:进程代码段. 进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯). 进程打开的文件描述符. 信号的处理器.  进程的当前目录和进程用户ID与进程组ID. 线程的个性如下: 1.线程ID     每个线程都有自己的线程ID,这个ID在本进程中是唯一的.进程用此来标识线程. 2.寄存器组的值     由于线程间是并

【扩展知识3】一些困难的数组

[扩展知识3]一些困难的数组 扩展文件夹 1.        &array+ 1 2.        array+1 3.        &array[ 0 ]+ 1 关于&array+ .array+ 1 和&array[0]+ 1的问题.特别难缠,特难搞懂~-~. 所以今天拿来解说解说. 因为数组中的各元素的存储单元是连续分配的,因此能够用指针形式来訪问数组.数组名就是该数字的首个地址. 如: intarray[100]; array 就是该数组的首地址,其值等于&am

【扩展知识2】学习一些重要的知识

[扩展知识二]学习一些重要的知识 [扩展目录] 1.      布尔型,浮点型.指针的变量与0值得比较 2.      类型转换 3.      关键字sizeof和strlen()函数 A:bool变量与0值得比较 布尔型,用于表示布尔值,即逻辑值TRUE(真)和FALSE (假).在C语言中非零即为真,零就为假. 较合理的写法是: //测试环境:win7_32+VC++6.0.有的编译器可能不识bool //bool变量与0,1的比较 #include <stdio.h> int main

java Map扩展知识练习

/* map扩展知识. map集合被使用是因为映射关系. 编程实现以下数据: "yureban" -> "01" "zhangsan" "yureban" -> "02" "lisi" "jiuyeban" -> "01" "wangwu" "jiuyeban" -> "02

【扩展知识6】typedef的使用

[扩展知识]typedef的使用 扩展目录 1.        typedef与#define不同处 2.        typedef的使用 A:typedef与#define不同处 typedef是关键字,具有一种高级数据特性,它能够为已经存在的类型重新命别名(标签).它的功能与#define相似,但有3个不同之处:(在<C语言第二回>中也有相关的知识点) 1.        与#define不同,typedef给出的符号仅限于类型,而不是绝对值 2.        typedef的解释有