一、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文件里面
-
官网地址:
-
参考资料: