前言
在技术飞速发展的今天,企业和消费者对于服务性能的要求越来越高,促使企业把单一的服务向分布式服务迁移,也就是我们所说的微服务。
微服务带来高性能的同时也带来很多困难和挑战,比如如何解决服务之间的通信问题。在这样的背景下,消息队列的概念和实践应运而生,消息队列不仅使组件之间的通信变得更加简单,还为异步处理、负载平衡和系统解耦提供了工具。
一、消息队列的介绍
消息队列,简单理解的话就是给消息用的队列,是一种中间件技术,用于处理分布式系统中的组件之间的通信。
服务A 要和服务B 通信,那么A 只需要把消息发送到队列里面,然后继续自己的事情,服务B 收到消息后会根据消息的内容执行相应的操作。
当然,消息队列的功能远不止这些,消息队列异步消息的特性决定了它能做很多的事情,比如在高并发场景中,先由消息队列抗下高并发请求,然后再以系统能够承受的速度把请求分发给系统进行处理。
再有就是消息队列可以实现模块之间解耦,软件开发常说的一句话就是:没有什么事情是加一层不能解决的。如果有,那就再加一层。这虽然是一句调侃,但确实是软件开发中常用的手段,对于系统之间耦合的问题,我们通过消息队列这个中间件来实现生产与消费的解耦,使系统更易于拓展。
要想学习消息队列,我们先学习一种广为流行的消息队列协议:AMQP
二、AMQP协议介绍
AMQP(Advance Message Queue Protocol)协议是一个应用层的,用于消息队列的开放标准协议。接下来我们首先了解AMQP 协议的基础概念
1. 基础概念
- 代理(Broker):代理是AMQP服务端的实例,一个正在运行的程序
- 消息(Message):在AMQP 中,一个消息由属性(路由键)和负载(消息主体)组成。
- 生产者(Producer):在AMQP中,生产者是发送消息的应用
- 消费者(Consumer):在AMPQ中,消费者是接收消息的应用
- 交换机(Exchange):生产者发送的消息会经过交换机,由交换机来决定发往哪个地方
- 队列(Queue):消息的存储结构,消费者可以从队列里面接收消息并处理
- 绑定(Binding):定义了如何才从交换机路由消息到队列的规则
我们来整理一下这些概念:代理是一个AMQP协议服务端,代理的组件包括交换机、队列和绑定。消息队列是消息的存储结构,消息由生产者发送到代理,代理的交换机把消息路由到对应的消费者。
下图是对于这些组件关系的简单描绘:
2.交换机的类型
-
直接交换机(Direct):这种交换机会尝试通过消息的路由键去匹配那些绑定到交换机的队列。用于处理一对一的路由关系
-
主题交换机(Topic):它是基于模式匹配的消息路由策略,根据消息的路由键和绑定键的模式来路由消息。绑定键可以包含两种特殊字符
*
:匹配一个词#
:匹配零个或多个词
用于多播,既一个消息可以发送给多个匹配的队列。
PS:这里的词是指由(.
)分割的任意字符串 -
扇形交换机(Fanout):这中间换机会将消息广播到所有绑定的队列,不考虑路由键
-
头部交换机(Headers):这种交换机不是基于路由键,而是基于消息的头部属性来进行匹配
3. 消息确认机制
AMQP通过了消息确认机制,保证了消息的可靠性与持久性。例如银行的金融业务场景,是不能容忍消息丢失的。
- 发布确认:当消息正确地被路由到一个或多个队列(或被正确丢弃)时,生产者能够获得确认
- 消费确认:当消费者正确接收并处理了一条消息之后, 会向代理发送确认
4.持久性
- 队列持久化:声明队列的时候,可以设置其为持久化队列,在代理重启后,队列的定义以及元数据依然存在。但是队列的持久化定义并不意味着队列中的消息也是持久化的。
- 消息持久化:当生产者发送消息的时候可以指定消息持久化,即使代理重启,消息也还存在
- 交换机持久化:交换机和队列一样,可以被声明为持久化的,意味着在代理重启后,交换机依然存在
- WAL(Write-Ahead-Log):虽然WAL机制并不是AMQP协议的内容,但是WAL是常见的数据库和消息代理用于保证数据完整性的技术。消息会先预写入日志,然后再写入磁盘,就算数据在写入磁盘之前崩溃,数据依然可以从故障中恢复。
总结
听懂掌声,本篇文章主要讲了AMQP协议的一些核心概念,学习并了解这些概念能帮助我们更好地学习基于此协议的消息中间件(RabbitMQ),同时对于其他协议的消息中间件(RocketMQ)也能触类旁通。下篇文章我们会分享一个关于RabbitMQ的操作案例,喜欢别忘了关注我哦!