专栏首页BrianRabbitMQ消息通信

RabbitMQ消息通信


概述

RabbitMQ是一个开源的消息代理和队列服务器,用来通过普通协议在完全不同的应用之间共享数据或者将作业排队以便让分布式服务器进行处理。应用程序通过使用消息队列可以有效的进行解耦。

RabbitMQ

消息由有效载荷和标签两部分组成,其中有效载荷是你传输的数据;标签是对有效载荷的描述,rabbitmq使用标签来决定谁将获得消息的拷贝。Rabbitmq的生产者和消费者工作方式如下图所示:

生产者创建消息,并将消息发布到代理服务器(rabbitmq)中,rabbitmq会根据标签把消息发送给对方。消费者连接到代理服务器上,并订阅到相应的队列上。rabbitmq会将消息发送给监听/订阅的消费者,消费者它接收到的是有效载荷。消息路由过程并没有将消息标签一同传递,如果你想知道具体生产者的话,可以将生产者的信息封装到有效载荷中。rabbitmq主要有三部分组成:交换器、队列和绑定。生产者生产的信息需要发布到交换器上,消息最终到达队列并被消费者接收,消息最终达到队列中并等待消费,绑定决定了消息如何从路由器路由到特定的队列上。原理如下图所示:

消费者通过两种方式从特定的队列中接收消息:

  • basic.consume命令方式持续订阅。
  • basic.get 获取单条信息。

需要注意的是如果至少有一个消费者订阅了队列,消息会立即发送给订阅;如果该队列没有消费者订阅那么消息会一直存在队列中知道有消费者订阅到队列上,队列上的消息才发送给消费者。当rabbitmq一个队列有用多个消费者,消费者是以轮询的方式发送给消费者。消费者通过basic.ack命令显式的向rabbitmq发送一个确认,此时rabbitmq才能安全的把消息从队列上删除。在接收到信息后你想明确拒绝或者不确认收到该消息的有两种方式:

  • 把消费者从rabbitmq服务器断开连接,这会导致rabbitmq把消息发送给下一个消费者。
  • 可以通过使用basic.reject命令,如果设置设了basic.reject命令的requeue参数设置成true的话,rabbitmq会把消息发送给下一个订阅的消费者,如果设置成false的话,rabbitmq会把消息从队列中删除,而不会重新发送给消息的订阅者。

创建队列

我们通过使用queue.declare命令来创建队列,两个重要的参数:

  • exclusive 设置为True队列将变成私有的,只要你的应用程序才可以消费消息。通常限制一个队列只有一个消费者。
  • auto-delete 当最后一个消费者取消订阅时,队列将会自动删除。

当我们需要检测一些队列是否存在我们可以通过queue.declare的passive设置为true,如果队列存在则成功返回;如果队列不存在则会返回一个错误。值得考虑的问题是,在常见队列时我们的队列应该是由消费者还是生产者来创建呢?这个问题需要考虑是你的应用程序是否能承担起消息丢失,如果能承担起消息的丢失,可以只让消费者声明队列;如果不能承担起消息的丢失那么生产者和消费都要声明队列。

交换器和绑定

消息通过交换器和绑定(路由键)确保到达制定的队列,服务器会通过路由键将消息从交换器投递到队列中。为了支持投递多个队列,rabbitmq由四种类型的交换器:direct、fanout、topic和headers,headers性能差很多,我们这里主要介绍:direct、fanout和topic三种交换器类型。

direct

如果路由键匹配的话,将消息按照路由键发送到对应的队列中。如下图所示:

,其中服务器必须实现direct类型的交换器,包含一个空白字符串名称的默认交换器,当生命一个队列时,它会自动绑定到默认交换器,并以队列名称作为路由键。如果默认的direct交换器无法满足应用时,需要使用exchange.declae来设置。

fanout

交换器会将收到的消息广播到绑定的队列上。这样可以允许你通过同一个消息做相应的不同工作。如下图所示:

topic

交换器使来自不同源头的消息能够到达同一个队列。如下图所示:

RabbitMQ持久化和策略

如果服务器出现故障或者重启,那么队列和交换器都会消失了。这是因为在每个队列和交换器的durable属性默认为false,它决定了rabbitmq在重启或者崩溃之后是否重新创建队列和交换器。能从AMQP服务器中恢复的消息,称之为持久化。如果让我们自己的rabbitmq设置为持久化,做到以下三点:

  • 投递模式设置为2且每个队列和交换器的durable设置为true:把消息标记成持久化。
  • 发送到持久化的交换器。
  • 到达吃持久化队列中。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 机器学习之K近邻算法

    ---- 概述 AI不断的火起来了,作为工程化的码农,也得奔向国际化轨道了。至于机器学习是什么,不知道找百科。现在大多数机器学习都是采用监督学习形式。我们学习一...

    BrianLv
  • 数据分析利器-NumPy

    ---- 概述 NumPy类库是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list s...

    BrianLv
  • Hadoop和Zookeeper安装过程中出现的问题解决

    概述 我最近在搭建一套大数据生态系统,安装分布式Hadoop和Zookeeper时出现了一些问题。我的分布式环境是由三个节点构成的,分比为:master,sla...

    BrianLv
  • IBM MQ运维使用手册

    操作系统版本:SUSE Linux Enterprise Server 10 SP4    32bit

    loong576
  • CKafka系列学习文章 - 什么是消息队列 ?(一)

    | 导语 在大家的工作当中,是否碰到大量的插入、更新请求同时到达数据库,这会导致行或表被锁住,最后会因为请求堆积过多而触发“连接数过多的异常”(Too Man...

    发哥说消息队列
  • springboot + 消息队列

    第一种:用户注册信息写入数据库后在按照顺序先后发送注册邮件和短信,走完这三步后用户才完成注册

    桑鱼
  • Javascript[0x03] -- 队列

    生活中队列的例子有很多,例如吃饭排队、小学生出勤做广播体操、打印机打印文件、去地铁坐车也要排队,去海底捞吃饭也要叫号排队,这些都是队列的一种;还有一种就是优先...

    丰臣正一
  • RabbitMQ快速入门

    最近一段项目实践中大量使用了基于RabbitMQ的消息中间件,也积累的一些经验和思考,特此成文,望大家不吝赐教。 本文包括RabbitMQ基本概念、进阶概念、...

    用户1216676
  • 17 个方面,全面对比 Kafka、RabbitMQ、RocketMQ、ActiveMQ 各自的优缺点

    原文链接:http://t.cn/RVDWcfe

    业余草
  • 想了解Kafka,RabbitMQ,ZeroMQ,RocketMQ,ActiveMQ之间的差异?这一篇文章就够了!

    本文将从,Kafka、RabbitMQ、ZeroMQ、RocketMQ、ActiveMQ 17 个方面综合对比作为消息队列使用时的差异。

    搜云库技术团队

扫码关注云+社区

领取腾讯云代金券