分布式系统消息通信技术:MOM与RPC

一、中间件

什么是中间件

  • 中间件(Middleware)是处于操作系统和应用程序之间的软件,也有人认为它应该属于操作系统中的一部分。人们在使用中间件时,往往是一组中间件集成在一起,构成一个平台(包括开发平台和运行平台),但在这组中间件中必须要有一个通信中间件,即中间件+平台+通信,这个定义也限定了只有用于分布式系统中才能称为中间件,同时还可以把它与支撑软件和使用软件区分开来。

二、消息中间件(MOM)

  • 消息中间件(MOM),用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信

什么是MQ?

  • MQ(message queue),从字面意思上看,本质是个队列,FIFO先入先出,只不过队列中存放的内容是message而已,还是一种跨进程的通信机制,用于上下游传递消息。在互联网架构中,MQ是一种非常常见的上下游“逻辑解耦+物理解耦”的消息通信服务。使用了MQ之后,消息发送上游只需要依赖MQ,不用依赖其他服务。
  • MQ负责两个系统之间传递消息,这两个系统可以是异构的,处于不同硬件、不同操作系统、用不同语言编写,只需要简单配置、以及简单的调用几个MQ的API,就可以互相通讯,你不必考虑底层系统和网络的复杂性,MQ能够应付多种异常情况,例如网络阻塞、临时中断等等;
  • 消息队列主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构。使用较多的消息队列有ActiveMQ,RocketMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ等,部分 数据库 如 Redis、MySQL 以及 phxsql 也可实现消息队列的功能。

消息中间件的应用场景:

  • 系统解耦
    • 交互系统之间没有直接的调用关系,只是通过消息传输,故系统侵入性不强,耦合度低。
    • 将消息写入消息队列,需要消息的系统自己从消息队列中订阅,从而系统A不需要做任何修改。
  • 跨系统数据传递
  • 高并发的流量削峰
    • 并发量大的时候,所有的请求直接怼到数据库,造成数据库连接异常。系统A慢慢的按照数据库能处理的并发量,从消息队列中慢慢拉取消息。在生产中,这个短暂的高峰期积压是允许的,假如消息队列的长度超过最大数量,则直接抛弃用户请求或跳转到错误页面
  • 数据的分发和异步处理(就是并发处理)
    • 将消息写入消息队列,非必要的业务逻辑以异步的方式运行,加快响应速度。
  • 日志
    • 解决大量日志传输的问题。日志采集:负责日志数据采集,定时写受写入Kafka队列;Kafka消息队列:负责日志数据的接收,存储和转发;日志处理应用:订阅并消费kafka队列中的日志数据 。
      在这里插入图片描述
  • 消息通讯
    • 消息队列一般都内置了高效的通信机制,因此也可以用在纯的消息通讯。比如实现点对点消息队列,或者聊天室(发布订阅通讯)等,
    • 点对点通讯
    • 发布/订阅通讯
      在这里插入图片描述

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

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

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

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

消息中间件订阅模式

1. 点对点模式

在这里插入图片描述
特点:消息被消费以后,Queue中不再有存储,所以消息消费者不可能消费到已经被消费的消息。Queue支持存在多个消费者,但是对一个消息而言,只会有一个消费者可以消费Queue实现了负载均衡,当没有消费者可用时,这个消息会被保存直到有一个可用的消费者

2. 发布/订阅模式(也称广播模式)

在这里插入图片描述
特点:消息被一个订阅者消费后,并没有消失,而是储存在Topic中,供所有的订阅者消费。

两者区别:这两种模式主要区别或解决的问题就是发送到队列的消息能否重复消费

3. 推拉模型(根据消费者获取消息的方式区分)

对于消费者而言有两种方式从消息中间件获取消息,即push和pull:

①Push方式:由消息中间件主动地将消息推送给消费者,这种方式可以尽快的将消息发给消费者。
②Pull方式:由消费者主动向消息中间件拉取消息,这种方式相比push方式会稍微增加消息的到达消费者的时间。

消息队列协议

  • 消息中间件负责数据的传递,存储,和分发消费三个部分,数据的存储和分发的过程中肯定要遵循某种约定成俗的规范,你是采用底层的TCP/IP,UDP协议还是其他的自己取构建等,而这些约定成俗的规范就称之为:协议。

网络协议的三要素

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

比如MQ发送一个信息,是以什么数据格式发送到队列中,然后每个部分的含义是什么,发送完毕以后的执行的动作,以及消费者消费消息的动作,消费完毕的响应结果和反馈是什么,然后按照对应的执行顺序进行处理。如果你还是不理解;大家每天都在接触的http请求协议:

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

而消息中间件采用的并不是http协议,而常见的消息中间件协议有:OpenWire、AMQP、MQTT、Kafka,OpenMessage协议。各协议特点

为什么消息中间件不直接使用 http协议?

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

消息队列持久化

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

常见消息队列对持久化的支持
在这里插入图片描述

消息的分发策略

MQ消息队列有如下几个角色:

  • 生产者
  • 存储消息
  • 消费者

消息的重试机制策略

消息中间件就必须支持消息重试机制策略。也就是支持:出现问题和故障的情况下,消息不丢失还可以进行重发。常见消息队列的消息分发策略的机制和对比:
在这里插入图片描述

什么是高可靠?

所谓高可靠是指:是指系统可以无故障地持续运行,比如一个系统突然崩溃,报错,异常等等并不影响线上业务的正常运行,出错的几率极低,就称之为:高可靠。

在高并发的业务场景中,如果不能保证系统的高可靠,那造成的隐患和损失是非常严重的。如何保证中间件消息的可靠性呢?可以从两个方面考虑:

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

三、RPC(Remote Procedure Call Protocol).

RPC与MOM对比

跨语言跨平台,面向过程

RPC与MOM对比

RPC系统结构:
 
+----------+     +----------+
| Consumer | <=> | Provider |
+----------+     +----------+
Consumer调用的Provider提供的服务。
 
 
Message Queue系统结构:
 
+--------+     +-------+     +----------+
| Sender | <=> | Queue | <=> | Receiver |
+--------+     +-------+     +----------+
Sender发送消息给Queue;Receiver从Queue拿到消息来处理。

Message Queue是异步单向的消息,发送消息设计成是不需要等待消息处理的完成。而RPC是同步调用,对于要等待返回结果/处理结果的场景,RPC非常适合(RPC也可以是异步调用),由于等待结果,Consumer(Client)会有线程消耗。

RPC的组成与调用过程

对RPC的简单理解

【RPC】RPC基本介绍


参考博文:

消息中间件(MQ)的相关知识
RPC和MQ对比及其适用/不适用场合

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/32645.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

剑指 Offer 55 - I. 二叉树的深度 / LeetCode 104. 二叉树的最大深度(二叉树后序遍历,回溯传递值)

题目&#xff1a; 链接&#xff1a;剑指 Offer 55 - I. 二叉树的深度&#xff1b;LeetCode 104. 二叉树的最大深度 难度&#xff1a;简单 输入一棵二叉树的根节点&#xff0c;求该树的深度。从根节点到叶节点依次经过的节点&#xff08;含根、叶节点&#xff09;形成树的一条…

【框架源码】Spring源码解析之BeanDefinition加载流程解析

观看本文之前&#xff0c;我们先思考一个问题&#xff0c;Spring是如何描述Bean对象的&#xff1f; Spring是根据BeanDefinition来创建Bean对象&#xff0c;BeanDefinition就是Spring中表示Bean定义。BeanDefinition用来存储Bean的相关信息&#xff0c;主要包括&#xff1a;Be…

智能文档图像处理技术应用与实践

写在前面智能文档处理面临的技术难题智能文档处理的研究领域● 文档图像分析与预处理● 手写板反光擦除● 版面分析与文档还原 写在最后 写在前面 VALSE 2023 无锡视觉与学习青年学者研讨会近期在无锡国际博览中心举办&#xff0c;由江南大学和无锡新吴区联合承办。本次会议旨…

企业级ChatGPT开发的三大核心内幕及案例实战(三)

企业级ChatGPT开发的三大核心内幕及案例实战(三) 2.3 Notion 问答对话AI案例演示及源码分析 Gavin老师:NLP_Matrix_Space 如图2-2所示,我们先看一下Notion 问答对话AI案例的效果。你问一个问题,它会进行回答,然后它会告诉你,信息来源在什么地方,要看具体的信息,可以…

生产者与消费者问题

本篇文章我们使用C探讨一下生产者与消费者问题. 1. 多线程的引入 我们学习了操作系统, 知道了进程和线程的概念, 但是如果不进行代码实战的话, 会很难理解它们. 特别是编程的初学者(比如我), 在了解了进程和线程后通常会感到疑惑: 多线程怎么用? 为啥我平时写代码没有使用到…

TCP协议的相关特性

目录 TCP特点概要 TCP协议段格式 TCP原理 确认应答 超时重传 连接管理(三次握手,四次挥手) 三次握手 四次挥手 流水线传输 滑动窗口 滑动窗口ACK丢失 滑动窗口数据报丢失 流量控制 拥塞控制 延迟应答 停止等待协议 回退N帧协议 面向字节流 缓冲区 粘包问题 TCP异常 &…

Nginx Rewrite的应用

目录 一、Nginx Rewrite 二、Rewrite的功能 1.Rewrite 跳转场景 2.Rewrite 跳转实现 3.Rewrite 实际场景 4.Rewrite 正则表达式 5.Rewrite 命令/语法格式 6.location 分类 7.location 优先级 8.Rewrite和location比较 9.根据以上了解&#xff0c;小案例来操…

python实现Canny算子边缘检测算法

边缘检测是一种将图片中关键信息表现出来的一种图片技术&#xff0c;它的结果并不是字面意思上的获取图片边缘&#xff0c;而是将图片有用的信息勾勒出来&#xff0c;类似素描的结果&#xff0c;但是已经去掉了很多信息。如下所示&#xff0c;一张原始的图片是这样的&#xff1…

自学黑客/网络安全工具软件大全100套

黑客工具软件大全100套 1 Nessus&#xff1a;最好的UNIX漏洞扫描工具 Nessus 是最好的免费网络漏洞扫描器&#xff0c;它可以运行于几乎所有的UNIX平台之上。它不止永久升级&#xff0c;还免费提供多达11000种插件&#xff08;但需要注册并接受EULA-acceptance–终端用户授权…

Redis7【④ Redis 发布 订阅】

Redis发布和订阅 本章了解即可&#xff0c;命令可以不用敲。 Redis 发布和订阅&#xff08;Publish/Subscribe&#xff0c;简称 Pub/Sub&#xff09;是一种消息传递模式&#xff0c;用于在 Redis 中实现消息的发布和订阅。 在 Redis 中&#xff0c;发布者&#xff08;Publi…

高通9x07平台关于模块modem射频 RF MCFG生成MBN的总结

1.1: cefs&#xff08;efs2.mbn)制作步骤&#xff1a;1.擦擦CEFS分区&#xff1b;2.导入HW_MBN,并激活&#xff1b;3.导入静态NV&#xff1b;4.生成CEFS; 1.2&#xff1a;激活hw_default mbn后&#xff0c;/policyman/目录下device_config.xml必需保留&#xff1b; 1.3&#xf…

Vision Transformer

论文名称&#xff1a; An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale 一、Patch Embedding模块 class PatchEmbed(nn.Module): # 对应Patch Embedding模块def __init__(self, img_size224, patch_size16, in_c3, embed_dim768, norm_layerNone…

实现一个转盘随机选择器

实现效果 完整代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document</title><…

Midjourney如何用参考图/垫图来绘画图

大家都知道AI绘画工具每次生成的效果都是随机的&#xff0c;但是现在很多AI绘图工具都提供了利用参考图/垫图的方式出图&#xff0c;这样就可以让让AI画作生成自己想要的布局、场景、色彩等等。 国内的AI绘图工具一般都好操作&#xff0c;国外主流的Midjourney也可以添加参考图…

DataV图表-排名轮播表自定义

DataV图表-排名轮播表自定义数据大屏可视化 场景&#xff1a;需要计算根据分数不同柱子的颜色不同 低于60分变成为橙色柱子 一开始使用的是 dv-scroll-ranking-board 这个不可以自定义颜色和属性 我们可以更改 dv-scroll-board 样式来实现 排名轮播表 安装 data-view npm ins…

2023年最新互联网Java面试八股文出炉(附大厂P5-P8技术栈)

为什么感觉 Java 面试变难了&#xff1f; 几年前&#xff0c;你只需要简单的ssm框架&#xff0c;就能轻松找到一份Java的工作&#xff0c;但现在不一样了&#xff0c;随着涌入这个行业的人越来越多&#xff0c;同一个岗位需要筛选掉更多人&#xff0c;要求自然水涨船高&#x…

短视频------Adobe Photoshop 笔记总结

一、Adobe Photoshop 使用方式方法 ctrlc/v 复制 粘贴 ctrlx 剪切 ctrla 全选 ctrlz撤销 ctrls保存 ENTER 回车 换行 CTRL 调取定界框 CAPSLOCK 大写锁定 Esc 退出 Delete 删除 Backspace 退格 Ctrl shi alt 三个控制键 Shi 连选 ctrl 加选/减选 锁屏 WinL 打开运行命令窗口 …

WLAN的Roaming机制和案例log解析

一 、WLAN漫游简介 [百度百科]:当网络环境存在多个相同SSID的AP,且它们的微单元互相有一定范围的重合时,无线用户可以在整个WLAN覆盖区内移动,无线网卡能够自动发现附近信号强度最大的AP,并通过这个AP收发数据,保持不间断的网络连接,这就称为无线漫游。 简单来说:WLA…

【SpringCloud config分布式配置中心】—— 每天一点小知识

&#x1f4a7; S p r i n g C l o u d c o n f i g 分布式配置中心 \color{#FF1493}{SpringCloud config分布式配置中心} SpringCloudconfig分布式配置中心&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞见云的…

【Spring Cloud系列】-Eureka服务端高可用详解

【Spring Cloud系列】-Eureka服务端高可用详解 文章目录 【Spring Cloud系列】-Eureka服务端高可用详解一. 序言二. 什么是高可用性三. 什么是CAP一致性&#xff08;Consistency&#xff09;可用性&#xff08;Availability&#xff09;分区容错&#xff08;Partition-toleranc…