在什么场景下使用RabbitMQ?
开源消息队列中间件,它提供了可靠的消息传递机制,可以在分布式中进行异步通信。常见场景:
-
异步任务处理:处理耗时任务时,可使用MQ来实现异步任务处理。
常见场景举例:新用户注册后,需要发注册邮件和注册短信,传统的做法有两种 1.串行的方式 2.并行的方式
异步处理:在注册成功持久化后,即可返回给客户。可以提高性能,减少不必要的等待;
2 .解藕系统组件:
常见场景举例:双11,618 是购物狂节,用户下单后,订单系统需要通知库存系统,传统的做法就是订单系统调用库存系统的接口扣减库存,
通过消息,不强依赖于库存系统;订单下完单持久化之后就返回客户;提升效率;
3. 广播和订阅:实时通知,日志收集,广播事件等
常见场景举例:订单完成后,订单数据结果需要下发下各个系统:比如大数据系统;比如财务系统;比如履约系统等等,这时只需要通过广播事件,消费者系统进行订阅消费即可 实时获得。
任务队列:处理大量的任务时,可以使用mq来作为任务队列。生产者将任务放入消息中,消费者获取任务并进行处理。这样可以实现负载均衡和优先级控制。确保任务的执行处理。
高性能、可扩展、可靠的通信等特点;
4. 流量削峰:
常见场景举例: 秒杀活动,一般会因为流量过大,导致应用挂掉,为了解决这个问题,一般在应用前端加入消息队列。
1.用户的请求,服务器收到之后,首先写入消息队列,加入消息队列长度超过最大值,则直接抛弃用户请求或跳转到错误页面.(当然可以通过各种限流策略 达到目的)
2.秒杀业务根据消息队列中的请求信息,再做后续处理.
RabbitMQ与Kafka的区别:都用于分布式系统中的异步通信的消息中间件。
-
消息模型:
RabbitMQ使用AMQP作为消息传递协议,它支持队列模型。消息由生产者发送到队列中,然后由消费者从队列中获取并处理;
Kafka:使用发布/订阅模型,消息被发布到topic中,然后由订阅者消费。适用于流式处理、日志收集和实时数据管道等场景;
-
可伸缩性:
RabbitMQ基于Erlang虚拟机的可靠性消息传递机制,适合处理大量的短暂消息。支持多个队列和消费者,并可以通过集群来扩展吞吐量和可靠性
Kafka使用分布式日志存储和分区的方式来实现高吞吐量和可伸缩性。它可以将消息分布到多个分区中,支持水平扩展和并行处理。
-
持久性:
RabbitMQ默认将消息持久话到磁盘上,以确保消息不会丢失。还可支持消息确认机制,确保消息成功处理
Kafka将消息持久化到磁盘上,并使用复制机制来实现高可用性和数据冗余。它使用来批量写入和零拷贝技术,以提高磁盘写入性能。
-
数据保留:
RabbitMQ不会保留已经传递的消息,一旦消息被消费,就会从队列中删除
Kafka可以根据配置保留信息的时间和大小。它可以持久话大量的消息,并支持按照时间或偏移量进行消息检索
-
应用场景:
RabbitMQ适用于任务队列、事件驱动架构、解藕系统组件等场景,特别适合可靠性和灵活性的应用。
kafka适用于流式处理、日志收集、实时数据管道等场景,特别适合处理大规模的实时数据流。
RabbitMQ和Kafka不同,根据需求场景选择使用。维度:消息模型,吞吐量,可靠性和数据保留等方面
RabbitMQ 中的相关概念:
Broker:接收和分发消息的应用,RabbitMQ Server就是 Message Broker
Virtual host:出于多租户和安全因素设计的,把 AMQP 的基本组件划分到一个虚拟的分组中,类似于网络中的 namespace 概念。当多个不同的用户使用同一个 RabbitMQ server 提供的服务时,可以划分出多个vhost,每个用户在自己的 vhost 创建 exchange/queue 等
Connection:publisher/consumer 和 broker 之间的 TCP 连接
Channel:如果每一次访问 RabbitMQ 都建立一个 Connection,在消息量大的时候建立 TCP Connection的开销将是巨大的,效率也较低。Channel 是在 connection 内部建立的逻辑连接,如果应用程序支持多线程,通常每个thread创建单独的 channel 进行通讯,AMQP method 包含了channel id 帮助客户端和message broker 识别 channel,所以 channel 之间是完全隔离的。Channel 作为轻量级的 Connection 极大减少了操作系统建立 TCP connection 的开销 Exchange:message 到达 broker 的第一站,根据分发规则,匹配查询表中的 routing key,分发消息到queue 中去。常用的类型有:direct (point-to-point), topic (publish-subscribe) and fanout (multicast)
Queue:消息最终被送到这里等待 consumer 取走
Binding:exchange 和 queue 之间的虚拟连接,binding 中可以包含routing key。Binding 信息被保存到 exchange 中的查询表中,用于 message 的分发依据
网上截图:
RabbitMQ的安装
1. 安装依赖环境
在线安装依赖环境:yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c++ kernel-devel m4 ncurses-devel tk tc xz
2. 安装Erlang
上传:erlang-18.3-1.el7.centos.x86_64.rpm;socat-1.7.3.2-5.el7.lux.x86_64.rpm ;rabbitmq-server-3.6.5-1.noarch.rpm