(注:分析代码基于RabbitMQ 2.8.2)
Connection
在上篇文章中提到,客户端连上rabbit后,需要向rabbit发送AMQP协议头,rabbit在收到协议头后,开始在0号channel 上跟客户端进行交互(AMQP中一个连接可以多路复用,1~65535为可用的channel编号,0号channel,也就是frame中channel的索引为0,被认为是全局于整个连接)。
根据AMQP协议,经过connection.start -> connection.start_ok -> connection.secure -> connection.secure_ok -> connection.tune -> connection.tune_ok(这时rabbit会建立一个心跳进程)-> connection.open -> connection.open_ok后,客户端与rabbit之间就认为已经建立了连接(相关代码参见[$RABBIT_SRC/src/rabbit_reader.erl --> handle_method0/2])。
(粗体指令由rabbit服务器发出)
Channel
当客户端发来的frame中,channel的索引不为0时,rabbit认为这些数据从属于某个channel。如果该channel进程不存在,则会创建一个channel进程(rabbit_channel,具体参见[$RABBIT_SRC/src/rabbit_reader.erl --> create_channel/2),并由此进程负责该channel上的所有数据([$RABBIT_SRC/src/rabbit_reader.erl --> process_channel_frame/3)。
根据AMQP协议,经过channel.open -> channel.open_ok([$RABBIT_SRC/src/rabbit_channel.erl --> handle_method/3)后,客户端就可以开始在该channel上发送数据了。
Exchange
当rabbit收到来自客户端的exchange.declare指令时,rabbit会根据客户端的参数创建一个exchange。首先rabbit会向mnesia的表rabbit_exchange写入一条记录,包含客户端请求的exchange类型信息(默认4种类型:direct,topic,fanout,head)及相关参数,如果exchange是需要持久化的(durable),则还需要向rabbit_durable_exchange表中写入相同信息。然后,rabbit会通过rabbit_event发送exchange_created的事件(统计作用)。
Queue
queue在创建时,需要确定要创建queue的类型(rabbit里称为backing_queue):一般情况下,queue只在当前结点(客户端所连接的结点)创建,对应backing_queue为rabbit_variable_queue;当有
HA策略时,queue需要在集群中的多个结点上创建(这时候,有master结点和slave结点之分,master结点未必是当前结点),master结点创建队列对应backing_queue为rabbit_mirror_queue_master,slave结点对应backing_queue为rabbit_mirror_queue_slave(master,slave实际最终也会创建一个rabbit_variable_queue)。
创建一个队列首先会创建一个rabbit_amqqueue_process进程。然后同exchange类似,都需要先在mnesia表里写入queue的基本信息(rabbit_queue,rabbit_durable_queue)。然后初始化对应的backing_queue,最后发送queue_create事件。
我们来看一下backing_queue为rabbit_variable_queue时,初始化需要做什么:1)初始化queue的索引(rabbit_queue_index:init/2)或者从以前的队列恢复索引(rabbit_queue_index:recover/5,durable队列);2)创建message store或者恢复message store(rabbit_msg_store:client_init/4,恢复仅对于durable队列)。
rabbit_mirror_queue_master初始化:1)创建一个rabbit_mirror_queue_coordinator及相应GM(Guaranteed Multicast);2)获取该队列相关的镜像节点,并调用rabbit_mirror_queue_misc:add_mirror/2启动镜像队列进程;3)在当前结点(或者master结点)初始化一个rabbit_variable_queue队列;4)通过GM向所有镜像广播3中初始化队列的长度。
rabbit_mirror_queue_misc:add_mirror/2启动镜像队列进程时,启动的是一个rabbit_mirror_queue_slave进程,相比rabbit_variable_queue,它只是多了个初始化GM的工作。最后也会初始化一个rabbit_variable_queue队列。
Binding
用于将queue绑定到一个exchange。主要涉及到几个数据表写入(见下表,true或者false代表相应对象是不是durable),无其它复杂逻辑,写入完成后会发送binding_created事件。
exchage queue table
true true rabbit_durable_route
rabbit_semi_durable_route
rabbit_route
rabbit_reverse_route
false true rabbit_semi_durable_route
rabbit_route
rabbit_reverse_route
true/false false rabbit_route
rabbit_reverse_route
topic类型的exchange还需要将binding信息写入以下数据表:rabbit_topic_trie_edge,rabbit_topic_trie_binding,rabbit_topic_trie_node(基于
trie数据结构,用于route key的匹配)。
(本文只是个流程上的梳理,文中的一些概念及作用后续会再详细分析)
分享到:
相关推荐
七、源码分析 压缩包内的"code-293"文件包含了整个项目的源代码,包括前后端的完整实现。通过研究这些源码,你可以深入了解Springboot和Vue.js的实际应用,以及如何将它们有效地结合在一起。对于初学者,这是一个...
4. **数据库脚本**:项目中包含的数据库脚本用于初始化商城系统的数据库结构,可能包括商品表、订单表、用户表、分类表等关键实体。通过执行这些脚本,可以快速构建出与源码匹配的数据库环境。 5. **商城系统核心...
首先,Spring Boot是Java后端开发中的核心框架,它简化了初始化和配置过程,使得开发人员可以快速搭建应用。Spring Boot集成了Spring MVC、Spring Data、Spring Security等模块,为电子商务平台提供诸如RESTful API...
1. SpringBoot:作为基础框架,负责应用的初始化、配置管理和依赖注入。 2. Spring MVC:处理HTTP请求,实现Controller层的业务逻辑。 3. Thymeleaf:模板引擎,用于渲染前端页面。 4. MyBatis/MyBatis-Plus:作为...
3. **数据库脚本(Database Scripts)**:包括SQL文件,用于创建和初始化数据库表结构。 4. **配置文件(Configuration Files)**:如application.properties或application.yml,设置项目运行环境的参数。 5. **测试...
1. **框架选择**:Java开发中的Spring Boot框架常常被用来构建后端服务,因为它简化了项目的初始化和配置,提供了强大的依赖注入功能。同时,前端可能会使用React或Vue.js这样的现代JavaScript框架,以提供交互性强...
Spring Boot是Spring框架的一个子项目,它简化了初始化、配置以及开发Java应用的过程,特别适合构建微服务架构。在这个外卖系统中,Spring Boot被用来构建后端服务,提供了便捷的依赖管理和自动化配置功能,使得开发...
前端源码分析** 前端源码部分可能采用了现代化的前端框架,如 React、Vue 或 Angular,用于构建用户界面。这些框架提供了组件化开发、状态管理、路由等功能,使得前端代码更加模块化,易于维护。常见的前端构建工具...
源码分析可能涉及: 1. 设计模式:如工厂模式、单例模式等,用于实现组件的创建和管理。 2. 分层架构:业务逻辑层(Service)、数据访问层(Repository)、表示层(Controller)等。 3. 安全管理:Spring Security...
SpringBoot简化了Spring应用的初始搭建以及开发过程,它集成了大量常用的第三方库配置,如JPA、Thymeleaf、RabbitMQ等,开发者可以快速地创建一个独立运行的、生产级别的基于Spring的应用。 2. **老年一站式服务...
【社区博客项目源码分析】 本项目名为"仿牛客博客",是一个基于Java技术栈实现的开源项目,可以从Gitee平台上的链接获取源代码。虽然该项目可能未实现全部功能,但它仍能为我们提供一个学习和实践Java Web开发的...
在源码数据库中,我们可以看到各种实体表的设计,如用户表、房屋信息表、费用类型表、缴费记录表等。这些表之间的关系通常是通过外键来建立的,例如用户与房屋之间的一对多关系,房屋与费用类型之间的一对多关系。...
1. **SpringBoot框架**:如何初始化SpringBoot项目,配置启动类,使用自动配置,以及如何集成各种Spring生态的组件,如Spring Data JPA进行数据库操作,Spring Security进行权限管理等。 2. **微服务架构**:...
"springboot"则表示可能在系统的一部分或者更新版本中采用了Spring Boot,这是一种简化Spring应用初始搭建以及开发过程的框架,它集成了大量常用的第三方库配置,如 JDBC、MongoDB、JPA、RabbitMQ、Quartz等。...
通过分析这个源码,开发者不仅可以学习到SpringBoot的基本用法,还能了解到如何处理实际的排课问题,包括时间冲突检测、资源调度算法等。同时,也可以学习到如何利用Spring全家桶(如Spring Data JPA、Spring ...
"Java"表明了编程语言的选择,"ssm"和"springboot"则指出了技术栈,Spring Boot是Spring的一个扩展,旨在简化新Spring应用的初始搭建以及开发过程,它集成了大量常用的第三方库配置,如JPA、MongoDB、RabbitMQ、...
通过分析和理解这些源码,开发者可以深入学习SpringBoot的实践应用,以及如何构建高效、可靠的物联网数据采集系统服务器端。同时,这也是一个很好的学习和研究案例,有助于提升Java开发和物联网系统设计的能力。
它内置了Tomcat服务器,集成了大量常用的第三方库配置,如JPA、Thymeleaf、RabbitMQ等,使得开发者可以快速构建可运行的项目。 **Spring Boot与数据库交互** 在Spring Boot中,我们通常使用JPA(Java Persistence ...
《基于SpringBoot的外卖小程序管理系统源码解析》 在当今数字化时代,外卖小程序已经成为餐饮行业的必备工具,极大地提升了服务效率和用户体验。本文将深入探讨一个基于SpringBoot框架开发的外卖小程序管理系统,...
- 创建SpringBoot项目:使用Spring Initializr初始化项目结构。 - 配置数据库连接:在application.properties或yaml文件中设置数据库连接信息。 - 定义实体类:对应数据库表结构,用注解标记字段和关系。 - 编写...