文档章节

rabbitMQ 基础概念介绍

lc_fly1
 lc_fly1
发布于 02/12 15:11
字数 1174
阅读 386
收藏 29

传统的队列消息服务,有三个概念,生产者,消费者,队列;rabbitMQ在概念上多做了一层抽象,在发消息者和队列之间,加入了交换器。

消息是先发到交换器,由交换器再根据调度策略再把消息给队列;

   rabbitMQ重要概念:

 

     虚拟主机(Virtual Host):

             相当于mini版的rabbitMQ服务,每个虚拟机中都包含交换机、对接、绑定。

             创建用户并分配对应的虚拟机以达到权限控制,不同的用户之间不会相互影响。

              

     交换机(Exchange):

             根据策略及路由键发送消息到对应的队列,如果没有绑定队列,则直接丢弃掉发过来的消息;

 

     路由键(routing key):

             作为交换机发送消息到队列的key,根据路由键+交换机策略,将消息发送至对应的队列;

 

     绑定(Binding):

             队列需要和交换机进行绑定,多对多的关系;

          

     Exchange分发策略:

          direct:

               完全匹配模式,即路由键与队列名称完全匹配,交换机会把消息发送给与路由键名字一致的队列;

                   

          fanout:

             多播模式,不处理路由键,会发送给所有绑定了该交换机的队列;

               

          topic:

             模糊匹配模式,路由键、队列名都以"."标识符分隔,以“*”,“#”进行匹配,“*”表示一个,“#”表示0或多个;

              

                

          我们准备发送关于动物的消息。消息会附加一个选择键包含3个标识符(两个点隔开)。

         第一个标识符描述动物的速度,第二个标识符描述动物的颜色,第三个标识符描述动物的物种:<speed>.<color>.<species>。

          我们创建3个绑定键:Q1与*.orange.*绑定Q2与*.*.rabbit和lazy.#绑定。

          可以简单的认为:

          Q1对所有的橙色动物感兴趣。

          Q2想要知道关于兔子的一切以及关于懒洋洋的动物的一切。

          quick.orange.rabbit的选择键的消息将会被转发到两个队列。

          lazy.orange.elephant的消息也会被转发到两个队列。

          quick.orange.fox只会被转发到Q1。

          lazy.brown.fox将会被转发到Q2。      

          lazy.pink.rabbit虽然与两个绑定键匹配,但是也只会被转发到Q2一次。

          quick.brown.fox不能与任何绑定键匹配,所以会被丢弃。

          发送一个或者四个标识符的选择键,类似:orange,quick.orange.male.rabbit,这些选择键不能与任何绑定键匹配,所以消息将会被丢弃。

          另一方面,lazy.orange.male.rabbit,虽然是四个标识符,也可以与lazy.#匹配,从而转发至Q2。

          注:主题类型的转发器非常强大,可以实现其他类型的转发器。

          当一个队列与绑定键#绑定,将会收到所有的消息,类似fanout类型转发器。

          当绑定键中不包含任何#与*时,类似direct类型转发器。

           

 

   消息确认机制:

       生产者确认机制:

              在使用rabbitMQ过程中,可以使用消息持久化操作来解决因为服务器的异常导致信息丢失。但生产者消息发送出去后,默认情况下是生产者是不清楚消息是否真正到达队列的。rabbitMQ提供了两种方式解决;

              通过事务机制实现:

                    使用txSelect(),txCommit(),txRollback()方法;但该方式耗时较长

              通过将交换机设置成confirm模式实现:

                    设置exange为confirm模式,当消息被投递到匹配的队列之后,就会发送一个确认给生产者;如果消息是可持久化的,那么确认消息会在写入磁盘之后发出。confirm模式最大的好处在于他是异步的,生产者可以通过回调方法来处理该确认消息,如果因为rabbitMQ自身内部原因导致丢失,会发送一条nack消息,同样可以在回调方法中处理;

          消费者确认机制:

                消费者在声明队列时,可以指定toack参数,为true,则是自动应答;false手动应答;

                    自动应答就是当消息被消费后,即RabbitMQ会进行删除消息;如果当消息处理过程中出现宕机或者其他原因导致该消息没有处理完毕,则该消息就丢失了。

                    手动应答,则是需要显示发挥ack信号,如消息被消费后,消费端并没有发回ack信号且消费者断开,则rabbitMQ会将消息重新进入队列等待下一个消费者;

                    这样就能保证每个消息都能正常处理了;

© 著作权归作者所有

共有 人打赏支持
lc_fly1
粉丝 6
博文 15
码字总数 9733
作品 0
武汉
程序员
php| 初探 rabbitmq

date: 2018-09-03 21:30:23 title: php| 初探 rabbitmq description: 零零散散折腾了 rabbitmq 几次, 归纳总结一下先 经常看到消息队列( MQ ), 实战中比较少, 说说我的一些粗线的理解: 引入消...

daydaygo
09/05
0
0
Spring Boot+RabbitMQ学习笔记

RabbitMQ RabbitMQ 是一个由 Erlang 语言开发的 的开源实现。最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。 消息队列 先从基础开始,加...

听_风
06/07
0
0
RabbitMQ-理解消息通信-虚拟主机和隔离

每个RabbitMQ服务器都能创建虚拟的消息服务器,我们称之为虚拟主机(vhost)每一个vhost本质上是一个mini版的RabbitMQ服务器,拥有自己的队列、交换器和绑定等等 更重要的是,他拥有自己的权限...

yzy121403725
05/21
0
0
SpringBoot笔记(十一)RabbitMQ

安装Erlang RabbitMQ基于Erlang,所以得先安装Erlang http://www.erlang.org/downloads 根据自己的系统选择下载,安装完了,配置一下path即可 windows默认安装路径: 验证: 有时候可能需要重...

世外大帝
04/25
0
0
【Python模块】rabbitMQ

RabbitMQ介绍: 父进程与子进程间,同一父继承可以用multiprocess的Manager模块来实现数据互访。 作用:RabbitMQ是为了实现相互独立的两个进程数据互访。 应用场景:不需要立即操作的数据。比...

等你的破船
08/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

android引入jar的一个错误

使用eclipse+sdk开发android的app,如果要引入一个jar包,可以放到./libs/xxx.jar路径下就可以了。今天引入一个aaa.jar的包,也放到./libs/aaa.jar路径下。app编译没有问题,但一运行就如下的...

kyle960
18分钟前
0
0
django修改密码强制退出机制

起因 BUG出现 系统升级django版本后经常出现自动退出登录 问题复现 系统升级django(大版本,如1.8、1.11和2.0)后,旧版与新版同时运行,同一各User用旧版authenticate验证后会导致新版中已...

张豪飞
26分钟前
0
0
SylixOS异常管理

异常管理   SylixOS提供了一种平台无关的异常管理方法。当系统产生了写时拷贝、缺页等MMU访问失效异常或其他种类异常时,SylixOS会在异常中构建异常处理线程执行陷阱,在异常退出后的任务上...

huikai309
27分钟前
0
0
Java HashMap 初始化赋值 (不建议)

1、HashMap 初始化的文艺写法 看完这段代码,很多人都会觉得这么写太啰嗦了,文艺青年一般这么来了: HashMap<String, String> map = new HashMap<String, String>() { { put("name", "test"...

SuShine
31分钟前
1
0
Lvs与Keepalived集群

一、LVS安装 1、[root@localhost ~]# yum install -y ipvsadm 2、[root@localhost ~]# vi /etc/sysctl.conf net.ipv4.ip_forward = 1 执行如下命令来应用: [root@localhost ~]# sysctl -p ......

freelb
35分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部