1. 你们的项目为什么要用RabbitMQ?
    消息队列的作用是系统解耦、同步改异步、请求消峰,举个下订单的例子:
    前端获取用户订单信息,请求后端的订单创建接口。这个接口并不直接请求订单服务,而是首先生成唯一订单编号,再组装一个订单消息并发送给RabbitMQ,然后返回唯一订单编号给前端。前端会根据唯一订单编号轮询订单状态接口,如果订单创建成功,则拉起支付界面引导用户付款。作为消费者,订单服务收到订单消息后,开始检查参数、检查库存、生成订单等等核心业务流程。
    解耦体现在订单创建接口并没有直接访问订单服务,使得它不用关注订单服务接口的变化。由于不是直接调用,同步操作变成了异步操作。试想一下,订单创建状态是同步返回的,用户界面必然卡起来。由于消息队列允许消息堆积,即使大量的用户订单涌过来,订单服务依然能够稳步的处理订单消息。

  2. 为什么非要用RabbitMQ,考虑过RocketMQ或者ActiveMQ吗?
    近些年ActiveMQ更新较少,而且没有大规模吞吐量场景的验证,就不考虑了。我们考虑过RocketMQ,无论是可用性、吞吐量、成功案例,它都很不错。我们的运维团队对RabbitMQ更熟悉,而且更看重消息的可靠性,最后选择了RabbitMQ。

  3. 采用RabbitMQ怎么避免消息丢失?
    1. 生产者丢失消息:RabbitMQ提供transaction和confirm模式来确保生产者不丢消息。开启事务channel.txSelect(),然后发送消息,如果发送过程中出现什么异常,事务就会回滚channel.txRollback(),如果发送成功则提交事务channel.txCommit()。但是这种方式会导致吞吐量下降。confirm模式用的居多:一旦channel进入confirm模式,所有在该信道上发布的消息都将会被指派一个唯一的ID(从1开始),一旦消息被投递到所有匹配的队列之后;rabbitMQ就会发送一个ACK给生产者(包含消息的唯一ID),这就使得生产者知道消息已经正确到达目的队列了;如果rabbitMQ没能处理该消息,则会发送一个Nack消息给生产者,生产者可以重试。
    2. 消息列表丢失消息:开启持久化磁盘的配置
    3. 消费者丢失消息:处理消息成功后,手动回复确认消息。
  4. 通过RabbitMQ能实现定时任务吗?
    RabbitMQ并不支持设置定时消息,但是可以通过过期消息和死信队列来实现。
    有2种方式设置消息的过期时间,第一种通过对队列进行设置,该队列中所有的消息都存在相同的过期时间,第二种对消息本身进行设置,那么每条消息的过期时间都不一样。如果同时使用这2种方法,那么以过期时间小的那个数值为准。当消息达到过期时间还没有被消费,那个消息就成为了一个死信消息。消费者监听死信交换器绑定的队列,就能消费到消息,做相应的业务处理。

  5. 哪几种情况会变成死信消息?
    3种情况,消息被拒绝、消息过期了、队列达到最大的长度。

参考(部分摘抄的文字版权属于原作者):

https://www.cnblogs.com/woadmin/p/10537174.html
https://blog.csdn.net/jerryDzan/article/details/89183625

鸡汤:不要装逼,别人都看得出来。

面试连环炮系列(五):你们的项目为什么要用RabbitMQ的更多相关文章

  1. 面试连环炮系列(二十一):你们的项目怎么使用kafka

    你们的项目怎么使用kafka? 我们采用kafka进行日志采集,准确点说是ELK方案,即elasticsearch + logstash + kibana + kafka.通过Spring AOP的方 ...

  2. 面试连环炮系列(二):你们的项目Redis做了集群部署吗

    你们的项目Redis做了集群部署吗? 我们有大量数据需要缓存,而单实例的容量毕竟是有限的,于是做了Redis集群部署. 采取的方案是什么,Codis还是Redis Cluster,为什么要选择这个方案 ...

  3. 面试连环炮系列(十五):说说Eureka的高可用方案

    说说Eureka的高可用方案 至少3个Eureka实例才能满足高可用,配置方法如下: 准备三个节点node1,node2,node3. 在每个实例的application.xml文件里加入 eurek ...

  4. 面试连环炮系列(二十三): StringBuffer与StringBuild的区别

    StringBuffer与StringBuild的区别 频繁修改字符串时,建议使用StringBuffer和StringBuilder类.StringBuilder相较于StringBuffer有速度 ...

  5. 面试连环炮系列(二十):TCP的滑动窗口协议是什么

    TCP的滑动窗口协议是什么 滑动窗口协议,用于网络数据传输时的流量控制,以避免拥塞的发生.该协议允许发送方在停止并等待确认前发送多个数据分组.由于发送方不必每发一个分组就停下来等待确认,因此该协议可以 ...

  6. 面试连环炮系列(十四): HTTP状态码302的跳转逻辑

    HTTP状态码302的跳转逻辑 302状态码表示重定向,浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址可以从响应的Location首部中获取(用户看到的效果就是他输入的地 ...

  7. 面试连环炮系列(三):synchronized怎么用的

    synchronized怎么用的? 用过,synchronized是常用的并发控制关键字,简单的说就是访问加锁.它可以修饰静态方法或者一个类的class对象,这叫类锁:可以修饰普通方法或者代码块,这叫 ...

  8. 面试连环炮系列(七):HashMap的put操作做了什么

    HashMap的put操作做了什么? HashMap的是由数组和链表构成的,JDK7之后加入了红黑树处理哈希冲突.put操作的步骤是这样的: 根据key值计算出哈希值作为数组下标.如果数组的这个位置是 ...

  9. 面试连环炮系列(八):服务器CPU飙升100%怎么排查

    服务器CPU飙升100%怎么排查 执行"top"命令,查看当前进程CPU占用的实时情况,PID列是进程号,确定是哪个应用程序的问题. 如果是Java应用导致的,怎么定位故障原因 执 ...

随机推荐

  1. Vsftp与PAM虚拟用户

    使用yum 安装vsftp yum install vsftpd pam pam-* db4 db4-* 创建一个保存用户及密码的文件 cd /etc/vsftpd/ touch virtual_lo ...

  2. 【如何让代码变“高级”(二)】-这样操作值得一波666(Java Stream)(这么有趣)

    [如何让代码变“高级”(二)]-这样操作值得一波666(Java Stream)(这么有趣) 开发中的代码 在开发中的代码是不是很常见这样的代码: 这样的? for循环取元素取值 List<Us ...

  3. 压缩感知重构算法之IRLS算法python实现

    压缩感知重构算法之OMP算法python实现 压缩感知重构算法之CoSaMP算法python实现 压缩感知重构算法之SP算法python实现 压缩感知重构算法之IHT算法python实现 压缩感知重构 ...

  4. 2019CCPC秦皇岛D题 Decimal

    Decimal Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total S ...

  5. 教你们学习一个最简单又企业最需要的服务-crond

    第13章 定时任务的介绍 13.1 定时任务的分类 13.1.1 系统实现定时任务的配置 [root@oldboyedu ~] # cd /etc/cron. cron.d/ cron.daily/ ...

  6. Python 如何定义只读属性?【新手必学】

    前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:Daniel2333如果还没学到属性问题,看不懂不怪你,可以先去小编的P ...

  7. QEMU让你无需开发板即可玩溜RT-Thread~

    1.1 本文的目的和背景 嵌入式软件开发离不开开发板,在没有物理开发板的情况下,可以使用QEMU等类似的虚拟机来模拟开发板.QEMU是一个支持跨平台虚拟化的虚拟机,它可以虚拟很多开发板.为了方便大家在 ...

  8. LNMP-Nginx配置SSL

    SLL工作流程: 浏览器发送一个https的请求给服务器: 服务器要有一套数字证书,可以自己制作(后面的操作就是阿铭自己制作的证书),也可以向组织申请,区别就是自己颁发的证书需要客户端验证通过,才可以 ...

  9. 还不懂MySQL索引?这1次彻底搞懂B+树和B-树

    前言 看了很多关于索引的博客,讲的大同小异.但是始终没有让我明白关于索引的一些概念,如B-Tree索引,Hash索引,唯一索引….或许有很多人和我一样,没搞清楚概念就开始研究B-Tree,B+Tree ...

  10. js打乱数组排序

    用到的知识点:Math.random()//用于打乱数组索引 random() 方法可返回介于 0(包含) ~ 1(不包含) 之间的一个随机数. var arr=[1,2,3,4,5,6]; for( ...