阿里开源消息队列 RocketMQ4.x介绍和新概念讲解(笔记)

时间:2024-04-15 09:15:42

一、JMS消息服务介绍

什么是JMS:

  • Java 消息服务(Java Message Service), Java平台中关于面向消息中间件的接口
  • JMS是一种与厂商无关的API, 用来访问消息收发系统消息,它类似于JDBC(Java Database Connectivity). 这里,JDBC是可以用来访问许多不同关系数据库的API

使用场景:

  • 核心应用:
    • 解耦: 订单系统——> 物流系统
    • 异步: 用户注册——> 发送邮件,初始化信息
    • 削峰: 秒杀、日志处理
  • 跨平台、多语言
  • 分布式事务、最终一致性
  • RPC 调用上下游对接,数据源变动 ——> 通知下级

二、消息中间件常见概念和编程模型

常见概念

  • JMX 提供者: 连接面向消息中间件的,JMS接口的一个实现,RocketMQ、RabbitMQ、ActiveMQ、Kafka 等
  • JMS 生产者(Message Producer): 生产消息的服务
  • JMS 消费者(Message Consumer): 消费消息的服务
  • JMS 消息: 数据对象
  • JMS 队列: 存储消费消息的区域
  • JMS 主题: 一种支持发送消息给多个订阅者的机制
  • JMS 消息通常有两种类型: 点对点(Point-to-Point)、发布/订阅(Publish/Subscribe)

基础编程模型

  • MQ 中需要一些常用的类
  • ConnectionFactory: 连接工厂,JMS 用它创建连接
  • Connection: JMS 客户端到JMS Provider 的连接
  • Session: 一个发送或接收消息的线程
  • Destination: 消息的目的地, 消息发送给谁
  • MessageConsumer/MessageProducer: 消息消费者,消息生产者

三、主流消息队列和技术选型

对比当下主流的消息队列和选择问题

主流消息队列和技术选型

  • 消息队列的模型:

    • Producer:生产消息,将消息写入 channel。
    • Message Broker:消息代理,将写入 channel 的消息按队列的结构进行管理,负责存储/转发消息。Broker 一般是需要单独搭建、配置的集群,而且必须是高可用的。
    • Consumer:消息的消费者。目前大多数的消息队列都是保证消息至少被消费一次,所以根据使用的消息队列设施不同,消费者要做好幂等。
  • Apache AcitveMQ、 Kafka、 RabbitMQ、 RocketMQ

    • ActiveMQ:http://activemq.apache.org/

      • Apache出品,历史悠久,支持多种语言的客户端和协议,支持多种语言Java, .NET, C++ 等,基于JMS Provider的实现
      • 缺点:
        • 吞吐量不高,多队列的时候性能下降,存在消息丢失的情况,比较少大规模使用
        • 官方社区现在对ActiveMQ 5.x维护越来越少
    • Kafka:http://kafka.apache.org/

      • 是由Apache 软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式订阅消息系统,它可以处理大规模的网站中的所有动作流数据(网页浏览,搜索和其他用户的行动),副本集机制,实现数据冗余,保障数据尽量不丢失;支持多个生产者和消费者
      • 高吞吐量的特点,可以用于日志手机、离线分析、试试分析等
      • 以时间复杂度为 O(1) 的方式快速消息持久化
      • 支持在线水平扩展,自带负载均衡
      • 支持只消费且仅消费一次(Exactly Once)模式等
      • Kafka 官方提供了 Java 版本的客户端 API,Kafka 社区目前也支持多种语言,包括 PHP、Python、Go、C/C++、Ruby、NodeJS 等
      • 缺点:
        • Kafka 单机超过64个队列/分区, Load会发生明显的飙高现象、队列越多、load 越高、发送消息响应时间变长
        • 使用段轮询方式, 实时性取决于轮询间隔时间
        • 管理界面鸡肋, 可以使用 kafka-manager , kafka-eagle
        • 不支持批量和广播消息,运维难度大,文档比较少,需要掌握Scala
    • RabbitMQ:http://www.rabbitmq.com/

      • 是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不错
      • 健壮、稳定、文档齐全
      • 社区活跃度高
      • 缺点:
        • 使用Erlang开发,阅读和修改源码难度大, 不利于做二次开发和维护
        • RabbitMQ 吞吐量会低一些,这是因为它做的实现机制比较重
        • 需要学习比较复杂的接口和协议,学习和维护成本较高。
    • RocketMQ:http://rocketmq.apache.org/

      • 阿里开源的一款消息中间件,纯Java开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点, 性能强劲(零拷贝技术),支持海量堆积,支持指定次数和时间间隔的失败消息重发,支持Consumer 端tag过滤、延迟消息等, 在阿里内度进行大规模使用,适合在电商,互联网金融等领域使用
      • 缺点:
        • 支持的客户端语言不多,目前是java及c++,其中c++不成熟;
        • 社区活跃度一般
        • 没有在 mq 核心中去实现JMS等接口,有些系统要迁移需要修改大量代码

四、阿里巴巴开源RocketMQ4.x消息队列介绍

阿里开源消息队列 RocketMQ4.x介绍和新概念讲解

  • Apache RocketMQ 作为阿里开源的一款高性能、高吞吐量的分布式中间件

  • 特点:

    • 支持Broker 和 Consumer 端消息过滤
    • 支持发布订阅模型、点对点
    • 支持拉Pull 和 推Push两种消息模式
    • 单一队列百万消息、亿级消息堆积
    • 支持单master 节点,多master节点,多master多slave节点
    • 任意一点都是高可用,水平拓展,Producer、Consumer、队列都可以分布式
    • 消息失败重试机制、支持特定level的定时消息
    • 新版本底层采用Netty
    • 4.3.X 支持分布式事务
    • 适合金融类业务,高可用性跟踪和审计功能
  • 概念

    • Producer: 消息生产者
    • Producer Group: 消息生产者组, 发送同类消息的一个消息生产组
    • Consumer: 消息者
    • Consumer Group: 消费同类消息的多个实例
    • Tag: 标签, 子主题(二级分类)对topic的进一步细化,用于区分同一个主题的不同业务的消息
    • Topic: 主题,如订单类消息,queue 是消息的物理管理单位,而topic是逻辑管理单位。 一个topic下可以有多个queue。 默认自动创建是4个,手动创建是8个
    • Message: 消息, 每个message 必须指定一个topic
    • Broker: MQ 程序, 接收生产的消息,提供给消费者消费的程序
    • Namer Server: 给生产和消费提供路由信息,提供轻量级的服务发现、路由、元数据信息,可以多个部署,互相独立(比Zookeeper更轻量)
    • Offset: 偏移量, 可以理解为消息进度
    • commit log: 消息存储会写在Commit log文件里面
  • 官网地址:

  • 参考资料: