字节跳动3-3大牛力荐!RabbitMQ实战指南:消息队列面试必刷手册
RabbitMQ是目前非常热门的一款消息中间件,不管是互联网大厂还是中小企业都在大量使用。作为一名合格的开发者,有必要对RabbitMQ有所了解。
以熟悉的电商场景为例,如果商品服务和订单服务是两个不同的微服务,在下单的过程中订单服务需要调用商品服务进行扣库存操作。按照传统的方式,下单过程要等到调用完毕之后才能返回下单成功,如果网络产生波动等原因使得商品服务扣库存延迟或者失败,会带来较差的用户体验,如果在高并发的场景下,这样的处理显然是不合适的,那怎么进行优化呢?这就需要消息队列登场了。
消息队列提供一个异步通信机制,消息的发送者不必一直等待到消息被成功处理才返回,而是立即返回。消息中间件负责处理网络通信,如果网络连接不可用,消息被暂存于队列当中,当网络畅通的时候在将消息转发给相应的应用程序或者服务,当然前提是这些服务订阅了该队列。如果在商品服务和订单服务之间使用消息中间件,既可以提高并发量,又降低服务之间的耦合度。
RabbitMQ就是这样一款我们苦苦追寻的消息队列。RabbitMQ是一个开源的消息代理的队列服务器,用来通过普通协议在完全不同的应用之间共享数据。
RabbitMQ是使用Erlang语言来编写的,并且RabbitMQ是基于AMQP协议的。Erlang语言在数据交互方面性能优秀,有着和原生Socket一样的延迟,这也是RabbitMQ高性能的原因所在。可谓“人如其名”,RabbitMQ像兔子一样迅速。
因篇幅限制,我会尽可能多地给大家展示文章内容,完整内容已备好,感兴趣想要获取的朋友,点赞转发,戳戳领!
第1章RabitMQ简介
本章首先针对消息中间件做了一个重要性的介绍,包括什么是消息中间件、消息中间件的作用及消息中间件的特点等。之后引入RabitMQ, 对其历史做-一个简单的阐述,比如RabbitMQ具备哪些特点。本章后面的篇幅介绍了RabbiMQ的安装及简单使用,通过演示生产者生产消息,以及消费者消费消息来给读者一个对于RabbitMQ的最初的印象,为后面的探索过程打下基础。
第2章RabbitMQ入门
本章主要讲述的是RabitMQ 的入门知识,首先介绍了生产者(Producer)、消费者(Consumer)、队列(Queue)、 交换器(Exchange)、 路由键(RoutingKey). 绑定( Binding)、连接(Connection)和信道(Channel)等基本术语,还介绍了交换器的类型: fanout. direct, topic和headers.之后通过介绍RabbiMQ的运转流程来加深对基本术语的理解。RabbitMQ可以看作AMQP协议的具体实现,2.2 节还大致介绍了AMQP命令以及与RabbitMQ客户端中方法如何- --对应, 包括对各个整个生产消费消息的AMQP命令的流程介绍。最后展示了AMQP 0-9-1中常用的命令与RabbitMQ客户端中方法的映射关系。
第3章客户端开发向导
本章主要介绍RabbitMQ客户端开发的简单使用,按照一个生命周期的维度对连接、创建、生产、消费和关闭等几个方面进行笼统的介绍,读者学习完本章的内容之后,就能够有效地进行与RabbitMQ相关的开发工作。知是行之始,行是知之成,不如现在动手编写几个程序来实践一下吧。
第4章RabbitMQ进阶
提升数据可靠性有以下一些途径:设置mandatory参数或者备份交换器(immediate参数已被淘汰):设置publisher confrm机制或者事务机制:设置交换器、队列和消息都为持久化;设置消费端对应的autoAck参数为false 并在消费完消息之后再进行消息确认。本章不仅介绍了数据可靠性的一些细节, 还展示了RabbitMQ 的几种已具备或者衍生的高级特性,包括TIL、死信队列、延迟队列、优先级队列、RPC功能等,这些功能在实际使用中可以让相应应用的实现变得事半功倍。
第5章RabbitMQ管理
本章的内容主要围绕RabbitMQ的管理这个主题展开,包括多租户、权限、用户、应用和集群管理、服务端状态等方面,这些都可以通过rabbitmgct1 这一系列的工具来管控。.rabbitmgetl也是RabbitMQ 中最复杂的CLI管理工具,本章也基本涵盖了大部分的rabbi tmgct1工具的使用细节。在使用相关命令时,完全可以把本章的内容作为- -个使用手册来查阅。本章还有-一个重点就是rabbi tmq_ management 插件,它在提供用户图形化的管理理解功能之余,还提供了相应的监控功能。不仅如此,rabbi tmq_ management插件还提供了HTTP API接口以方便用户调用,比如在后面7.4节和7.5节中所讲到的一些功能都需要相关的HTTP API接口的协助。.
第6章RabbitMQ配置
RabbitMQ在配置这方面可谓相当完善,在很多情况下都可以使用默认的配置而不需要改变其中任何一个就可以让RabbitMQ很好地提供服务。不过也有- -些特殊的情况,比如默认的5672端口被其他的应用程序所占用,那么就需要修改环境变量RABBITMQ_ NODE_ PORT或者改配置文件中的tcp_ listeners. 如果需要尽可能地发挥RabiMQ本身的性能,那么对于配置参数的调优就显得至关重要了,比如禁用Nagle算法或者增大TCP缓冲区的大小可以提高吞吐量,更多的细节等待着读者慢慢地发掘。
第7章RabbitMQ运维
RabbitMQ作为一个成熟的消息中间件,不仅要为应用提供强大的功能支持,也要能够维护自身状态的稳定,而这个维护就需要强大的运维层面的支撑。运维本身就是-一个大学间,涵盖多方面的内容,比如容量评估、资源分配、集群管控、系统调优、升级扩容、故障修复、控告警、负载均衡等。本章从最基本的集群搭建开始到故障修复,从集群迁移再到集群监控井不要求能解决所有RabbitMQ 的运维问题,希望能够在多个层面为读者提供解决问题的方法和方法思路。
第8章跨越集群的界限
RabbitMQ可以通过3种方式实现分布式部署:集群、Federation 和Shovel.这3种方式不是互斥的,可以根据需要选择其中的一种或者以几种方式的组合来达到分布式部署的目的。Federation和Shovel可以为RabitMQ的分布式部署提供更高的灵活性,但同时也提高了部署的复杂性。
本章主要阐述Federation与Shovel 的相关的原理、用途及使用方式等。最后在小结部分中将集群与Federation/Shovel的部署方式进行对比区分,以加深对相关知识点的理解。
第9章RabbitMQ高阶
本章首先讲述了RabitMQ 的存储机制,进而对队列的结构展开讨论,队列中的消息有alpha、beta. gamma. delta 这4种状态,内部存储又可以分为Q1、Q2. Delta、 Q3. Q4这5个子队列。消息会在这5个子队列中流转,因为性能的提升需要尽可能地避免消息过量堆积。如果消息是持久化的,建立搭配惰性队列使用,这样在提升性能的同时还可以降低内存的损耗。内存、磁盘和流控都是用来限制消息流入得过快以避免相应的服务进程来不及处理而崩溃。镜像队列的引入可以极大地提升RabbitMQ的可用性及可靠性,提供了数据冗余备份、避免单点故障的功能,强烈建议在实际应用中为每个重要的队列都配置镜像。
第10章网络分区
网络分区是在使用RabiMQ时所不得不面对的一个问题,网络分区的发生可能会引起消息丢失或者服务不可用等。可以简单地通过重启的方式或者配置自动化处理的方式来处理这个问题,但深究其里会发现网络分区不是想象中的那么简单。本章通过网络分区的意义、影响、处理及案例分析等多个维度来一一剖析其中的奥秘。
第11章RabbitMQ扩展
有关RabbitMQ的概念介绍、结构模型、客户端应用等可以看作基础篇,有关RabitMQ的管理、配置、运维等可以看作中级篇,而RabbitMQ的原理及网络分区的介绍可以看作高级篇,所陈述的都是RabbitMQ在运行时使用到的一些本体知识。而本章内容作为一个拾遭扩展,主要介绍RabbiMQ的消息追踪和服务端入站连接的负裁均衡。