java中的消息队列
消息队列:可以看做是一个存储消息的容器,它是分布式系统中的重要组件之一。
目的是:
1、为了通过异步处理来提高系统的性能来减少系统响应的时间
一般的步骤是客户端发起请求给服务端,服务端在请求给数据库,数据库在返回结果给服务端,最后客户端在接收服务端的响应。此时运用消息队列先是客户端发送请求给服务端,服务端发送消息给消息队列,客户端接收服务端的响应,在消息队列请求数据库。因此在使用消息队列时需要考虑业务的流程进行异步处理。
2、削峰/限流
将短时间高并发产生的事务消息存储在消息队列中,然后后端服务再根据自己能力慢慢消费这些消息,避免后端服务被击垮。
3、降低系统耦合性。
模块之间如果不存在直接调用,那么新增模块修改模块时对其他模块影响就比较小,对系统的扩展性更好。消息队列运用在:生产者也就是客户端发送消息到消息队列中,接受者也就是服务端处理消息就直接从消息队列中获取,不与其他系统耦合,这样也提高了系统的扩展性。另外为了避免消息队列服务器发生宕机而造成消息丢失,会将成功发送到消息队列的消息存储在消息生产者服务器上,等消息真正被消费者服务器处理后才删除消息,在消息队列服务器宕机时生产者服务器会选择分布式消息队列服务器集群中的其他服务器发送消息。
使用消息队列带来的一些问题:
系统可用性降低:系统在某种程度上可用性降低,会担心消息丢失问题
系统复杂性提高:加入消息队列你需要担心消息没有被重复消费、需要处理消息被丢失的情况、保证消息被传递的顺序性。
一致性问题:异步的确可以提高响应速度,但是消费者未正确消费可能会导致数据不一致问题。
JMS 与AMQP:
JMS是java的消息服务,JMS的客户端之间可以通过JMS服务进行异步的消息传输。JMS API时一个消息服务的标准、规范。ActiveMQ就是基于JMS规范实现的。
JMS两种消息模型:
1、点到点(P2P)模型
队列模型,生产者发送消息给消息队列,一条消息只能被一个消费者使用,未被消费的消息在队列中保留直到被消费或超时。
2、发布订阅模型
使用主题Topic作为消息通信载体,类似于广播模式;发布者发布一条消息,该消息通过主题传递给所有订阅者,在一条消息广播之后才订阅的用户时收不到该条信息的。
AMQP:
一个提供统一消息服务的应用层标准高级消息队列协议(二进制应用层协议),是应用层协议的开放标准,为面向消息的中间件设计,兼容JMS。基于此协议的客户端可与消息中间件可传递消息,并不受客户端/中间件同产品,不同开发语言等条件限制。RabbitMQ就是基于AMQP协议实现的。
| 对比 |JMS |AMQP
| 定义 |Java API|协议
| 跨语言 | 否 |是
|跨平台 |否 |是
总结:AMQP为消息定义了线路层的协议,而JMS所定义的是API规范,在Java体系中,多个客户端可以通过JMS进行交互,不需要应用修改代码,但是其跨平台的支持较差。kafka唯一一点劣势是有可能消息重复消费。
Kafka:
分布式流式处理平台,关于流平台具有三个关键功能:
1、消息队列:发布和订阅消息流,这个功能类似于消息队列,这也是Kafka归类为消息队列的原因。
2、容错的持久方式存储记录消息流:Kafka会将消息持久化到磁盘,有效避免消息丢失的风险。
3、流失处理平台:在消息发布的时候进行处理,Kafka提供了一个完整的流失处理类库。
应用场景:
1、消息队列:建立实时流数据通道,以可靠的在系统或应用程序之间获取数据
2、数据处理:构建实时的流数据处理程序来转换或处理数据流。
与其消息队列相比优势:
1、性能,设计中大量使用了批量处理和异步的思想,最高可以每秒处理千万级别的消息。
2、兼容性,与周边生态系统兼容度最好
队列模型、发布订阅模型
RocketMQ的消息模型跟Kafka基本是完全一样的,唯一区别是Kafka中没有队列这个概念,与之对应的是分区Partition.
Producer(生产者)产生消息的一方,Consumer(消费者)消费消息的一方,Broker(代理)可以看作是一个独立的Kafka实例。多个KafkaBroker组成一个Kafka Cluster.
Kafka的多副本机制:
Kafka为分区(Partition)引入了多副本(Replica)机制。分区中的多个副本之间会有一个叫leader的,其他副本称为follower.发送的消息会被发送到leader副本,然后follower副本才能从leader副本中拉去消息进行同步。生产者和消费者只与leader副本交互,其他副本只是leader副本的拷贝,它们的存在只是为了保证消息存储的安全性。当Leader副本发生故障时从follower中选举出一个leader。
多分区以及多副本机制好处:
Kafka通过给特定Topic指定多个Patition,而各个Partition可以分布在不同的Broker上,方便提供较好的并发能力(负载均衡)。
Partition可以指定对于的Replica数,极大提供消息存储的安全性,提高了容灾能力,不过也增加了所需要的存储空间。
如果保证Kafka中消息消费的顺序,方法:
1、1个Topic只对应一个Partition.
2、发送消息的时候指定key/Partition.
Kafka如何保证消息不丢失:
生产者调用send方法发送消息之后,消息可能因为网络问题并没有发送过去。可以用get()方法调用结果,但是这样也让它变成了同步操作。还可以为Producer的retries(重试次数)设置一个合理的值。
消费者丢失消息的情况:手动关闭偏移量offset使每次真正消费完消息之后在手动提交offset.但是该方法会带来消息重复消费的问题。
Kafka弄丢消息:设置acks = all本来默认值为1,当配置为all时代表所有副本都要接收到该消息之后,该消息才算真正成功被发送。设置replication.factor>=3,保证每个分区至少有3个副本,设置min.insync.replicas>1,消息至少要写入到2个副本才算成功发送,一般设置replication.factor = min.insync.replicas+1;
Kafka如何保证消息不重复消费:
服务端侧已经消费的数据没有成功提交offset
kafka侧由于服务端处理业务时间长或者网络链接等等原因让kafka认为服务假死,出发了分区rebalance。
解决方案:消费消息服务做幂等校验。将enable.auto.commit参数设置为false,关闭自动提交,手动提交offset。
RocketMQ:
一个队列模型的消息中间件,具有高性能、高可靠、高实时、分布式的特点。采用Java语言开发的分布式消息系统
对于主题模型的实现来说每个消息中间件的底层设计都是不一样的,比如Kafka中的分区,RocketMQ中的队列,RabbitMQ中的Exchange。主题模型/发布订阅模型就是一个标准,这些中间件都是照着这个标准去实现而已。
Producer Group 生产者组,Consumer Group 消费者组,Topic 主题,RocketMQ通过使用一个Topic中配置多个队列并且每个队列维护每个消费者的消息位置实现了主题模式/发布订阅模式。
在RocketMQ中使用的是事务消息加上事务反查机制来解决事务问题的。
RabbitMQ:
采用Erlang语言实现AMQP的消息中间件,具体特点可靠性、灵活的路由、扩展性、高可用性、支持多种协议、多语言客户端、易用的管理界面、插件机制
消息 一般由2部分组成:消息头或者说Label和消息体payLoad,消息体是不透明的,而消息头由一系列的可选属性组成,属性包括routing-key路由键、priority相对于其他消息的优先权、delivery-mode该消息可能需要持久性存储。生产者把消息发给RabbitMQ后,RabbitMQ会根据消息头把消息发送给感兴趣的消费者。消息不是直接投递到Queue消息队列中的,必须还经过交换器Exchange,它一般会制定一个路由键,用来指定这个消息的路由规则,经过它过后再分配到队列中。如果路由不到,或许会返回给生产者,或许被丢弃掉。交换器由4种类型,不同类型对应着不同的路由策略:direct默认、fanout、topic、headers,RabbitMQ中通过Binding绑定将交换器和消息队列关联起来。
java中的消息队列相关推荐
- 【Android 异步操作】手写 Handler ( Message 消息 | ThreadLocal 线程本地变量 | Looper 中的消息队列 MessageQueue )
文章目录 一.Message 消息 二.ThreadLocal 线程本地变量 三.Looper 中的消息队列 MessageQueue 一.Message 消息 模仿 Android 中的 Messa ...
- Java中的常用队列
目录 一.队列的理解 二.Java中队列简述 2.1 Queue队列 2.2 双端队列 2.3 阻塞队列 2.4 非阻塞队列 三.各队列的区别与联系 一.队列的理解 队列是一种由数组和链表作为底层构造 ...
- OSSIM中分布式消息队列应用
OSSIM中分布式消息队列应用 1. 消息队列处理 企业日志数量正在以指数级形式高速增长,日志数据的具有海量.多样.异构等特点,基于传统的单一节点混合式安装的OSSIM平台(指OSSIM 4.4及以 ...
- Java中栈和队列的用法 Stack And Queue
Java中栈和队列的用法 栈的实现 使用Java的集合类Stack boolean isEmpty();//判断当前栈是否为空,等价于empty(); synchronized E peek();// ...
- python队列来做什么_python分布式爬虫中的消息队列是什么?
当排队等待人数过多的时候,我们需要设置一个等待区防止秩序混乱,同时再有新来的想要排队也可以呆在这个地方.那么在python分布式爬虫中,消息队列就相当于这样的一个区域,爬虫要进入这个区域找寻自己想要的 ...
- java中的Queue队列的用法
大家好,欢迎来到雄雄的小课堂,今天给大家分享的是"java中的Queue队列的用法" 前言:好多人对Queue不是很熟悉,毕竟平时也不怎么用,遇到集合要么List要么map这些常用 ...
- GaussDB(DWS)中共享消息队列实现的三大功能
摘要:本文将详细介绍GaussDB(DWS)中共享消息队列的实现. 本文分享自华为云社区<GaussDB(DWS)CBB组件之共享消息队列介绍>,作者:疯狂朔朔. 1)共享消息队列是什么? ...
- RTOS中的消息队列的原理以及应用
消息队列的原理 RTOS中的消息队列是一种用于任务间通信的机制,它可以实现任务之间的异步通信,从而实现任务间的解耦.消息队列是一个先进先出的数据结构,任务可以向队列中发送消息,也可以从队列中接收消息. ...
- JAVA中的延时队列DelayQueue
Java中的延时队列DelayQueue是基于优先队列PriorityQueue实现的. 注:PriorityQueue是基于堆(Heap)实现的.堆(Heap)在本质上是一个数组. Priority ...
最新文章
- 6月20日截止,请勿错过热心肠奖学金!
- liferay和cas系统集成
- 《Access 2007开发指南(修订版)》一一2.2 创建新数据库
- python实现ping某一ip_Python实现ping指定IP的示例
- git 配置origin_git配置及操作
- Spring IoC容器总结(未完)
- 算法设计与分析——递归与分治策略——棋盘覆盖
- 127.0.0.1与localhost的区别
- Openfire开发配置,Openfire源码配置,OpenFire二次开发配置
- 计算机中信息表示方法,计算机中的信息表示方法二进制
- MATLAB 中BP神经网络算法用于回归拟合的实现
- 2020 CCF-CSP-S-第一轮-C++ 模拟试卷(五)--有答案
- 强大的网页数据库管理工具Adminer
- 中国研修网计算机培训心得,网络研修培训心得体会(精选7篇)
- C++ 对txt文档进行编辑
- 获取指定区域内的坐标点位,在线查看经纬坐标
- 2021-09-20
- html5 canvas代替flash,替代Flash技术最好的选择------HTML5
- 微型计算机题,微机课练习题
- 计算机cct证书含金量排名,省考CCT和国考NCRE的区别?
热门文章
- 色调映射:Edge-Preserving Decompositions for Multi-Scale Tone and Detail Manipulation
- 毕设-SpringBoot学生请假系统
- 扫描图片怎么变成电子版?不止扫描仪
- vue二级路由和重定向问题
- 03 day2--javascript笔记pink老师--对象
- MYSQL的字符串支持保存表情,比如微信表情
- 如何用电脑画平面坐标图_如何画平面直角坐标系
- 纺织ERP_印染ERP软件_指点ERP简介
- python画笛卡尔心形线_伊对:学霸如何谈恋爱?揭秘不同专业的学霸表白方式
- Vue实战教程:利用自定义实现鼠标拖动元素效果