加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

面试官问你什么是消息队列?把这篇甩给他!

发布时间:2019-04-16 16:35:45 所属栏目:建站 来源:Java3y
导读:一、什么是消息队列? 消息队列不知道大家看到这个词的时候,会不会觉得它是一个比较高端的技术,反正我是觉得它好像是挺牛逼的。 消息队列,一般我们会简称它为MQ(Message Queue),嗯,就是很直白的简写。 我们先不管消息(Message)这个词,来看看队列(Que
副标题[/!--empirenews.page--]

面试官问你什么是消息队列?把这篇甩给他!

一、什么是消息队列?

消息队列不知道大家看到这个词的时候,会不会觉得它是一个比较高端的技术,反正我是觉得它好像是挺牛逼的。

消息队列,一般我们会简称它为MQ(Message Queue),嗯,就是很直白的简写。

我们先不管消息(Message)这个词,来看看队列(Queue)。这一看,队列大家应该都熟悉吧。

队列是一种先进先出的数据结构。

在Java里边,已经实现了不少的队列了:

那为什么还需要消息队列(MQ)这种中间件呢???

  •  到这里,大家可以先猜猜为什么要用消息队列(MQ)这种中间件,下面会继续补充。

消息队列可以简单理解为:把要传输的数据放在队列中。

图片来源:https://www.cloudamqp.com/blog/2014-12-03-what-is-message-queuing.html

科普:

  •  把数据放到消息队列叫做生产者
  •  从消息队列里边取数据叫做消费者

二、为什么要用消息队列?

为什么要用消息队列,也就是在问:用了消息队列有什么好处。我们看看以下的场景

2.1 解耦

现在我有一个系统A,系统A可以产生一个userId

然后,现在有系统B和系统C都需要这个userId去做相关的操作

写成伪代码可能是这样的:

  1. public class SystemA {  
  2.     // 系统B和系统C的依赖  
  3.     SystemB systemB = new SystemB();  
  4.     SystemC systemC = new SystemC();  
  5.     // 系统A独有的数据userId  
  6.     private String userId = "Java3y";  
  7.     public void doSomething() {  
  8.         // 系统B和系统C都需要拿着系统A的userId去操作其他的事  
  9.         systemB.SystemBNeed2do(userId);  
  10.         systemC.SystemCNeed2do(userId);  
  11.     }  

结构图如下:

ok,一切平安无事度过了几个天。

某一天,系统B的负责人告诉系统A的负责人,现在系统B的SystemBNeed2do(String userId)这个接口不再使用了,让系统A别去调它了。

于是,系统A的负责人说"好的,那我就不调用你了。",于是就把调用系统B接口的代码给删掉了:

  1. public void doSomething() {  
  2.   // 系统A不再调用系统B的接口了  
  3.   //systemB.SystemBNeed2do(userId);  
  4.   systemC.SystemCNeed2do(userId);  

又过了几天,系统D的负责人接了个需求,也需要用到系统A的userId,于是就跑去跟系统A的负责人说:"老哥,我要用到你的userId,你调一下我的接口吧"

于是系统A说:"没问题的,这就搞"

然后,系统A的代码如下:

  1. public class SystemA {  
  2.     // 已经不再需要系统B的依赖了  
  3.     // SystemB systemB = new SystemB();  
  4.     // 系统C和系统D的依赖  
  5.     SystemC systemC = new SystemC();  
  6.     SystemD systemD = new SystemD();  
  7.     // 系统A独有的数据  
  8.     private String userId = "Java3y";  
  9.     public void doSomething() {  
  10.         // 已经不再需要系统B的依赖了  
  11.         //systemB.SystemBNeed2do(userId);  
  12.         // 系统C和系统D都需要拿着系统A的userId去操作其他的事  
  13.         systemC.SystemCNeed2do(userId);  
  14.         systemD.SystemDNeed2do(userId);  
  15.     }  

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读