搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
Gausst松鼠会
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
yosemite php gd,OS X Yosemite 10.10. 自带PHP环境gd库扩展缺少freetype 解决办法
2
github ssh密钥配置
3
shell sed命令实现自动化批量修改文本文件中首个匹配到的关键字
4
Flask、Django和Tornado怎么选
5
OpenCV+Cuda+Cmake+VStudio配置踩坑记录_cmake --help-policy cmp0148
6
java安全——jsp一句话木马_cmd写jsp一句话
7
Mac系统下不能直接往移动硬盘里面拷贝东西,用Mounty之后硬盘打不开,怎么办?_mounty倒入硬盘没显示
8
9道软件测试面试题,刷掉90%的软件测试员_设计测试用例,这是一个n选一宝箱,玩家不会直接获得奖励
9
RK3588平台开发系列讲解(工具篇)ADB的使用_rk3588 adb
10
kettle error–只有一个输入记录期待设置变量并且至少已经收到2个变量_只有一个输入记录期待设置变量并且至少已经收到2个变量.
当前位置:
article
> 正文
基于消息的分布式架构设计_基于消息架构
作者:Gausst松鼠会 | 2024-04-14 22:55:20
赞
踩
基于消息架构
背景:
随着社会的发展,经济的飞跃,传统的单系统模式(webApp+DB)已经很难满足业务场景的需要。企业系统开始不断演化成多个子系统并存协作的局面。大大降低了系统间的耦合性,更重要的便于子系统的扩展、升级、维护等。
谈到系统间的协作,目前常用两种方式:
1、基于Http协议
通过客户端发起的get、post请求,服务端接收request请求,处理请求,得到响应内容,通过网络传送到客户端,由浏览器解析出一个可视化的页面。
这种交互最大的优势是实时性,通过HTTP请求连接各个子系统,从而跨服务器来完成一个完整的业务流程。缺点协议请求头的信息较少,一般都是关键参数,完整数据由下一个子系统从数据库、文件系统来获取,从来保证前后的业务数据衔接。
2、基于消息的模式。
这种模式一个很重要前提是对实时性要求不高。优点可以有效降低模块的耦合性,减轻主干业务流程,将大量的业务交由后台任务来处理,有效缩短系统响应时间,提高系统TPS。
比如用户下单成功后发送邮件功能,属于非主干功能,完全可以从下单的主干业务逻辑剥离出来,从来提高下单的响应速度。而发送邮件的功能则由邮件服务器接收异步消息来跟踪处理,带有点分布式集群的感觉,
将一个任务有效拆分到多台服务器来完成。
所谓消息本质上是一种数据结构(当然,对象也可以看做是一种特殊的消息),它包含生产者与消费者双方都能识别的数据,这些数据需要在不同的服务器之间进行传递,并可能会被多个完全不同的客户端消费。
消息队列降低了生产者和消费者之间的耦合性,他们不会存在直接的代码依赖,方便各自的扩展,比如生产者因为业务下线,导致代码下线,而消费端不用同时跟进处理,只是队列不会有消息,这样方便于更加灵活的协调开发资源,而不必一方下线,所有的依赖全部受影响,产生较高维护成本。另外我们也可以随意对生产者和消费者扩展,引入多个消息队列,他们之间的依赖可以配置在XML文件中,通过JNDI来获取消息队列Queue,每次加载时,通过lookup服务首先通过读取配置文件来获取通道。
常见的消息模型分为:点对点模型;发布-订阅模型
点对点模型
:Point to Point,消息被生产者放到一个队列中,消费者从消息队列中取走消息。消息一旦被一个消费者取走后,消息就从队列中移除。这意味着即使有多个消费观察一个队列,但一个消息只能被一个消费者取走。
发布-订阅模型
:Publish/Subscribe,发布者发布一条消息可以发送给所有的订阅用户,所有的订阅用户都有处理某一条消息的机会。
对于订阅者而言,有两种处理消息的方式。一种是广播机制,这时消息通道中的消息在出列的同时,还需要复制消息对象,将消息传递给多个订阅者。例如,有多个子系统都需要获取从CRM系统传来的客户信息,并根据传递过来的客户信息,进行相应的处理。此时的消息通道又被称为Propagation通道。另一种方式则属于抢占机制,它遵循同步方式,在同一时间只能有一个订阅者能够处理该消息。实现Publisher-Subscriber模式的消息通道会选择当前空闲的唯一订阅者,并将消息出列,并传递给订阅者的消息处理方法。
目前使用较多的是广播机制的消息处理方式,且将topic与queue有效组合
一个生产消息的事件对应一个topic,topic下面可以挂多个queue,当然一个queue也可以挂在多个topic下面,每个queue都对应一个消息的消费端,唯一消费,保证消费的准确性。
如下图所示,当下单时,会将下单的相关信息封装到消息体中,发送到下单事件关联的那个topic1中,然后Topic会将消息复制发送到挂载在其下面的所有队列上,将Message复制到快照队列、成交记录统计队列中,消息端会监听队列,
如果有消息 ,则启动任务线程,来进行相关的业务处理。
在引入消息队列时重点要注意以下几点:
并发:选择的消息队列一定要很好地支持用户访问的并发性;
安全:消息队列是否提供了足够的安全机制;
性能伸缩:不能让消息队列成为整个系统的单一性能瓶颈;
部署:尽可能让消息队列的部署更为容易;
灾备:不能因为意外的错误、故障或其他因素导致处理数据的丢失,最好可以写入磁盘,持久化存储;
API易用性:处理消息的API必须足够简单、并能够很好地支持测试与扩展
容量:队列的容量一定要大,至少可以存储千万级别的消息体
目前市场上有很多成熟的消息框架:如Active MQ,IBM 的MQ,JBoss MQ,MSMQ等,各有各的优势,在使用前一定要充分衡量是否可以满足自己的业务需求
下图是napoli的client类图:
未完待续
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/424502
推荐阅读
article
HackTheBox
-
CTF
2022
_
cve
-
2022
-22817...
Before五天的比赛,总共61道赛题,11道web题目,队友依旧给力,pwn,re,misc等都ak了,最后写出了59...
赞
踩
article
【数字IC/
FPGA
】
UART
的
Verilog
实现
_
uart
verilog
实现
...
UART
通用异步收发器(Universal Asynchronous Receiver/Transmitter,
UART
...
赞
踩
article
ChatGLM2
-6B从本地加载
模型
报错-
解决办法
...
ChatGLM2
-6b大
模型
本地部署报错解决方案OSError: /chatglm2-6b does not appea...
赞
踩
article
npm
run
build
打包报错 Error: Cannot
find
module
‘scrip...
这个报错通常是由于缺少相应的模块引起的。解决这个问题的方法通常是通过
npm
安装缺少的模块。模块并将其添加到你的项目的...
赞
踩
article
WXML
模板语法-
条件
与
列表
渲染
...
在小程序中,使用wx:if="{{condition}}"来判断是否需要
渲染
该代码也可以用wx:elif和wx:else...
赞
踩
article
【
C++
】
手
撕
Vector
类
...
【
C++
】
手
撕
Vector
类
1,vector
类
框架 2,vector () 3,pinrt() 4,vector(in...
赞
踩
article
基于
STM32
的
SYN6288
语音
播报
模块驱动实验(代码开源)_
xyn6288
能接
stm32
哪个引脚...
本文为手把手教学
SYN6288
语音
播报
模块的驱动实验,本教程的MCU采用
STM32
F103ZET6。(HAL库版本,代...
赞
踩
article
使用
Python
和可视化
编程
控制
树莓派
机械
臂
myCobot
_树莓派
控制
机械
臂
抓取...
这些模块包括逻辑、循环、数学、文本、列表、颜色、变量、函数以及
控制
机械
臂
的函数等等,所以用户可以轻松入门
编程
,只需单击右...
赞
踩
article
Windows
95/
98
虚拟机
OS安装说明书[仅限
VirtualBox
]_
system
is bu...
Tutorial:
Windows
95/
98
guest OSes
Windows
95/
98
虚拟机
OS安装说明书byTe...
赞
踩
article
SQL
中用到
LIKE
模糊
检索
的几种优化
场景
...
SQL
开发中经常会碰到使用
LIKE
模糊
检索
的
场景
,'%'的位置,可能影响索引的正常使用,看到刘老师公众号的一篇文章,介绍...
赞
踩
article
深度优先遍历 洛谷
P1219
八皇后_
一
个
如下
的
6
×
6
的
跳棋
棋盘
,
有
六个
棋子
被
放置
在
棋盘
上
,
使得每行...
题目描述
一
个
如下
的
6
×
6
的
跳棋
棋盘
,
有
六个
棋子
被
放置
在
棋盘
上,使得每行、每列
有
且只
有
一
个
,每条对角线(包括两条主对角线
的
...
赞
踩
article
Kafka
客户端
性能参数
调优...
max.poll.records减少。
Kafka
客户端
性能参数
调优 ...
赞
踩
article
C++
数据结构
队列
的链式
存储
应用 医院
就诊
系统
_
就诊
队列
c++...
C++
数据结构
队列
的链式
存储
实现医院
就诊
系统
使用
队列
的链式
存储
结构实现医院
就诊
系统
,
队列
的特点先进先出医院
就诊
系统
一...
赞
踩
article
idea
集成
Gitee
详细步骤
_
idea
整合
gitee
...
如果出现以下问题,一直提示正在加载,在网络良好的前提下,加载十多分钟或者半个小时,就不用怀疑是否是网络的问题,只需要在g...
赞
踩
article
Git
命令
介绍 |
branch
分支 远程追踪 提交找回
tag
标签
config
_
git
rm ...
git
相关
命令
git
命令
可视化教学游戏创建仓库
命令
$
git
init # 初始化一个仓库$
git
clone 路径...
赞
踩
article
xilinx
原语
及
bank
简介_
fpga
bank
...
本文是后续
xilinx
相关
原语
的前篇,对7系列FPGA的
bank
做简要介绍,让读者知道zynq系列的PL哪些有HP ba...
赞
踩
article
第一行代码——利用Sqlite创建数据库用于用户登录出现no
such
table
:
USER
错误_...
在SQLiteOpenHelper类的继承如图图中DBHelper的构造函数内的参数使用以及super属于老式方法,获取...
赞
踩
article
计算机网络
笔记(一)及
wireshark
实验一_根据“
计算机网络
实验.
cap
”回答以下问题:
1
、
...
生成针对
目标
web服务器的HTTP请求报文。_根据“
计算机网络
实验.
cap
”回答以下问题:
1
、
第
1
个
分组
的源
物
理...
赞
踩
article
LangChain
的函数,工具和代理(四):使用
OpenAI
函数进行标记(
Tagging
) & ...
今天我们学习了通过
langchain
和openai的函数调用来实现标记(
Tagging
)和
提取
(
Extraction
)功...
赞
踩
article
炫酷三维
可视化
技术
原来这么简单
,
这套
解决
方案
顿时效果翻倍_3d
可视化
方案
...
而智慧医院是智慧城市的重要组成部分
,
今天给大家带来这套智慧医院
解决
方案
,
基于BIM+3D
可视化
技术
,
使用FVS大屏编辑模...
赞
踩
相关标签
web安全
安全
fpga开发
数字IC设计
笔记
自然语言处理
npm
html
webpack
vue.js
apache
c++
算法
开发语言
数据结构
排序算法
STM32
SYN6288
嵌入式
机器人
python
青少年编程
数据库
mysql