MQ的学习记录~

MQ是一个消息中间件,是为了解决发送者和接收者处理速度不匹配的问题而产生的,有队列和主题两种。

队列:一对一。

主题:一对多。例如有100人订阅了我的公众号,当我在公众号上发布新的文章时100人都能收到推送消息。

 

MQ的主要作用:

  1.异步:在使用MQ后发送者和接收者之间无需等待,发送者只需要讲消息发送给MQ即可无需关心接收者何时接受,如何处理。

  2.解耦:可以解决应用或者模块之间的耦合问题。

  3.削峰:抵御流量洪峰。在一个业务中突然有大量的请求发送来的时候可以保护主业务的正常运转。例如:秒杀业务就可以使用MQ,系统接收到的请求只需要放置在MQ中即可。用户虽然只是点击了一个下单按钮但后台实际业务会有很多操作:检查库存、锁定库存、检查余额、锁定余额等等....当过多的业务请求堆积在一起时MQ就可以起到削峰的作用从而保护主业务了。

 

 

2021.02.23

队列总结:

  两种方式:

  1.同步阻塞方式(receive):接收者使用receive的方式来接收数据,receive可以设置时间。

  2.异步非阻塞方式(onMessage):使用监听器进行接收数据,当消息到达后系统会自动调用监听器来处理。

队列特点:

  1.每个消息都只有一个消费者,他们是一对一的。

  2.消息的生产者和消费者质检时异步的,他们在时间上没有相关性。

  3.生产者在生产消息时队列会保存消息。消息被消费后不会再存在,消费者不可能拿到被消费掉的消息。

队列消费情况:

  在同一个生产者的情况下:

  1.存在一个消费者:所有消息都会被当前消费者消费。

  2.先启动一个消费者,再启动一个消费者:所有消息都会被第一个消费者消费掉。

  3.在消息生产前同时启动两个消费者:两个消费者会轮询对消息进行平分。

 

topic特点:

  1.在topic中一个生产者可以被多个消费者消费。

  2.消费者和生产者之间存在时间上的关系,消费者只能收到订阅某个topic之后的消息,订阅之前的消息是无法接收的。

  3.生产者生产时,topic不保存消息,应该先启动消费者在启动生产者。

 

2021.02.24

什么是JMS?

是指两个应用之间进行消息的创建、发送、接收读取,是一套异步通信的API标准体系和规范。使用JMS进行通信时两个应用之间不是直接相连接的而是通过MQ来实现的从而达到削峰、解耦、异步的效果。

JMS中有消息的生产者、消息的消费者、MQ(实现JMS规范的消息中间件)、消息内容(消息头、消息体、消息属性)

 

JMS消息头中的属性:

  JMSDestination:消息目的地(发送到哪里)

  JMSDeliveryMode:消息持久化模式(是否开启持久化操作)

  JMSExpiration:消息过期时间

  JMSPriority:消息的优先级(0-4为普通消息,以上为加急消息。加急消息优先于普通消息)

  JMSMessageID:消息的唯一标识符

 

JMS消息体常用的有:

  TextMessage:一个普通的字符串消息,就是String

  MapMessage:一个MAP类型的消息,kv结构。k为String类型,v为java中的基本类型

 

JMS中的消息属性:

  是对JMS消息体的一种扩展信息,可以用于标识、去重等使用。

 

什么是消息持久化?

  消息持久化是指生产者将消息发送至MQ之后,不论出现什么问题,例如:如果出现宕机之类的情况,MQ都会保证消费者可以接收到消息。

 

queue的消息持久化和消息的非持久化:

  消息发送至MQ如果宕机了消息也没了就是非持久化。如果宕机了消息还有直到被消费者消费之后才会消失则是持久化。

 

topic的消息持久化和消息非持久化:

  topic是默认非持久化的。因为消息的生产者在生产消息时消费者必须在线才可以接收到消息。

  topic的持久化,只要消费者订阅过MQ那么在生产者生产消息后消费者就可以接收到消息,无论消费者在线与否、服务器宕机与否。就像订阅微信公众号一样,只要订阅了就可以收到生产者生产的消息。

 

建议使用auto+nio的协议和IO模型类型(此处需要修改配置),nio是一种非阻塞的IO模型相比原先阻塞IO(BIO)性能要好很多,auto像适配器一样会根据url中指定的传输协议自己去匹配,web开发建议还是使用tcp。

posted @ 2021-02-21 21:16  茴香饺子、  阅读(90)  评论(0编辑  收藏  举报