[Java] 分布式消息队列(MQ)
概述
场景
- 服务解耦
- 削峰填谷
- 异步化缓冲:最终一致性/柔性事务
MQ应用思考点
- 生产端可靠性投递
- 消费端幂等:消息只能消费一次
- 高可用、低延迟、可靠性
- 消息堆积能力
- 可扩展性
业界主流MQ
- ActiveMQ:适合传统需求,并发性差
- RabbitMQ:扩展性差
- RocketMQ:扩展性强
- Kafka:扩展性强,并发性强,可靠性差
技术选型
- 性能、优缺点、业务场景
- 集群架构模式,分布式、可扩展、高可用、可维护性
- 综合成本,集群规模,人员成本
- 未来的方向、规划、思考
ActiveMQ
介绍
- JMS(Java Message Service):Java消息服务,定义了Java中访问消息中间件的接口规范
- 实现JMS的中间件称为“JMS Provider”
- MOM (Message Oriented Middleware 消息中间件):ActiveMQ、RocketMQ、RabbitMQ、Kafka
术语
- JMS(Java Message Service):Java消息服务接口
- 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)
消息定义格式
- StreamMessage:原始值的数据流
- MapMessage:一套名称/值对
- TextMessage:一个字符串对象
- BytesMessage:一个未解释字节的数据流
- ObjectMessage:一个序列化的Java对象
消息投递模式
- 点对点:生产者向队列投递消息,只有一个消费者能监听到这条消息

- 发布订阅:生产者向队列投递一条消息,所有监听该队列的消费者都能够监听得到这条消息

ActiveMQ各项指标
- 服务性能:适用于传统行业需求,对高并发、大数据的业务场景支持不足
- 数据存储:默认为kahadb存储(索引--文件),可采用google leveldb(内存数据库),或MySql/Oracle(关系型数据库)
- 集群架构:可与zookeeper构建主备集群模型
集群架构模式
- Master-Slave:主从模式,双机热备
- 目前ActiveMQ推荐的高可靠性和容错的解决方案
- 绿色的为主节点,灰色的则为备份节点,这两个节点都是运行状态的
- zookeeper的作用:主节点宕机时,及时切换到备份的灰色节点,进行主从角色互换,以实现高可用性
- 缺陷:不能做到分布式的topic、queue,消息量巨大时MQ集群压力过大

- Network:网络通信方式(Network of brokers)
- 真正解决了分布式消息存储和故障转移,broker切换的问题
- 一个broker会同等对待所有的subscription
- 需要两套或多套(Master-Slave)的集群模型实现
- 缺陷:资源浪费,部署复杂

1 <broker brokerName="receiver" persistent="false" useJmx="false">
2 <transportConnectors>
3 <transportConnector uri="tcp://localhost:62002"/>
4 </transportConnectors>
5 <networkConnectors>
6 <networkConnector
7 uri="static:( tcp://localhost:61616,tcp://remotehost:61616)"/>
8 </networkConnectors>
9 </broker>
RocketMQ
介绍
- 高并发、高可靠性、海量数据场景
- 底层通信框架采用Netty NIO
- 用NameServer代替Zookeeper
- 支持集群、负载均衡、水平扩展
- 灵拷贝,顺序写,随机读
- 消息失败重试机制,消息可查询
术语
- Producer:消息生产者,负责产生消息,一般由业务系统负责产生消息
- Consumer:消息消费者,负责消费消息,一般是后台系统负责异步消费
- Push Consumer:Consumer的一种,需要向Consumer对象注册监听
- Pull Consumer:Consumer的一种,需要主动请求Broker拉取消息
- Producer Group:生产者集合,一般用于发送一类消息
- Consumer Group:消费者集合,一般用于接受一类消息进行消费
- Broker : MQ消息服务(中转角色,用于消息存储与生产消费转发)
集群架构
- 单点模式
- 主从模式
- 双主模式
- 双主双从模式
RabbitMQ
概述
- 实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)
集群架构
- 主备模式:warren(兔子窝),主节点挂了,从节点提供服务,类似ActiveMQ利用Zookeeper做主/备
- 远程模式:远距离通信和复制,实现双活模式,简称Shovel模式,配置复杂
- 镜像模式:高可用,数据同步,实现简单,三节点,类似MongoDB的replicate

- 多活模式:采用双中心模式,两套数据中心各部署一套RabbitMQ集群,各中心间实现部分队列消息共享
- Federation插件:不需构建Cluster,在Broker间传递消息的高性能插件,使用AMQP协议,可接受不连续的传输
- Federation Exchange:Downstream从Upstream主动拉取订阅的消息

Kafka
介绍
- 基于Pull的模式处理消息消费,追求高吞吐量,开始的目的是用于日志收集和传输
- 支持复制,不支持事务,对消息的重复、错误、丢失没有严格要求
- 适合产生大量数据的互联网服务的数据收集业务
- 分布式、跨平台、实时性、伸缩性
性能
- 顺序写
- 提高磁盘利用率
- consumer通过offset顺序消费数据,而不删除已消费过的数据,从而避免随机写
- Page Cache(空中接力)
- 不显式用内存,重启数据不丢失
- 高性能,高吞吐
- 后台异步、主动Flush
- 多个异步级别的scheduler,将连续小块组成大的物理文件
- 预读策略、IO调度
Page Cache
- 操作系统级别实现的一种主要磁盘存储策略
- 把磁盘中的数据缓存到内存中,减少IO操作(四次拷贝)
- 高并发互联网项目:MySQL->分库分表->MongoDB->Redis->本地缓存

ZeroCopy
- 与应用程序不关联(一次拷贝)
- 从磁盘拷贝到内存读取缓冲区后,直接把数据发送到网卡接口,给消费者使用
- 应用程序不做copy
- 如有10个消费者,传统文件读写需要40次IO操作,ZeroCopy只需1+10次

集群

[Java] 分布式消息队列(MQ)的更多相关文章
- 【分布式消息队列-MQ】
http://www.cnblogs.com/itfly8/p/5155983.html
- java面试记录三:hashmap、hashtable、concurrentHashmap、ArrayList、linkedList、linkedHashmap、Object类的12个成员方法、消息队列MQ的种类
口述题 1.HashMap的原理?(数组+单向链表.put.get.size方法) 非线程安全:(1)hash冲突:多线程某一时刻同时操作hashmap并执行put操作时,可能会产两个key的hash ...
- 分布式服务(RPC)+分布式消息队列(MQ)面试题精选
分布式系统(distributed system)是建立在网络之上的软件系统.正是因为软件的特性,所以分布式系统具有高度的内聚性和透明性.因此,网络和分布式系统之间的区别更多的在于高层软件(特别是 ...
- Kafka 分布式消息队列介绍
Kafka 分布式消息队列 类似产品有JBoss.MQ 一.由Linkedln 开源,使用scala开发,有如下几个特点: (1)高吞吐 (2)分布式 (3)支持多语言客户端 (C++.Java) 二 ...
- 为什么会需要消息队列(MQ)?
为什么会需要消息队列(MQ)? #################################################################################### ...
- 消息队列一:为什么需要消息队列(MQ)?
为什么会需要消息队列(MQ)? #################################################################################### ...
- 消息队列 MQ 入门理解
功能特性: 应用场景: 消息队列 MQ 可应用于如下几个场景: 分布式事务 在传统的事务处理中,多个系统之间的交互耦合到一个事务中,响应时间长,影响系统可用性.引入分布式事务消息,交易系统和消息队列之 ...
- Java面试—消息队列
消息队列面试题 题目来自于中华石杉,解决方案根据自己的思路来总结而得. 题目主要如下: 1. 为什么要引入消息队列? 消息队列的引入可以解决3个核心问题: 解耦 异步 削峰 解耦 在一个项目中,如果一 ...
- 分布式消息队列RocketMQ(一)安装与启动
分布式消息队列RocketMQ 一.RocketMQ简介 RocketMQ(火箭MQ) 出自于阿里,后开源给apache成为apache的顶级开源项目之一,顶住了淘宝10年的 双11压力 是电商产品的 ...
随机推荐
- web编辑工具 - Brackets - 强大免费的开源跨平台Web前端开发工具IDE
简单使用可以参考: https://blog.csdn.net/melon19931226/article/details/68066971/ https://www.iplaysoft.com/ ...
- Python基础(十八):面向对象“类”第一课
记住:编写函数就是"面向过程",编写类就是"面向对象".类也是很多同学的一大学习难点,因此我这里还是准备带着大家学习一下. 类和对象对比 对象 : 具有行为和属 ...
- Tk 的基本概念-组件—Tkinter 教程系列03
Tk 的基本概念-组件-Tkinter 教程系列03 前言 Tk 系列教程: Tkinter教程系列01--引言和安装Tk Tkinter教程系列02--第一个真正的 GUI 程序 通过上一节的程序实 ...
- 死磕Spring之AOP篇 - Spring AOP自动代理(二)筛选合适的通知器
该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1 ...
- 孙悟空的身外身法术使用了Java设计模式:原型模式
目录 定义 意图 主要解决问题 何时使用 优缺点 结构 简单形式的原型模式 登记形式的原型模式 两种形式比较 浅克隆和深克隆 孙悟空的身外身法术 浅克隆实现 深克隆实现 定义 原型模式属于对象的创建型 ...
- 一文教你读懂JVM的类加载机制
Java运行程序又被称为WORA(Write Once Run Anywhere,在任何地方运行只需写入一次),意味着我们程序员小哥哥可以在任何一个系统上开发Java程序,但是却可以在所有系统上畅通运 ...
- 程序员的开源月刊《HelloGitHub》第61期
兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. 内容包括:有趣.入门级的开源项目.开源书籍.实战项目.企业级项目等,让你在短时间内感 ...
- 什么是JWT?原理是什么?
什么是JWT JWT 是Json Web Tokens的简称.用百度上面的解释讲,是目前流行的跨域认证解决方案,一种基于JSON的.用于在网络上声明某种主张的令牌(token). JTW原理 jwt验 ...
- Vue.js入门及其常用指令
一.Vue框架 https://cn.vuejs.org/ 官网 前端领域有三大框架 Angular诞生于2009年,是由谷歌公司创建出来的框架: React诞生于2013年,是由facebook公司 ...
- 微信小程序中的自定义组件
微信小程序中的组件 前言 之前做小程序开发的时候,对于开发来说比较头疼的莫过于自定义组件了,当时官方对这方面的文档也只是寥寥几句,一笔带过而已,所以写起来真的是非常非常痛苦!! 好在微信小程序的库从 ...
