什么是RabbitMQ?
RabbitMQ是一个消息代理 - 一个消息系统的媒介。
RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。
它可以为你的应用提供一个通用的消息发送和接收平台,并且保证消息在传输过程中的安全。
为什么要选择RabbitMQ,不选其他MQ?
kafka是以吞吐量高而闻名,不过其数据稳定性一般,而且无法保证消息有序性。如果公司的项目中使用了MQ作为日志收集,建议选择使用RabbitMQ。
阿里巴巴的RocketMQ基于Kafka的原理,弥补了Kafka的缺点,继承了其高吞吐的优势,其客户端目前以Java为主。但是从开源产品的稳定性而言,还是选择RabbitMQ比较好一些。
RabbitMQ基于面向并发的语言Erlang开发,虽然吞吐量不如Kafka,但是体量不大的项目够用了。而且消息可靠性较好,并且消息延迟极低,集群搭建比较方便。支持多种协议,并且有各种语言的客户端,比较灵活。Spring对RabbitMQ的支持也比较好,使用起来比较方便,开发周期快速。
RabbitMQ社区比较完善,有些疑难问题可以在社区里面找到解决问题的方案,节省时间。
使用MQ可以解决那些问题?
RabitMQ有很多特点:
可靠性: RabbitMQ提供了多种技术可以让你在性能和可靠性之间进行权衡。这些技术包括持久性机制、投递确认、发布者证实和高可用性机制。
灵活的路由: 消息在到达队列前是通过交换机进行路由的。RabbitMQ为典型的路由逻辑提供了多种内置交换机类型。如果你有更复杂的路由需求,可以将这些交换机组合起来使用,你甚至可以实现自己的交换机类型,并且当做RabbitMQ的插件来使用。
集群: 在相同局域网中的多个RabbitMQ服务器可以聚合在一起,作为一个独立的逻辑代理来使用。
联合:对于服务器来说,它比集群需要更多的松散和非可靠链接。为此RabbitMQ提供了联合模型。
高可用的队列:在同一个集群里,队列可以被镜像到多个机器中,以确保当其中某些硬件出现故障后,你的消息仍然安全。
多协议:RabbitMQ 支持多种消息协议的消息传递。
广泛的客户端:只要是你能想到的编程语言几乎都有与其相适配的RabbitMQ客户端。
可视化管理工具:RabbitMQ附带了一个易于使用的可视化管理工具,它可以帮助你监控消息代理的每一个环节。
追踪:如果你的消息系统有异常行为,RabbitMQ还提供了追踪的支持,让你能够发现问题所在。
插件系统:RabbitMQ附带了各种各样的插件来对自己进行扩展。你甚至也可以写自己的插件来使用。
最重要的还有以下几点:
解耦合:将几个业务关联的微服务调用修改为基于MQ的异步通知,可以解除微服务之间的业务耦合。同时还提高了业务性能。
流量削峰:将突发的业务请求放入MQ中,作为缓冲区。后端的业务根据自己的处理能力从MQ中获取消息,逐个处理任务。流量曲线变的平滑很多
延迟队列:基于RabbitMQ的死信队列或者DelayExchange插件,可以实现消息发送后,延迟接收的效果。