手记

【学习打卡】第12天 分布式消息队列学习

课程名称:Java架构师-技术专家
课程章节:第12周 手把手带你快速搞定分布式RabbitMQ
主讲老师:慕课讲师团:Geely、风间影月、阿神……

课程内容:

1、分布式消息队列(MQ)应用场景

分布式服务之间通信方式的选择要看服务之间到底是强依赖还是弱依赖,如果是强依赖可能会采用同步的 http 或者是 同步的 dubbo 调用等。
如果是弱依赖就可以选用消息中间件帮助我们去做服务的解耦。

虽然是弱依赖但不代表可以失败,如果弱依赖不能失败,就需要上游服务做一个可靠性的投递了。

如果在生产环境中有即时性很高或者说是流量很大的应用场景,比如秒杀、大促等,这就需要 MQ 的削峰和填谷(把流量的高峰和低谷的速率做一个均衡)。MQ最早期做的就是这件事。把消息缓存到一个地方,然后慢速去消费。

有些业务逻辑可以允许异步的操作,只需要做到最终一致性即可。就可以采用MQ

  • 服务解耦
  • 消峰填谷
  • 异步化缓存

2、 分布式消息队列需要考虑的问题

  • 生产端的可靠性投递
  • 消费幂等(消费端要做幂等性验证)
  • 高可用性(HA)
  • 低延迟
  • 消息的可靠性(消息落到MQ肯定不会丢失,使用副本的方式)
  • 堆积能力
  • 扩展性(是否支持天然的、无感知的横向扩容)

MQ 技术选型需要考虑以上问题。

3、主流的分布式消息队列

  • RabbitMQ(横向扩展能力不太好)
  • RocketMQ
  • Kafka(高吞吐量和海量日志的收集)

3.1、如何进行技术选型

  • 各个MQ的性能、优缺点、相应的业务场景
  • 集群架构模式,分布式,可扩展,高可用、可维护性
  • 综合成本问题、集群规模、人员成本
  • 未来的发展、规划、思考

4、JMS与其专业术语

JMS(Java Message Service),也就是Java消息服务。它定义了Java中访问消息中间件的接口的规范。JMS只是接口,实现了JMS接口的消息中间件称为JMS Provider,目前知名的消息中间件系统包括 RocketMQ
、RabbitMQ、Kafka等。

4.1、专业术语

  • JMS(Java Message Service):实现JMS接口的消息中间件;
  • Provider(MessageProvider):消息的生产者
  • Consumer(MessageConsumer):消息的消费者
  • PTP(Point to Point):即点对点的消息模型。
  • Pub/Sub(Publish/Subscribe): 即发布/订阅的消息模型
  • Queue:队列目标,也就是我们常说的消息队列,一般都是会真正的进行物理存储;
  • Topic: 主体目标
  • ConnectionFactory: 连接工厂,JMS 用它创建连接
  • Connection:JMS 客户端到JMS Provider 的连接
  • Destination:消息的目的地;
  • Session:会话,一个发送或者接受消息的线程(这里的Session可以类比MyBatis的Session)

4.2、JMS 消息格式定义

  • StreamMessage 原始值的数据流
  • MapMessage:一套名称/值对
  • TextMessage:一个字符串对象
  • BytesMessage:一个未解释字节的数据流
  • ObjectMessage:一个序列化的Java对象

4.3、消息投递模式

JMS规范里最经典的两种消息投递模式是,点对点和发布订阅。

  • 点对点: 生产者向队列投递一条消息,只有一个消费者能够监听得到这条消息(PTP),如下图所示。
  • 发布订阅:生产者向队列投递一条消息,所有监听该队列得消费者都能够监听得到这条消息(P/S),如下图所示。

5、RocketMQ集群架构与原理解析

RocketMQ是一款分布式、队列模型的消息中间件。

5.1、RocketMQ能力

  • 支持集群模型、负载均衡、水平扩展的能力
  • 亿级别的消息堆积能力
  • 采用零拷贝的原理、顺序写盘、随机读(索引文件)
  • 丰富的API使用
  • 代码优秀,底层通信框架采用 Netty NIO 框架
  • NameServer 代替 Zookeeper
  • 强调集群无单点,可扩展,任意一点高可用,水平可扩展
  • 消息失败重试机制、消息可查询

5.2、专业术语

  • Producer: 消息生产者,负责生产消息,一般由业务系统负责产生消息。
  • Consumer: 消息消费者,负责消费消息,一般是后台系统负责异步消费。
  • Push Consumer: Consumer的一种,需要向Consumer 对象注册监听
  • Pull Consumer:Consumer的一种,需要主动请求Broker 拉取消息
  • Producer Group:生产者集合,一般用于发送一类消息
  • Consumer Group:消费者集合,一般用于接受一类消息进行消费。
  • Broker: MQ 消息服务(中转角色,用于消息存储与生产消费转发)

5.3、源码包及功能说明


  • rocketmq-broker 主要的业务逻辑,消息收发,主从同步, pagecache
  • rocketmq-client 客户端接口,比如生产者和消费者
  • rocketmq-common 公用数据结构等等
  • rocketmq-distribution 编译模块,编译输出等
  • rocketmq-example 示例,比如生产者和消费者
  • rocketmq-fliter 进行Broker过滤的不感兴趣的消息传输,减小带宽压力
  • rocketmq-logappender、rocketmq-logging日志相关
  • rocketmq-namesrv Namesrv服务,用于服务协调
  • rocketmq-openmessaging 对外提供服务
  • rocketmq-remoting 远程调用接口,封装Netty底层通信
  • rocketmq-srvutil 提供一些公用的工具方法,比如解析命令行参数
  • rocketmq-store 消息存储核心包
  • rocketmq-test 提供一些测试代码包
  • rocketmq-tools 管理工具,比如有名的mqadmin工具

5.4、集群架构模型

RocketMQ提供了丰富的集群架构模型,包括单点模式、主从模式、双主模式、以及生产上使用最多的双主双从模式(或者说多主多从模式),经典的双主双从集群架构模型如下图:

  • Producer 集群就是生产者集群(它们在同一个生产组Producer Group)
  • Consumer集群就是消费者集群(它们在同一个消费者组Consumer Group)
  • NameServer集群作为超轻量级的配置中心,只做集群元数据存储和心跳工作,不必保证节点间数据强一致性,也就是说NameServer 集群是一个多机热备的概念。
  • 对于Broker 而言,通常 Master 与Slave 为一组服务,它们互为主从节点,通过NameServer 与外部的Client端暴露统一的集群入口。Broker 就是消息存储的核心MQ服务了。

学习收获

  1. 什么是JMS?(JMS是Java消息服务,定义了Java中访问消息中间件的接口的规范,实现JMS接口的消息中间件称为JMS Provider)
  2. JMS的规范有哪些,分别代表什么含义?
  3. 消息的投递模式(PTP,P/S)
  4. 很多时候,业务会有一些非核心的消息投递,后续会进行消息中间件的业务拆分,把不重要的消息(可以允许丢失,非可靠性投递的消息)采用kafka的异步发送机制,借助kafka强大吞吐量和消息堆积能力来做业务的分流。
  5. 消息中间件的应用场景(服务解耦、削峰填谷、异步化缓存)
  6. 消息中间件的技术选型

1人推荐
随时随地看视频
慕课网APP