概述

场景

  • 服务解耦
  • 削峰填谷
  • 异步化缓冲:最终一致性/柔性事务

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)的更多相关文章

  1. 【分布式消息队列-MQ】

    http://www.cnblogs.com/itfly8/p/5155983.html

  2. java面试记录三:hashmap、hashtable、concurrentHashmap、ArrayList、linkedList、linkedHashmap、Object类的12个成员方法、消息队列MQ的种类

    口述题 1.HashMap的原理?(数组+单向链表.put.get.size方法) 非线程安全:(1)hash冲突:多线程某一时刻同时操作hashmap并执行put操作时,可能会产两个key的hash ...

  3. 分布式服务(RPC)+分布式消息队列(MQ)面试题精选

    ​ 分布式系统(distributed system)是建立在网络之上的软件系统.正是因为软件的特性,所以分布式系统具有高度的内聚性和透明性.因此,网络和分布式系统之间的区别更多的在于高层软件(特别是 ...

  4. Kafka 分布式消息队列介绍

    Kafka 分布式消息队列 类似产品有JBoss.MQ 一.由Linkedln 开源,使用scala开发,有如下几个特点: (1)高吞吐 (2)分布式 (3)支持多语言客户端 (C++.Java) 二 ...

  5. 为什么会需要消息队列(MQ)?

    为什么会需要消息队列(MQ)? #################################################################################### ...

  6. 消息队列一:为什么需要消息队列(MQ)?

    为什么会需要消息队列(MQ)? #################################################################################### ...

  7. 消息队列 MQ 入门理解

    功能特性: 应用场景: 消息队列 MQ 可应用于如下几个场景: 分布式事务 在传统的事务处理中,多个系统之间的交互耦合到一个事务中,响应时间长,影响系统可用性.引入分布式事务消息,交易系统和消息队列之 ...

  8. Java面试—消息队列

    消息队列面试题 题目来自于中华石杉,解决方案根据自己的思路来总结而得. 题目主要如下: 1. 为什么要引入消息队列? 消息队列的引入可以解决3个核心问题: 解耦 异步 削峰 解耦 在一个项目中,如果一 ...

  9. 分布式消息队列RocketMQ(一)安装与启动

    分布式消息队列RocketMQ 一.RocketMQ简介 RocketMQ(火箭MQ) 出自于阿里,后开源给apache成为apache的顶级开源项目之一,顶住了淘宝10年的 双11压力 是电商产品的 ...

随机推荐

  1. LiteOS内核源码分析:任务LOS_Schedule

    摘要:调度,Schedule也称为Dispatch,是操作系统的一个重要模块,它负责选择系统要处理的下一个任务.调度模块需要协调处于就绪状态的任务对资源的竞争,按优先级策略从就绪队列中获取高优先级的任 ...

  2. TypeError: myMethod() takes no arguments (1 given) Python常见错误

      忘记为方法的第一个参数添加self参数 ---------------------------------------------------------------

  3. 全网最详细的Linux命令系列-cp命令

    cp命令用来复制文件或者目录,是Linux系统中最常用的命令之一.一般情况下,shell会设置一个别名,在命令行下复制文件时,如果目标文件已经存在,就会询问是否覆盖,不管你是否使用-i参数.但是如果是 ...

  4. 再学dockerfile

    前言 docker的系统学习可以看我这篇博文:https://www.cnblogs.com/zisefeizhu/p/11298818.html 有非常详细的讲解 容器现在都是用kubernetes ...

  5. 记一次metasploitable2内网渗透之1524端口

    0x01.漏洞 许多攻击脚本将安装一个后门SHELL于这个端口,尤其是针对SUN系统中Sendmail和RPC服务漏洞的脚本.如果刚安装了防火墙就看到在这个端口上的连接企图,很可能是上述原因.可以试试 ...

  6. 如何优雅地学习计算机2<-->Helloworld

    0.导入 ​ 在进行粗略的学习计算机底层知识和变量后,我们来开始编写年轻人的第一个程序--Helloworld. ​ 我们需要用到的工具有:1.Dev-C++(也可以使用其他软件)2.脑子(最重要) ...

  7. Go-18-自动下载所有依赖包

    如何自动下载所有依赖包? 大部分情况下大家下载 Go 项目都是使用go get命令,它除了会下载指定的项目代码,还会去下载这个项目所依赖的所有项目. 但是有的时候我们的项目由于各种原因并不是通过go ...

  8. 基于MATLAB的手写公式识别(1)

    基于MATLAB的手写公式识别 reason:课程要求以及对MATLAB强大生命力的探索欲望: plan date:2021/3/28-2021/4/12 plan: 进行材料搜集和思路整理: 在已知 ...

  9. 认识二进制安全与漏洞攻防技术 (Windows平台)

    二进制漏洞是指程序存在安全缺陷,导致攻击者恶意构造的数据(如Shellcode)进入程序相关处理代码时,改变程序原定的执行流程,从而实现破坏或获取超出原有的权限. 0Day漏洞 在计算机领域中,0da ...

  10. UVA11134传说中的车(放棋子)

    题意:       给你一个n*n的棋盘,让你在棋盘上放n个棋子,要求是所有棋子不能相互攻击(同行或者同列就会攻击),并且每个棋子都有一个限制,那就是必须在给定的矩形r[i]里,输出每个棋子的位置,s ...