消息队列 rabbitmq

消息队列作为分布式系统的重要组件,主要解决应用解耦、异步处理和流量控制等问题,提供高性能、高可用和可伸缩的架构。RabbitMQ、Kafka和RocketMQ是常见选择,各有适用场景。RabbitMQ适合快速上手,RocketMQ适用于高吞吐量和稳定性要求,而Kafka擅长处理海量数据。消息队列引入后会增加系统复杂性和可能的数据一致性问题,需谨慎管理。
摘要由CSDN通过智能技术生成
消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构。目前使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ

我们可以把消息队列比作是一个存放消息的容器,当我们需要使用消息的时候可以取出消息供自己使用。消息队列是分布式系统中重要的组件,使用消息队列主要是为了通过异步处理提高系统性能和削峰、降低系统耦合性。

消息队列的好处

  1. 通过异步处理提高系统性能

  1. 降低系统耦合性。

  1. 保证数据不丢失

消息队列的缺点

  • 系统可用性降低: 系统可用性在某种程度上降低,为什么这样说呢?在加入MQ之前,你不用考虑消息丢失或者说MQ挂掉等等的情况,但是,引入MQ之后你就需要去考虑了!

  • 系统复杂性提高: 加入MQ之后,你需要保证消息没有被重复消费、处理消息丢失的情况、保证消息传递的顺序性等等问题!

  • 一致性问题: 我上面讲了消息队列可以实现异步,消息队列带来的异步确实可以提高系统响应速度。但是,万一消息的真正消费者并没有正确消费消息怎么办?这样就会导致数据不一致的情况了

消息队列应用场景

数据冗余:比如订单系统,后续需要严格的进行数据转换和记录,消息队列可以把这些数据持久化的存储在队列中,然后有订单,后续处理程序进行获取,后续处理完之后在把这条记录进行删除来保证每一条记录都能够处理完成。

系统解耦:使用消息系统之后,入队系统和出队系统是分开的,也就说只要一天崩溃了,不会影响另外一台系统正常运转。

流量削峰:例如秒杀和抢购,我们可以配合缓存来使用消息队列,能够有效的顶住瞬间访问量,防止服务器承受不住导致崩溃。

异步通信:消息本身使用入队之后可以直接返回。

扩展性:例如订单队列,不仅可以处理订单,还可以给其他业务使用。

排序保证:有些场景需要按照产品的顺序进行处理比如单进单出从而保证数据按照一定的顺序处理,使用消息队列是可以的。

以上都是消息队列常见的使用场景,当然消息队列只是一个中间件,可以配合其他产品进行使用。

消息通讯:消息通讯是指,消息队列一般都内置了高效的通信机制,因此也可以用作消息通讯。比如实现点对点消息队列,或者聊天室等。

消息队列选择:

  • 如果消息队列不是将要构建系统的重点,对消息队列功能和性能没有很高的要求,只需要一个快速上手易于维护的消息队列,建议使用 RabbitMQ。

  • 如果系统使用消息队列主要场景是处理在线业务,比如在交易系统中用消息队列传递订单,需要低延迟和高稳定性,建议使用 RocketMQ。

  • 如果需要处理海量的消息,像收集日志、监控信息或是埋点这类数据,或是你的应用场景大量使用了大数据、流计算相关的开源产品,那 Kafka 是最适合的消息队列。

rabbitmq

RocketMQ是阿里开源的消息中间件,它是纯Java开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点。RocketMQ思路起源于Kafka,但并不是Kafka的一个Copy,它对消息的可靠传输及事务性做了优化,目前在阿里集团被广泛应用于交易、充值、流计算、消息推送、日志流式处理、binglog分发等场景。

主要特性:

  1. 可靠性: 提供了多种技术可以让你在性能和可靠性之间进行权衡。这些技术包括持久性机制、投递确认、发布者证实和高可用性机制;

  1. 灵活的路由: 消息在到达队列前是通过交换机进行路由的。RabbitMQ为典型的路由逻辑提供了多种内置交换机类型。如果你有更复杂的路由需求,可以将这些交换机组合起来使用,你甚至可以实现自己的交换机类型,并且当做RabbitMQ的插件来使用;

  1. 消息集群:在相同局域网中的多个RabbitMQ服务器可以聚合在一起,作为一个独立的逻辑代理来使用;

  1. 队列高可用:队列可以在集群中的机器上进行镜像,以确保在硬件问题下还保证消息安全;

  1. 多种协议的支持:支持多种消息队列协议;

  1. 多语言支持:服务器端用Erlang语言编写,支持只要是你能想到的所有编程语言;

  1. 管理界面: RabbitMQ有一个易用的用户界面,使得用户可以监控和管理消息Broker的许多方面;

  1. 跟踪机制:如果消息异常,RabbitMQ提供消息跟踪机制,使用者可以找出发生了什么;

  1. 插件机制:提供了许多插件,来从多方面进行扩展,也可以编写自己的插件;

四大核心概念

生产者:

产生数据发送消息的程序是生产者

交换机

交换机是 RabbitMQ 非常重要的一个部件,一方面它接收来自生产者的消息,另一方面它将消息推送到队列中。交换机必须确切知道如何处理它接收到的消息,是将这些消息推送到特定队列还是推送到多个队列,亦或者是把消息丢弃,这个得有交换机类型决定

队列

队列是 RabbitMQ 内部使用的一种数据结构,尽管消息流经 RabbitMQ 和应用程序,但它们只能存储在队列中。队列仅受主机的内存和磁盘限制的约束,本质上是一个大的消息缓冲区。许多生产者可以将消息发送到一个队列,许多消费者可以尝试从一个队列接收数据。这就是我们使用队列的方式

消费者

消费与接收具有相似的含义。消费者大多时候是一个等待接收消息的程序。请注意生产者,消费者和消息中间件很多时候并不在同一机器上。同一个应用程序既可以是生产者又是可以是消费者。

  • Server:接收客户端的连接,实现AMQP实体服务。

  • Connection:连接,应用程序与Server的网络连接,TCP连接。

  • Channel:信道,消息读写等操作在信道中进行。客户端可以建立多个信道,每个信道代表一个会话任务。

  • Message:消息,应用程序和服务器之间传送的数据,消息可以非常简单,也可以很复杂。有Properties和Body组成。Properties为外包装,可以对消息进行修饰,比如消息的优先级、延迟等高级特性;Body就是消息体内容。

  • Virtual Host:虚拟主机,用于逻辑隔离。一个虚拟主机里面可以有若干个Exchange和Queue,同一个虚拟主机里面不能有相同名称的Exchange或Queue。

  • Exchange:交换器,接收消息,按照路由规则将消息路由到一个或者多个队列。如果路由不到,或者返回给生产者,或者直接丢弃。RabbitMQ常用的交换器常用类型有direct、topic、fanout、headers四种,后面详细介绍。

  • Binding:绑定,交换器和消息队列之间的虚拟连接,绑定中可以包含一个或者多个RoutingKey。

  • RoutingKey:路由键,生产者将消息发送给交换器的时候,会发送一个RoutingKey,用来指定路由规则,这样交换器就知道把消息发送到哪个队列。路由键通常为一个“.”分割的字符串,例如“com.rabbitmq”。

  • Queue:消息队列,用来保存消息,供消费者消费。

rabbitmq 模式

  • Hello Wold 简单模式

  • Work queues工作 队列模式

  • Publish/Subscribe发布订阅模式

  • Routing 路由模式

  • Topics 主题模式

  • Publisher Confirms 发布确认模式

界面

Virtual host: 所属的虚拟主机。

Name: 名称。

User name: 使用的用户名。

State: 当前的状态,running:运行中;idle:空闲。

SSL/TLS: 是否使用ssl进行连接。

Protocol: 使用的协议。

Channels: 创建的channel的总数。

From client: 每秒发出的数据包。

channel: 名称。

Virtual host: 所属的虚拟主机。

User name: 使用的用户名。

Mode: 渠道保证模式。 可以是以下之一,或者不是:C: confirm。T:transactional(事务)。

State : 当前的状态,running:运行中;idle:空闲。

Unconfirmed: 待confirm的消息总数。

Prefetch: 设置的prefetch的个数。

Unacker: 待ack的消息总数。

publish: producter pub消息的速率。

confirm: producter confirm消息的速率。

deliver/get: consumer 获取消息的速率。

ack: consumer ack消息的速率。

features的几个参数

D: 是 durable 的缩写,代表这个队列中的消息支持持久化

I: 是 internal 的缩写,表示这个exchange不可以被client用来推送消息,仅用来进行exchange之间的绑定。

Args: 是 arguments 的缩写。代表该队列配置了 arguments 参数。

TTL: 是 x-message-ttl 的缩写。设置队列中的所有消息的生存周期(统一为整个队列的所有消息设置生命周期), 也可以在发布消息的时候单独为某个消息指定剩余生存时间,单位毫秒。

DLX: 说明该队列配置了 x-dead-letter-exchange。当队列消息长度大于最大长度、或者过期的等,将从队列中删除的消息推送到指定的交换机中去而不是丢弃掉。

DLK: x-dead-letter-routing-key 的缩写,将删除的消息推送到指定交换机的指定路由键的队列中去。

队列的属性

Virtual host: 所属的虚拟主机。

Name: 名称。

Features: 功能。(参数参考上述交换机页面)

State: 当前的状态,running:运行中;idle:空闲。

Ready: 待消费的消息总数。

Unacked: 待应答的消息总数。

Total: 总数 Ready+Unacked。

incoming: 消息进入的速率。

deliver/get: 消息获取的速率。

ack: 消息应答的速率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值