Java高并发--消息队列
Java高并发--消息队列
主要是学习慕课网实战视频《Java并发编程入门与高并发面试》的笔记
举个例子:在购物商城下单后,希望购买者能收到短信或者邮件通知。有一种做法时在下单逻辑执行后调用短信发送的API,如果此时服务器响应较慢、短信客户端出现问题等诸多原因购买者不能正常收到短信,那么此时是不断重试呢还是直接放弃发送呢?不管选择哪一种,在实现上都会变得复杂。
消息队列是如何解决的呢?可以讲发送短信这个过程封装成一条消息,发送到消息队列,消息队列按照一定顺序依次处理队列中的消息,在某一个时刻就会处理刚才收到的发送短信的消息。消息队列会通知一个服务去发送这个短信,顺利的话这个消息刚被放进队列就会被处理,这种情况一次性就发送成功了。如果出现了什么问题,可以再次将该消息放进消息队列中等待处理。

上面的例子中如果使用消息队列,其好处是将发送短信这个流程与其他功能解耦,发送短信时只需要保证将这条消息发送到消息队列就行了,然后就可以处理发送短信后的其他事情了;其次,系统设计变得简单,不用在下单的场景下过多的考虑发送短信的问题,而是交给了消息队列来处理这个事。而且可以保证消息一定会被发送出去,消息只要没有发送成功会不断被重新加入到消息队列。如果短信服务出现问题,那么等到服务恢复了,消息队列再发送出去即可,只是发送的不那么及时而已。
消息队列的特性
和业务无关:只负责消息分发
- FIFO:先投递先到达
- 容灾:得益于节点的动态增删和消息的持久化
性能:吞吐量提升,系统内部通信效率提高
什么时候需要消息队列呢?当生产和消费的速度和稳定性等因素不一致时,消息队列可以弥补双方的差异。
消息队列的好处:
- 业务解耦
- 最终一致性(两个系统的状态保持一致,要么都成功要么都失败)
- 广播
- 错峰与流控
Java高并发--消息队列的更多相关文章
- java高并发系列 - 第25天:掌握JUC中的阻塞队列
这是java高并发系列第25篇文章. 环境:jdk1.8. 本文内容 掌握Queue.BlockingQueue接口中常用的方法 介绍6中阻塞队列,及相关场景示例 重点掌握4种常用的阻塞队列 Queu ...
- Java高并发如何解决
Java高并发如何解决 对于我们开发的网站,如果网站的访问量非常大的话,那么我们就需要考虑相关的并发访问问题了.而并发问题是绝大部分的程序员头疼的问题,但话又说回来了,既然逃避不掉,那我们就坦然面对吧 ...
- 转载:Java高并发,如何解决,什么方式解决
原文:https://www.cnblogs.com/lr393993507/p/5909804.html 对于我们开发的网站,如果网站的访问量非常大的话,那么我们就需要考虑相关的并发访问问题了.而并 ...
- 【转】Java高并发,如何解决,什么方式解决
原文地址:https://www.cnblogs.com/lr393993507/p/5909804.html 对于我们开发的网站,如果网站的访问量非常大的话,那么我们就需要考虑相关的并发访问问题了. ...
- Java分布式:消息队列(Message Queue)
Java分布式:消息队列(Message Queue) 引入消息队列 消息,是服务间通信的一种数据单位,消息可以非常简单,例如只包含文本字符串:也可以更复杂,可能包含嵌入对象.队列,是一种常见的数据结 ...
- java高并发系列 - 第6天:线程的基本操作
新建线程 新建线程很简单.只需要使用new关键字创建一个线程对象,然后调用它的start()启动线程即可. Thread thread1 = new Thread1(); t1.start(); 那么 ...
- java高并发系列 - 第12天JUC:ReentrantLock重入锁
java高并发系列 - 第12天JUC:ReentrantLock重入锁 本篇文章开始将juc中常用的一些类,估计会有十来篇. synchronized的局限性 synchronized是java内置 ...
- 跟着阿里p7一起学java高并发 - 第18天:玩转java线程池,这一篇就够了
java中的线程池,这一篇就够了 java高并发系列第18篇文章. 本文主要内容 什么是线程池 线程池实现原理 线程池中常见的各种队列 自定义线程创建的工厂 常见的饱和策略 自定义饱和策略 线程池中两 ...
- java高并发系列 - 第13天:JUC中的Condition对象
本文目标: synchronized中实现线程等待和唤醒 Condition简介及常用方法介绍及相关示例 使用Condition实现生产者消费者 使用Condition实现同步阻塞队列 Object对 ...
随机推荐
- 背水一战 Windows 10 (113) - 锁屏: 将 Application 的 Badge 通知和 Tile 通知发送到锁屏, 将 secondary tile 的 Badge 通知和 Tile 通知发送到锁屏
[源码下载] 背水一战 Windows 10 (113) - 锁屏: 将 Application 的 Badge 通知和 Tile 通知发送到锁屏, 将 secondary tile 的 Badge ...
- 如何推翻JAVA的统治地位?
“java越来越过份了.”php狠狠的说,他转头看着C:“C哥,您可是前辈,java最近砸了我不少场子,您老再不出来管管,我怕他眼里就没有您了啊.” C哥吸烟,慢慢的说:“年轻人不要着急,java的根 ...
- Javascript高级编程学习笔记(55)—— DOM2和DOM3(7)操作范围
操作范围中的内容 在创建范围时,内部会为这个范围创建一个文档片段 范围所属的全部节点都会被添加到这个片段中 虽然选取范围可以不是完整的.良好的DOM结构 但是在这个为范围创建的文档片段中,会自己完缺少 ...
- Pycharm Debug调试心得
1.操作步骤: 1-1.添加断点:直接在标记处点击鼠标左键即可.(删除断点只需再点击断点处即可) 1-2.Debug下运行代码 1-3.按照所需调试进行代码调试.Debug的调试方式如下所示: 分别为 ...
- SpringMVC框架二:SpringMVC与MyBatis整合
下面整合SpringMVC和MyBatis框架,并做一个小案例 创建数据库springmvc,并创建两张表,加入一些数据: 两张表:商品表,用户表 CREATE DATABASE springmvc; ...
- python高级-异常(13)
一.异常介绍 print("1---------------------") open("123.txt","r") print(" ...
- django 模板层排序 class Meta 添加信息
class weeks(models.Model): #星期信息 stu = models.ForeignKey(students,on_delete=models.CASCADE) weeklist ...
- RabbitMQ管理界面
Management Plugin rabbitmq-management插件提供基于HTTP的API方式管理和监控你的RabbitMQ服务器. 可以使用基于浏览器的UI界面,也可以使用命令行(rab ...
- Linux编程 19 编辑器(vim 用法)
一.概述 在开启shell脚本编程之前,必须要知道一款文本编辑器的用法,如文本编辑的查找,剪切,粘贴,定位等, 本篇只讲vim编辑器.vim编辑器全名叫vi improved,是经过对Unix系统vi ...
- 【原】gulp工作中的实战
写这篇文章的目的是为了以后的项目中懒得再去配gulp,直接可以拿这篇博客中的来用,因为有时候配置还是挺烦人的. gulp相关插件的介绍 用法比较简单,假设大家都会用gulp,下面主要介绍一下一些插件的 ...