应用场景

1.商品秒杀

短时间内出现爆发式的用户请求,如果不采取相关的措施,会导致服务器忙不过来,响应超时的问题,轻则会导致服务假死,重则会让服务器直接宕机。

这个时候加上了消息队列,服务器接收到用户的所有请求后,先把这些请求全部写入到消息队列中再排队处理,这样就不会导致同时处理多个请求的情况;如果消息队列长度超过可以承载的最大数量,那么我们可以抛弃当前用户的请求,通知前台用户“页面出错啦,请重新刷新”等提示,这样就会有更好的交互体验。

2.系统解耦

使用了消息队列之后,我们可以把系统的业务功能模块化,实现系统的解耦。

产品需求不断变化,这个时候我们想到了使用消息队列来实现系统的解耦,每个功能的实现独立开,只需要一个订阅或者取消订阅的开关就可以了,当需要增加功能时,只需要打开订阅“用户信息完善”的队列就行,如果过两天不用了,再把订阅的开关关掉就行了。

3.日志记录

常规做法:用户请求-(处理用户请求,记录日志(需完成))-回复前台

使用消息队列:用户请求-处理用户请求-放入消息队列,直接回复前台

消息中间件-RabbitMQ

目前市面上比较常用的 MQ(Message Queue,消息队列)中间件有 RabbitMQ、Kafka、RocketMQ,如果是轻量级的消息队列可以使用 Redis 提供的消息队列

重要概念

生产者:消息的创建者,负责创建和推送数据到服务器

消费者:消息的接收方,用于处理数据和确认消息

代理:RabbitMQ服务本身,它用于扮演“快递”的角色,因为它本身并不生产消息,只是扮演了“快递”的角色,把消息进行暂存和传递。

处理流程图

优点:

支持持久化,RabbitMQ 支持磁盘持久化功能,保证了消息不会丢失;
高并发,RabbitMQ 使用了 Erlang 开发语言,Erlang 是为电话交换机开发的语言,天生自带高并发光环和高可用特性;
支持分布式集群,正是因为 Erlang 语言实现的,因此 RabbitMQ 集群部署也非常简单,只需要启动每个节点并使用 --link 把节点加入到集群中即可,并且 RabbitMQ 支持自动选主和自动容灾;
支持多种语言,比如 Java、.NET、PHP、Python、JavaScript、Ruby、Go 等;
支持消息确认,支持消息消费确认(ack)保证了每条消息可以被正常消费;
它支持很多插件,比如网页控制台消息管理插件、消息延迟插件等,RabbitMQ 的插件很多并且使用都很方便。

消息类型:

direct(默认类型)模式,此模式为一对一的发送方式,也就是一条消息只会发送给一个消费者;
headers 模式,允许你匹配消息的 header 而非路由键(RoutingKey),除此之外 headers 和 direct 的使用完全一致,但因为 headers 匹配的性能很差,几乎不会被用到;
fanout 模式,为多播的方式,会把一个消息分发给所有的订阅者;
topic 模式,为主题订阅模式,允许使用通配符(#、*)匹配一个或者多个消息,我可以使用“cn.mq.#”匹配到多个前缀是“cn.mq.xxx”的消息,比如可以匹配到“cn.mq.rabbit”、“cn.mq.kafka”等消息。

自定义消息队列

我们可以使用Queue 来实现消息队列,Queue 大体可分为以下三类:

双端队列

是Queue的子类也是Queue补充类,头部和尾部支持元素的插入和获取

阻塞队列指的是在元素操作时(添加或删除),如果没有成功,会阻塞等待执行,比如当添加元素时,如果队列元素已满,队列则会阻塞等待直到有空位时再插入;
非阻塞队列,和阻塞队列相反,它会直接返回操作的结果,而非阻塞等待操作,双端队列也属于非阻塞队列。

自定义消息队列代码块

import java.util.LinkedList;
import java.util.Queue;public class CustomQueue {private static Queue<String> queue=new LinkedList<>();public static void main(String[] args) {producer();consumer();}//生产者public static void producer(){queue.add("first-message");queue.add("second-message");queue.add("third-message");}//消费者public static void consumer(){while (!queue.isEmpty()){System.out.println(queue.poll());}}
}

first-message
second-message
third-message

自定义延迟队列

import lombok.Getter;
import lombok.Setter;import java.text.DateFormat;
import java.util.Date;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;public class CustomDelayQueue {private static DelayQueue queue=new DelayQueue();public static void main(String[] args) throws InterruptedException {producer();consumer();}//生产者public static void producer(){queue.add(new MyDelay(3000,"first-message"));queue.add(new MyDelay(1000,"second-message"));}//消费者public static void consumer() throws InterruptedException {System.out.println("开始执行时间:"+DateFormat.getDateTimeInstance().format(new Date()));while (!queue.isEmpty()){System.out.println(queue.take());}System.out.println("结束执行时间:"+DateFormat.getDateTimeInstance().format(new Date()));}//static class MyDelay implements Delayed{long delayTime=System.currentTimeMillis();@Getter@Setterprivate String msg;public MyDelay(long delayTime,String msg){this.delayTime=(this.delayTime+delayTime);this.msg=msg;}@Overridepublic long getDelay(TimeUnit unit) {return unit.convert(delayTime-System.currentTimeMillis(),TimeUnit.MILLISECONDS);}@Overridepublic int compareTo(Delayed o) {if(this.getDelay(TimeUnit.MILLISECONDS)>o.getDelay(TimeUnit.MILLISECONDS))return 1;else if(this.getDelay(TimeUnit.MILLISECONDS)<o.getDelay(TimeUnit.MILLISECONDS))return -1;else return 0;}@Overridepublic String toString() {return this.msg;}}
}

开始执行时间:2020-12-28 19:41:20
second-message
first-message
结束执行时间:2020-12-28 19:41:23

消息队列和延迟消息队列相关推荐

  1. java实现消息队列以及延迟消息(队列DelayQueue)

    1.java实现延迟消息(队列DelayQueue) DelayQueue是一个支持延时获取元素的无界阻塞队列.队列使用PriorityQueue来实现.队列中的元素必须实现Delayed接口,在创建 ...

  2. MQ延迟队列实现延迟消息

    在开发中经常会遇到延时任务的需求,例如在12306购买车票,若生成订单30分钟未支付则自动取消:还有在线商城完成订单后48小时不评价 ,自动5星好评.像这类在某事件触发后一段时间内执行的需求任务我们称 ...

  3. 发送延迟消息_微信延迟消息的发送方式

    Part one. 如何使用微信来发送延迟消息呢? Part two. 之前一次偶然的机会,想要定时发送一个消息给朋友,于是产生了微信能否发送定时消息这个念头.去百度了一下,找到了方法.微信是可以定时 ...

  4. kafka消息消费有延迟_消息中间件选型分析---从Kafka与RabbitMQ的对比来看全局

    有很多网友留言:公司要做消息中间件选型,该如何选?你觉得哪个比较好?消息选型的确是一个大论题,实则说来话长的事情又如何长话短说.对此笔者专门撰稿一篇内功心法:如何看待消息中间件的选型,不过这篇只表其意 ...

  5. RocketMQ延迟消息的代码实战及原理分析

    RocketMQ简介 RocketMQ是一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的.高可靠.万亿级容量.灵活可伸缩的消息发布与订阅服务. 它前身是MetaQ,是阿里基于Kafka ...

  6. 干货 | 携程基于BookKeeper的延迟消息架构落地实践

    作者简介 本文作者magiccao.littleorca,来自携程消息队列团队.目前主要从事消息中间件的开发与弹性架构演进工作,同时对网络/性能优化.应用监控与云原生等领域保持关注. 一.背景 QMQ ...

  7. 深入理解RocketMQ延迟消息

    延迟消息是实际开发中一个非常有用的功能,本文第一部分从整体上介绍秒级精度延迟消息的实现思路,在第二部分结合RocketMQ的延迟消息实现,进行细致的讲解,点出关键部分的源码.第三步介绍延迟消息与消息重 ...

  8. RocketMQ源码分析之延迟消息

    文章目录 前言 一.延迟消息 1.特点 2.使用场景 3.demo 二.发送延迟消息 三.broker端存储延迟消息 四.总结 1.延迟消息工作原理 2.延迟消息在消费者消费重试中的应用 前言 本篇文 ...

  9. 延迟消息的五种实现方案

    生产者把消息发送到消息队列中以后,并不期望被立即消费,而是等待指定时间后才可以被消费者消费,这类消息通常被称为延迟消息.延迟消息的应用场景其实是非常的广泛,比如以下的场景: 网上直播授课时,在课程开始 ...

最新文章

  1. js加载html的head偶尔失效,外部 js 文件偶尔会加载失败
  2. 成都大学的计算机排名,成都除了成都大学,还有2所985、4所211,含金量很高
  3. VM Depot 分布式计算框架主题应用精选
  4. All About Angular 2.0
  5. TF之data_format:data_format中的NHWCNCHW简介、转换的详细攻略
  6. 好文深思:1.3 万亿条数据查询,如何做到毫秒级响应?
  7. 用sql从文件中恢复数据库
  8. Ubuntu18.04 unzip解压zip文件乱码的解决方法
  9. cookie 和 session 详解
  10. [VB.NET]文件观察对象FileSystemWatcher
  11. 多层full-connect 神经网络测试
  12. 图解通信原理与案例分析-34:车联网中的系统架构与主要的通信技术
  13. 7-22 寻找大富翁 (25 分)
  14. 【几种恢复误关Chrome标签页的方法】
  15. LDO系列--PSRR
  16. php欢迎界面代码,分享微信小程序欢迎界面开发的实例代码
  17. Python 编写个情人节求爱对联
  18. 韩顺平视频全集 云盘链接
  19. 几种常见的数据分析图
  20. 第2章 数字系统 (计算机科学导论)

热门文章

  1. 品牌VI设计与网站设计
  2. 录ppt的时候录光标_课程录制时对PPT的几种处理方法
  3. php数组键值一样的合并,php合并数组并保留键值 php合并数组并保留键值的实现方法...
  4. Python通过cv2函数截图方法
  5. Mac系统 mysql连接工具--sequel pro
  6. 2021上海益生产品(益生菌)展告知您吃益生菌多久才有效?
  7. Ubuntu18.04上安装ROS的详细教程
  8. Unity 获取搜狗语音平台的令牌且对返回的字符串解析
  9. 天纵智能软件快速开发平台文件管理插件一
  10. 生信学习之通路富集一(GO分析)