热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

RabbitMQ架构组件

RabbitMQArchitectureRabbitMQ概念AMQP全名AdvancedMessageQueuingProtocol即高级消息队列协议,是应用层协议的一个开放标准,

RabbitMQ Architecture




RabbitMQ概念




AMQP

全名 Advanced Message Queuing Protocol即高级消息队列协议,是应用层协议的一个开放标准,消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然

RabbitMQ是基于AMQP研发的,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等


Broker

是指一个消息队列服务器实体,集群中的一个实例节点


ConnectionFactory

是指RabbitMQ与发布者或消费者之间的Connetions,这些Connections是通过ConnectionFactory进行管理的


Connections

是指RabbitMQ与发布者与消费者之间的TCP连接,通常是一个长连接


Channel

是建立在RabbitMQ Connections中的数据传输信道,早期版本默认值是0,即不限制channel的个数,3.8版本之后默认值是2047,即每条Connection最多可以初始化2047个Channel,但是RabbitMQ官方不建议初始化过多的Channel,因为太多的Channel会消耗大量内存

无论是发布消息、消费消息、订阅队列等路由都是通过Channel完成的,可以把Channel看成一条虚拟的TCP连接,在RabbitMQ中一旦TCP建立完成,就创建channel


Exchange

负责接收消息、并根据消息中的Routing key与Exchange的binding key进行匹配,进行转发消息


Queue

消息队列,是用来存储消息,是消息的容器,消息的载体,同时也是城消息的终点


Message

消息,消息是由消息头与消息体组成的,消息体是不透明的,而消息头则由一些属性组成的(expiration过期时间、priority优先级、delivery_mode、routing key等)


Routing key

routing key是消息本身一条属性,它决定了消息如何路由到队列中,但是routing key会依赖Exchange的类型

通常我们发送一条消息时,在消息属性设置routing key属性,这个属性主要是与exchange的binding key结合使用


Binding

使用binding把Queue与Exchange关联起来,可以看作成一个link,绑定条件是需要通过binding key完成


Binding key

RabbitMQ在绑定Exchange与Queue时,通常会指定一个binding key,这个binding  key主要是与接收到的消息中的routing key进行路由匹配


Exchange类型






  • Direct

    direct类型的Exchange路由规则其实很简单,消息的生产者把消息publish到交换器时,使用消息本身的routing-key与binding key进行完全匹配

    下图表示,以routingKey=”error”发送消息到Exchange,则消息会路由到Queue1(amqp.gen-S9b…,这是由RabbitMQ自动生成的Queue名称)和Queue2(amqp.gen-Agl…);如果我们以routingKey=”info”或routingKey=”warning”来发送消息,则消息只会路由到Queue2。如果我们以其他routingKey发送消息,则消息不会路由到这两个Queue中




  • fanout

    fanout类型的exchange是这样的,消息的生产者把消息publish到交换器时,所有的消息都会路由到绑定在交换器的队列中

    下图中,生产者(P)发送到Exchange(X)的所有消息都会路由到图中的两个Queue,并最终被两个消费者(C1与C2)消费




  • Topic

    topic类型的exchange在匹配规则上了进行了扩展,与direct类型有点相似,同样使用routing key与binding key匹配,但是topic类型的exchange支持模糊匹配routing key使用句点 “." 来分隔名称,被分隔的每一段认为是一个单词,如:“stock.usd.nyse”、“nyse.vmw”、“quick.orange.rabbit”


    routing key使用句点 “.” 来分隔名称,被分隔的每一段认为是一个单词,如:“stock.usd.nyse”、“nyse.vmw”、“quick.orange.rabbit”

    binding key同样也是使用句点 “.” 分隔。binding key还存在一种特殊字符 “#”,这个#用来匹配被分隔的字段


    如下图,routingKey=”quick.orange.rabbit”的消息会同时路由到Q1与Q2,routingKey=”lazy.orange.fox”的消息会路由到Q1与Q2,routingKey=”lazy.brown.fox”的消息会路由到Q2,routingKey=”lazy.pink.rabbit”的消息会路由到Q2(只会投递给Q2一次,虽然这个routingKey与Q2的两个bindingKey都匹配);routingKey=”quick.brown.fox”、routingKey=”orange”、routingKey=”quick.orange.male.rabbit”的消息将会被丢弃,因为它们没有匹配任何bindingKey




  • Header

    headers类型的Exchange不依赖于routing key与binding key的匹配规则来路由消息,而是根据发送的消息内容中的headers属性进行匹配

    在绑定Queue与Exchange时指定一组键值对;当消息发送到Exchange时,RabbitMQ会取到该消息的headers(也是一个键值对的形式),对比其中的键值对是否完全匹配Queue与Exchange绑定时指定的键值对;如果完全匹配则消息会路由到该Queue,否则不会路由到该Queue



参考文献



https://blog.csdn.net/caox_nazi/article/details/81208420

搜索

复制



推荐阅读
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 本文讨论了微软的STL容器类是否线程安全。根据MSDN的回答,STL容器类包括vector、deque、list、queue、stack、priority_queue、valarray、map、hash_map、multimap、hash_multimap、set、hash_set、multiset、hash_multiset、basic_string和bitset。对于单个对象来说,多个线程同时读取是安全的。但如果一个线程正在写入一个对象,那么所有的读写操作都需要进行同步。 ... [详细]
  • 本文介绍了在Android开发中使用软引用和弱引用的应用。如果一个对象只具有软引用,那么只有在内存不够的情况下才会被回收,可以用来实现内存敏感的高速缓存;而如果一个对象只具有弱引用,不管内存是否足够,都会被垃圾回收器回收。软引用和弱引用还可以与引用队列联合使用,当被引用的对象被回收时,会将引用加入到关联的引用队列中。软引用和弱引用的根本区别在于生命周期的长短,弱引用的对象可能随时被回收,而软引用的对象只有在内存不够时才会被回收。 ... [详细]
  • 2021最新总结网易/腾讯/CVTE/字节面经分享(附答案解析)
    本文分享作者在2021年面试网易、腾讯、CVTE和字节等大型互联网企业的经历和问题,包括稳定性设计、数据库优化、分布式锁的设计等内容。同时提供了大厂最新面试真题笔记,并附带答案解析。 ... [详细]
  • 第七课主要内容:多进程多线程FIFO,LIFO,优先队列线程局部变量进程与线程的选择线程池异步IO概念及twisted案例股票数据抓取 ... [详细]
  • 本文介绍了Java的集合及其实现类,包括数据结构、抽象类和具体实现类的关系,详细介绍了List接口及其实现类ArrayList的基本操作和特点。文章通过提供相关参考文档和链接,帮助读者更好地理解和使用Java的集合类。 ... [详细]
  • 栈和队列的共同处和不同处
    本文主要介绍了栈和队列的共同处和不同处。栈和队列都是由几个数据特性相同的元素组成的有限序列,也就是线性表。队列是限定仅在表的一端插入元素、在另一端删除元素的线性表,遵循先进先出的原则。栈是限定仅在表尾进行插入或删除操作的线性表,遵循后进先出的原则。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文介绍了Java的公式汇总及相关知识,包括定义变量的语法格式、类型转换公式、三元表达式、定义新的实例的格式、引用类型的方法以及数组静态初始化等内容。希望对读者有一定的参考价值。 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 本文介绍了一道经典的状态压缩题目——关灯问题2,并提供了解决该问题的算法思路。通过使用二进制表示灯的状态,并枚举所有可能的状态,可以求解出最少按按钮的次数,从而将所有灯关掉。本文还对状压和位运算进行了解释,并指出了该方法的适用性和局限性。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
author-avatar
手机用户2502887641
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有