1 为什么使用消息队列啊?

其实就是问问你消息队列都有哪些使用场景,然后你项目里具体是什么场景,说说你在这个场景里用消息队列是什么

面试官问你这个问题,期望的一个回答是说,你们公司有个什么业务场景,这个业务场景有个什么技术挑战,如果不用MQ可能会很麻烦,但是你现在用了MQ之后带给了你很多的好处

先说一下消息队列的常见使用场景吧,其实场景有很多,但是比较核心的有3个:解耦、异步、削峰

2 消息队列有什么优点和缺点啊?

优点上面已经说了,就是在特殊场景下有其对应的好处,解耦、异步、削峰

缺点呢?显而易见的

系统可用性降低:系统引入的外部依赖越多,越容易挂掉,本来你就是A系统调用BCD三个系统的接口就好了,人ABCD四个系统好好的,没啥问题,你偏加个MQ进来,万一MQ挂了咋整?MQ挂了,整套系统崩溃了,你不就完了么。

系统复杂性提高:硬生生加个MQ进来,你怎么保证消息没有重复消费?怎么处理消息丢失的情况?怎么保证消息传递的顺序性?头大头大,问题一大堆,痛苦不已

一致性问题:A系统处理完了直接返回成功了,人都以为你这个请求就成功了;但是问题是,要是BCD三个系统那里,BD两个系统写库成功了,结果C系统写库失败了,咋整?你这数据就不一致了。

所以消息队列实际是一种非常复杂的架构,你引入它有很多好处,但是也得针对它带来的坏处做各种额外的技术方案和架构来规避掉,最好之后,你会发现,妈呀,系统复杂度提升了一个数量级,也许是复杂了10倍。但是关键时刻,用,还是得用的。。。

3 kafka、activemq、rabbitmq、rocketmq都有什么优点和缺点啊?

常见的MQ其实就这几种,别的还有很多其他MQ,但是比较冷门的,那么就别多说了

综上所述,各种对比之后,我个人倾向于是:

一般的业务系统要引入MQ,最早大家都用ActiveMQ,但是现在确实大家用的不多了,没经过大规模吞吐量场景的验证,社区也不是很活跃,所以大家还是算了吧,我个人不推荐用这个了;

后来大家开始用RabbitMQ,但是确实erlang语言阻止了大量的java工程师去深入研究和掌控他,对公司而言,几乎处于不可控的状态,但是确实人是开源的,比较稳定的支持,活跃度也高;

不过现在确实越来越多的公司,会去用RocketMQ,确实很不错,但是我提醒一下自己想好社区万一突然黄掉的风险,对自己公司技术实力有绝对自信的,我推荐用RocketMQ,否则回去老老实实用RabbitMQ吧,人是活跃开源社区,绝对不会黄

所以中小型公司,技术实力较为一般,技术挑战不是特别高,用RabbitMQ是不错的选择;大型公司,基础架构研发实力较强,用RocketMQ是很好的选择

如果是大数据领域的实时计算、日志采集等场景,用Kafka是业内标准的,绝对没问题,社区活跃度很高,绝对不会黄,何况几乎是全世界这个领域的事实性规范

在项目青橙电商中的应用场景

场景一、用户注册

需求分析

注册账号,用手机号注册,填写后发送短信验证码,填写短信验证码正确方可注册成功。

实现思路

(1)发送短信验证码逻辑:用户服务将要发送的短信验证码发送给rabbitmq和redis ,短信服务将消息从rabbitmq中取出并调用阿里云通信发送短信。阿里云通信整合了三大运营商的短信网关,最终把验证码发送到用户的手机上。rabbitmq采用直接模式,用户服务为消息生产者,短信服务为消息消费者。



(2)注册逻辑:注册时从redis中提取短信验证码与用户填写的验证码进行比对,如果一致则可以注册,否则拦截请求。

场景二、商品上下架消息处理

需求分析

在商品上架后,生成商品详细页和新增elasticsearch索引数据。

在商品下架后,删除商品详细页和删除elasticsearch数据。

以上操作采用消息中间件rabbitmq解耦调用。

实现思路

因为有多种业务逻辑需要处理,所以我们需要使用分列模式来处理请求。

(1)创建两个服务工程

一是商品详细页生成服务(qingcheng_service_page),对上架的商品重新生成上新品详细页。

二是索引数据更新服务(qingcheng_service_index),对上架的商品重新导入索引库。

(2)通过配置文件实现:

rabbitmq 新增两个交换器 ,分别是商品上架交换器和商品下架交换器。

rabbitmq 新增商品详细页生成队列、商品详细页删除队列、elasticsearch数据新增队列、elasticsearch数据删除队列。

商品上架交换器绑定新增商品详细页生成队列和elasticsearch数据新增队列

商品下架交换器绑定商品详细页删除队列和elasticsearch数据删除队列

(3)在商品服务的上架发送消息到rabbitmq的商品上架交换器,在商品服务的下架发送消息到rabbitmq的商品下架交换器

(4)商品详细页生成服务从 新增商品详细页生成队列和商品详细页删除队列提取消息进行逻辑处理

(5)索引数据更新服务从elasticsearch数据新增队列和elasticsearch数据删除队列提取消息进行逻辑处理。

最新文章

  1. CSS3鼠标滑过图标放大以及旋转
  2. Leetcode 15. 3Sum
  3. todoList使用教程
  4. powershell字符界面的,powershell加WPF界面的,2048游戏
  5. 性能优化之Java(Android)代码优化
  6. Cesium简介
  7. SQL服务器名称更改
  8. hackerrank【Lego Blocks】:计数类dp
  9. EL表达式学习
  10. 如何快速成长?我的java之路!
  11. 无序列表li横向排列的间隙问题
  12. OAuth2.0学习(1-11)新浪开放平台微博认证-使用OAuth2.0调用微博的开放API
  13. 远程连接身份验证错误,又找不到加密Oracle修正
  14. 3、Linux常用命令
  15. 重写 console.log()
  16. oninput事件和onchange事件区别
  17. SR-IOV虚拟机的MTU与物理网卡的MTU
  18. LTDC/DMA2D—液晶显示
  19. C语言之动态分配内存
  20. C#类的访问修饰符

热门文章

  1. 教你玩转CSS Overflow
  2. 【commons-pool2源码】写前思考
  3. Java Socket编程基础及深入讲解
  4. SpringBoot2.x中的AOP机制总结(附带demo)
  5. 逆向基础 C++ Primer Plus 第二章 开始学习C++
  6. Microsoft Teams 2021最新功能发布解读 – 会议篇
  7. Java 面向对象 01
  8. Windows常用快捷键和基本dos命令
  9. Prometheus自定义指标
  10. CMDB项目要点之技术点(面试题)