中间件与消息队列基础丨学习记录

279 阅读10分钟

零、前言

本文记录了笔者在学习中间件和消息队列的基础知识的过程,

在RabbitMQ-上,也就是本文中,我们先介绍中间件以及消息队列的定义与基本知识,

在RabbitMQ-下中会再介绍其安装与使用入门,走错的朋友们可以移步下面的链接↓

暂时还没有链接!

若笔者有任何疏忽纰漏之处,烦请不吝赐教。

本文会不断的补充、修改和完善,期待您的宝贵意见。

什么是中间件?为什么要使用它?

中间件 Middleware 是处于操作系统和应用程序之间的软件

人们在使用中间件时,往往是一组中间件集成在一起,构成一个平台(包括开发平台和运行平台),

但在这组中间件中必须要有一个通信中间件,即中间件 = 平台 + 通信

这个定义也限定了只有用于分布式系统中才能称为中间件,同时还可以把它与支撑软件和实用软件区分开来。

中间件屏蔽了底层操作系统的复杂性,使程序开发人员面对一个简单而统一的开发环境,减少程序设计的复杂性,将注意力集中在自己的业务上,不必再为程序在不同系统软件上的移植而重复工作,从而大大减少了技术上的负担。

中间件带给应用系统的,不只是开发的简便、开发周期的缩短,也减少了系统的维护、运行和管理的工作量,还减少了计算机总体费用的投入。

中间件应该具有以下的特点

  • 满足大量应用的需要
  • 运行于多种硬件和OS平台
  • 支持分布计算,提供跨网络、硬件和OS平台的透明性的应用或服务的交互
  • 支持标准的协议
  • 支持标准的接口

另外,中间件的技术一般现在一些互联网公司或者项目中使用比较多,如果仅仅还只是一个初创公司建议还是使用单体架构,最多加个缓存中间件即可,不要盲目追求新或者所谓的高性能,而追求的背后一定是业务的驱动和项目的驱动

知识图谱

avatar

学习目标与技巧

我们需要理解和掌握

  • 什么是消息中间件
  • 什么是协议
  • 什么是持久化
  • 消息分发
  • 消息的高可用
  • 消息的集群
  • 消息的容错
  • 消息的冗余

一些可供参考的方法

  • 理解中间件在项目架构中的作用,以及各中间件的底层实现;
  • 可以使用一些类比的生活概念去理解中间件;
  • 使用一些流程图或者脑图的方式去梳理各个中间件在架构中的作用;
  • 思考中间件在项目中设计的和使用的原因;
  • 学会查看中间件的源码以及开开源项目和博客。

一、分布式架构与消息中间件

0. 分布式架构

通俗解释分布式系统:一个请求由服务器端的多个服务协同处理完成

avatar

存在问题 1:学习成本高,技术栈过多; 2:运维成本和服务器成本增高; 3:人员的成本也会增高; 4:项目的负载度也会上升; 5:面临的错误和容错性也会成倍增加; 6:占用的服务器端口和通讯的选择的成本高; 7:安全性的考虑和因素逼迫可能选择RMI/MQ相关的服务器端通讯。

好处 1:服务系统的独立,占用的服务器资源减少和占用的硬件成本减少; 确切的说是:可以合理的分配服务资源,不造成服务器资源的浪费; 2:系统的独立维护和部署,耦合度降低,可插拔性; 3:系统的架构和技术栈的选择可以变的灵活; 4:弹性的部署,不会造成平台因部署造成的瘫痪和停服的状态。


1. 消息中间件

消息中间件的主要作用

  • 利用可靠的消息传递机制进行系统和系统直接的通讯
  • 通过提供消息传递和消息的排队机制,它可以在分布式系统环境下扩展进程间的通讯

消息中间件的应用场景:

  • 跨系统数据传递;
  • 高并发的流量削峰;
  • 数据的分发和异步处理;
  • 大数据分析与传递;
  • 分布式事务;

很常见的一个例子就是电商的并发订单。

消息中间件的本质及设计:

它是一种接受数据,接受请求、存储数据、发送数据等功能的技术服务。

avatar

消息中间件的核心组成部分:

  • 消息的协议
  • 消息的持久化机制
  • 消息的分发策略
  • 消息的高可用,高可靠
  • 消息的容错机制

二、消息与消息队列

0. 网络协议简介

avatar

协议:

  1. 计算机底层操作系统和应用程序通讯时共同遵守的一组约定,只有遵循共同的约定和规范,系统和底层操作系统之间才能相互交流。
  2. 和一般的网络应用程序的不同它主要负责数据的接受和传递,所以性能比较的高。
  3. 协议对数据格式和计算机之间交换数据都必须严格遵守规范。

协议的三要素

  1. 语法:语法是用户数据与控制信息的结构与格式,以及数据出现的顺序。
  2. 语义:语义是解释控制信息每个部分的意义。它规定了需要发出何种控制信息,以及完成的动作与做出什么样的响应。
  3. 时序:时序是对事件发生顺序的详细说明。

以HTTP请求协议举例:

语法:http规定了请求报文和响应报文的格式。 语义:客户端主动发起请求称之为请求。 时序:一个请求对应一个响应,注意是先有请求再有响应。

Q:为什么消息中间件不直接使用HTTP协议呢?

A:首先因为http请求报文头和响应报文头是比较复杂的,包含了cookie,数据的加密解密,状态码,响应码等附加的功能,但是对于一个消息而言,我们并不需要这么复杂,也没有这个必要性,它其实就是负责数据传递,存储,分发就行,一定要追求的是高性能。尽量简洁,快速。其次大部分情况下http大部分都是短链接,在实际的交互过程中,一个请求到响应很有可能会中断,中断以后就不会就行持久化,就会造成请求的丢失。这样就不利于消息中间件的业务场景,因为消息中间件可能是一个长期的获取消息的过程,出现问题和故障要对数据或消息就行持久化等,目的是为了保证消息和数据的高可靠和稳健的运行。


AMQP协议

Advanced Message Queuing Protocol 高级消息队列协议

它是一种面向消息中间件的开放标准,支持应用程序之间安全可靠的通信。

它提供了一个灵活和可扩展的消息体系结构,具有事务、路由和消息持久性等特性。

特点:

  • 分布式事务支持。
  • 消息的持久化支持。
  • 高性能和高可靠的消息处理优势。

MQTT协议

Message Queueing Telemetry Transport

它是一种轻量级的发布-订阅消息传递协议,专为资源受限的设备和低带宽的网络设计。

它被广泛应用于物联网(Internet of Things)和M2M (Machine-to-Machine)通信,为设备之间的数据传输和接收提供了一种简单高效的机制。

特点:

  • 轻量
  • 结构简单
  • 传输快,不支持事务
  • 没有持久化设计。

应用场景:

  • 适用于计算能力有限
  • 低带宽
  • 网络不稳定的场景。

OpenMessage协议

它是阿里巴巴集团为其中间件产品RocketMQ开发的专有消息协议。

它提供高性能和可靠的消息传递,具有消息排序、容错和发布-订阅消息等特性。

特点:

  • 结构简单
  • 解析速度快
  • 支持事务和持久化设计。

Kafka协议

Kafka协议是基于TCP/IP的二进制协议。

其消息内部是通过长度来分割,由一些基本数据类型组成。

特点:

  • 结构简单
  • 解析速度快
  • 无事务支持
  • 有持久化设计

1. MQ持久化

持久化就是将数据存入磁盘,而不是存在内存中随服务器重启断开而消失,使数据能够永久保存。

avatar


2. 消息的分发策略

由于MQ有生产者、存储信息和消费者这三个角色,

那么当生产者生成消息之后,MQ进行存储,消费者通过pushpull来进行获取消息。

MQ就是一种推送的过程。

具体来说:

消息分发策略是指用于确定哪些消费者从消息传递系统哪里接收什么特定消息的技术

以下是常见的消息分发策略。

  • Fan-Out:这种策略包括同时向所有订阅者或消费者发送消息。
  • Fan-In:这种策略涉及一次将消息发送给一个consumer,通常采用轮询方式。
  • 负载平衡:此策略涉及基于消费者的处理能力和当前工作负载等因素以平衡的方式将消息分发给消费者。
  • 分片Sharding:这种策略涉及将消息分成更小的块,称为分片(shard),并将它们分发给不同的消费者进行并行处理。
  • 过滤Filtering:此策略涉及根据预定义的过滤器(如消息内容或消费者类型)将消息发送给消费者的子集。
  • 路由Routing:此策略涉及根据其路由键(由消息发布者确定)将消息发送给特定的消费者。

3. MQ高可用和高可靠

高可用?

指产品在规定的条件和规定的时间内处于可执行规定功能状态的能力

高可用有以下几种集群模式,都是为了保证消息服务器不会寄,就算寄了依然可以很快的修复或者维持基本功能。

  • Master-slave主从共享数据的部署方式
  • Master- slave主从同步部署方式
  • 多主集群同步部署模式
  • 多主集群转发部署模式
  • Master-slave与Breoker-cluster组合的方案

高可靠?

指系统可以无故障地持续运行,若一个系统突然崩溃、报错、异常,能不影响线上业务的正常运行,且出错的几率极低。

若想达到高可靠性,需要考虑以下两点:

  • 消息的传输:通过协议来保证系统间数据解析的正确性。
  • 消息的存储可靠:通过持久化来保证消息的可靠性。

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 2 天,点击查看活动详情