侧边栏壁纸
博主头像
Terry

『LESSON 5』

  • 累计撰写 90 篇文章
  • 累计创建 21 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录
MQ

消息队列

Terry
2020-05-10 / 0 评论 / 0 点赞 / 602 阅读 / 1,042 字 / 正在检测是否收录...

消息模型

  1. 点对点
    消息生产者向消息队列中发送一个消息之后,只能被一个消费者消费一次.
  2. 发布/订阅
    消息生产者向频道发送一个消息之后,多个消费者可以从该频道订阅到这条消息并消费.
  3. 发布与订阅模式的观察者模式不同点
  • 观察者模式中,观察者和主体都知道对方的存在.而在发布与订阅模式中,生产者与消费者不知道对方的存在,他们之间通过频道进行通信.
  • 观察者模式是同步的,当事件触发时,主体会调用观察者的方法,然后等待方法返回.而发布与订阅模式是异步的,生产者只要向频道
    发送一个消息后,就不需要关心消费者何时去订阅这个消息,可以立即返回.

使用场景

  1. 异步处理
    发布者把消息发送给消息队列之后,不需要同步等待消息接收处理完毕,而是立即返回进行其他操作.消息接收者从消息队列中订阅信息之后异步处理.
    eg:比方说我公司是做旅游的,需要通过渠道接口推送价格到渠道更新,这时候可以把价格发送到消息队列,接下的操作都是异步的,
    价格推送到渠道更新这个行为操作在消息队列处理,不会影响我接下来的操作.
    只有在业务流程允许异步处理的情况下才能这么做,如果是必须同步的,就不能再使用消息队列.
  2. 流量削峰
    在高并发的场景下,如果短时间有大量的请求到达会压垮服务器.
    可以将请求发送到消息队列中,服务器按照其处理能力从消息队列中订阅信息进行处理.
    eg:1.比方我们做旅游的,供应商端必会提供限流,比如20QPS,这时候如果超过的话会获取不到数据.这时候我们可以通过消息队列进行
    处理,降低对接口的请求.2.记录日志方面,我们也可以通过消息队列进行日志写入.
  3. 应用解耦
    如果模块之间不直接进行调用,模块之间耦合度就会很低,那么修改一个模块或者新增一个模块对其他模块的影响会很小,从而实现可扩展性.
    通过消息队列,一个模块只需要向消息队列中发送消息,其他模块可以选择性地从消息队列中订阅消息从而完成调用.

可靠性

  1. 发送端的可靠性
    发送端完成操作后一定能将消息成功发送到消息队列中.无需关心接收端处理问题.
  2. 接收端的可靠性
    接收端能够从消息队列成功消费一次消息.以下两种方式:
  • 保证接收端处理消息的业务逻辑具有幂等性.只要具有幂等性,那么消费多少次消息,最后处理的结果都是一样的.
  • 保证消息具有唯一编号,并使用MYSQL/elk记录下日志消费信息.
0

评论区