跳至主要內容
设计理念和设计目标

设计理念

RocketMQ设计基于主题的发布与订阅模式,其核心功能包括消息发送、消息存储和消息消费,整体设计追求简单和性能高效,主要体现在如下3个方面。

  1. 摒弃了业界常用的将ZooKeeper作为信息管理的“注册中心”,而是自研NameServer实现元数据的管理(topic路由信息等)
  2. 高效的I/O存储机制。
  3. 容忍存在的设计缺陷。

为什么不用 Zookeeper 而是自研 NameServer?

topic 路由信息无需在集群之间保持强一致,而是追求最终一致性,并且能够容忍分钟级别的不一致。真是因为这,RocketMQ的NameServer集群之间互不通信,这样极大地降低了NameServer实现的复杂度,对网络的要求也降低了不少,性能相比较ZooKeeper还有了极大的提升。


九夏...大约 6 分钟it中间件RocketMQ源码
NameServer原理

架构设计

架构设计
架构设计
  1. NameServer 启动后每隔 10s 扫描一下 brokerLiveTable,检测表中上次心跳包的时间,如果间隔超过 120s 则认为该 broker 不可用,移出路由表中与该 broker 相关的路由信息。
  2. broker 启动后每过 30s 向 NameServer 发送心跳包,并传输路由信息,NameServer 进行保存。
  3. 生产者启动后会和 NameServer、broker 进行长连接。生产者每隔 30s 向 NameServer 获取路由信息。
  4. 消费者每 30s 向 NameServer 获取路由信息

九夏...大约 4 分钟it中间件RocketMQ源码
总体架构设计

Mybatis 整体框架如下:

kJIdrO

接口层

MyBatis 和数据库的交互有两种方式:

  • 使用传统的 MyBatis 提供的 API;

  • 使用 Mapper 接口;

使用传统的 MyBatis 提供的 API

这是传统的传递 Statement Id 和查询参数给 SqlSession 对象,使用 SqlSession 对象完成和数据库的交互;MyBatis 提供了非常方便和简单的 API,供用户实现对数据库的增删改查数据操作,以及对数据库连接信息和 MyBatis 自身配置信息的维护操作。


九夏...大约 5 分钟it框架mybatis源码
流程简解

流程简解

/src/main/resources/mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<!-- 根标签 -->
<configuration>
    <properties>
        <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url"
                  value="jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=UTF8&amp;useSSL=false&amp;autoReconnect=true"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    </properties>

    <!-- 环境,可以配置多个,default:指定采用哪个环境 -->
    <environments default="test">
        <environment id="test">
            <!-- 事务管理器,JDBC类型的事务管理器 -->
            <transactionManager type="JDBC"/>
            <!-- 数据源,池类型的数据源 -->
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/> <!-- 配置了properties,所以可以直接引用 -->
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="TeacherMapper.xml"/>
    </mappers>
</configuration>

九夏...大约 2 分钟it框架mybatis源码