当前位置: 首页 > article >正文

系统架构设计(四):架构风格总结

黑板

概念

黑板体系架构是一种用于求解复杂问题的软件架构风格,尤其适合知识密集型、推理驱动、数据不确定性大的场景。

它模拟了人类专家协同解决问题的方式,通过一个共享的“黑板”协同多个模块(专家)逐步构建解决方案。

组成结构

黑板架构通常包含三个主要部分:

  1. 黑板(Blackboard)
    • 一个全局共享的内存数据结构,存放系统当前的状态、假设、中间结果等。
    • 所有模块都可以读取和写入,但通常通过控制组件协调。
  2. 知识源/专家模块(Knowledge Sources,KS)
    • 一组独立的、专注于特定任务的功能模块。
    • 被动响应型:监听黑板变化,当发现适合自身处理的状态时激活,执行操作并更新黑板。
  3. 控制组件(Control Component)
    • 负责管理各个知识源的执行顺序,选择最合适的模块在当前状态下执行。
    • 可实现调度策略,如优先级驱动、数据依赖驱动等。

工作机制(流程)

  1. 初始化黑板,写入初始数据;
  2. 控制组件调度合适的知识源;
  3. 被调度的知识源处理黑板中的数据并写回结果;
  4. 黑板变化后再次触发新的知识源;
  5. 如此循环,直到满足终止条件或达到目标状态。

优缺点

优点

  • 模块高度解耦,方便扩展与维护
  • 易于处理复杂、开放性问题
  • 支持多专家协作解决方案,适合并行处理
  • 灵活应对动态变化的问题环境

缺点

  • 控制策略复杂,实现难度高
  • 系统调试和性能优化不易
  • 不适用于结构简单或问题流程确定性强的系统

典型应用场景

  • 语音识别系统
  • 图像处理与目标识别
  • 智能决策支持系统
  • 自动推理系统(如专家系统)

管道-过滤器

概念

元素描述
过滤器(Filter)自包含的处理单元,接收输入、处理后输出结果,不依赖上下文。
管道(Pipe)连接过滤器的数据传输通道,负责传递数据流。

架构特点

优点:

  • 高内聚低耦合:每个过滤器职责单一,易于重用和维护。
  • 易扩展:可通过添加或替换过滤器轻松扩展功能。
  • 支持并行处理:过滤器可以并行运行,提升系统性能。
  • 可复用性强:过滤器模块可以在不同系统中重复使用。

缺点:

  • 数据格式统一要求高:管道中传递的数据格式必须兼容。
  • 处理时延可能大:数据需依次通过多个过滤器,可能带来延迟。
  • 状态管理困难:不适合需要复杂状态共享的处理逻辑。

应用场景

  • 编译器(词法分析 → 语法分析 → 语义分析 → 代码生成)
  • 图像处理(读入 → 灰度化 → 边缘检测 → 渲染)
  • 多媒体流处理(如 FFmpeg)
  • 日志处理与数据清洗
  • 数据管道(ETL:Extract → Transform → Load)

示意图

数据源 → [过滤器1][过滤器2][过滤器3] → 输出↓           ↓           ↓Pipe1       Pipe2       Pipe3

设计要点

  • 过滤器接口标准化:统一输入/输出格式,定义处理协议。
  • 解耦设计:过滤器不应感知管道或其他过滤器的存在。
  • 错误处理:提供统一的异常传递或中断机制。
  • 可组合性:过滤器应支持任意组合使用。

客户端-服务器

概念

客户端-服务器架构 是一种分布式应用模型,系统被划分为两部分:

  • 客户端(Client):发起请求,处理用户交互。
  • 服务器(Server):接收请求,提供服务与资源。

客户端与服务器通过网络通信,通常使用 HTTP、TCP/IP 等协议。

结构图

[客户端1]       [客户端2]       [客户端N]|               |               |+---------------+---------------+↓[服务器 / 服务端]

特点

特点描述
分离关注点客户端负责表示和交互,服务器负责数据和逻辑处理。
集中管理服务器统一管理资源、用户、权限等,便于维护。
可扩展性客户端可随时接入多个,服务器可扩容或负载均衡。
可维护性强服务器逻辑更新无需更改客户端。

优缺点

优点

  • 结构清晰、职责分离。
  • 资源集中,便于管理和备份。
  • 支持多客户端接入。
  • 安全性好,权限统一控制。

缺点

  • 单点瓶颈:服务器若出故障,所有客户端都受影响。
  • 维护成本高:服务器需高可用、并发处理能力强。
  • 网络依赖:客户端对网络连接有一定要求。

应用场景

  • Web 应用(浏览器 ⇄ Web 服务器)
  • 移动 App(App ⇄ 后端 API)
  • 网络游戏(玩家 ⇄ 游戏服务器)
  • 数据库系统(客户端 ⇄ 数据库服务器)
  • 邮件系统、FTP 等

设计要点

  • 接口设计:统一请求格式(如 REST、gRPC)。
  • 权限认证:如 OAuth、Token、Session。
  • 并发处理:服务器需支持高并发访问(线程池、协程等)。
  • 负载均衡与扩展性:使用反向代理、集群。
  • 故障恢复:部署容错机制与备份服务器。

发布-订阅

概念

发布-订阅架构Pub/Sub)是一种消息驱动的通信模式,通信双方通过事件(消息)中介进行交互:

  • 发布者(Publisher):产生消息,不直接指定接收者。
  • 订阅者(Subscriber):注册感兴趣的消息类型。
  • 消息代理(Broker):中间件,负责路由消息给所有符合条件的订阅者。

结构图

[Publisher1]        [Publisher2]|                    |+--------+-----------+↓[消息代理 / Broker]↓+--------+--------+|                 |
[Subscriber1]     [Subscriber2]

特点

特点描述
解耦合发布者和订阅者互不感知,只依赖消息代理。
异步通信发布后立即返回,不等待响应。
多对多通信一条消息可被多个订阅者接收。
事件驱动系统围绕事件(消息)流动进行运作。

优缺点

优点

  • 高解耦:系统模块间零耦合,便于扩展和替换。
  • 可扩展性强:容易水平扩展发布者/订阅者。
  • 灵活性高:支持动态订阅、动态扩展功能。

缺点

  • 调试困难:消息异步、分布式,难定位问题。
  • 消息可靠性需保障:需要处理丢失、重复、顺序等问题。
  • 依赖中间件:系统强依赖消息代理的稳定性和吞吐能力。

应用场景

  • 日志收集系统(如 ELK、Fluentd)
  • 事件驱动系统(如用户注册事件 → 发邮件、统计日志)
  • 微服务通信(如 Kafka、RabbitMQ、Redis Pub/Sub)
  • IoT 设备数据推送
  • 聊天系统 / 通知系统

关键设计要点

  • 主题(Topic)/频道(Channel)机制:消息分类基础。
  • 消息传递语义
    • 至少一次(At least once)
    • 至多一次(At most once)
    • 精确一次(Exactly once)
  • 持久化与重放:是否保存历史消息、支持离线订阅者。
  • 顺序保证:是否要求消息有序。
  • 容错与高可用性:中间件的高可用部署(集群、主从、分片)。

常见实现

中间件特点
Kafka高吞吐、可持久化、支持消息重放和分区顺序
RabbitMQ高灵活性、路由机制丰富、支持事务
Redis Pub/Sub轻量级,适用于内网通知,不支持持久化
MQTT面向 IoT,轻量协议,支持断线续传
NATS高性能、云原生友好

总结

架构风格特点适用场景
黑板架构多模块协作、共享数据驱动、控制策略灵活不确定性问题求解
管道-过滤器数据流动线性,模块串联数据处理流水线
客户端-服务器明确的请求/响应模式网络服务、Web系统
发布-订阅解耦事件通知机制实时系统、消息中间件

相关文章:

系统架构设计(四):架构风格总结

黑板 概念 黑板体系架构是一种用于求解复杂问题的软件架构风格,尤其适合知识密集型、推理驱动、数据不确定性大的场景。 它模拟了人类专家协同解决问题的方式,通过一个共享的“黑板”协同多个模块(专家)逐步构建解决方案。 组…...

『 测试 』测试基础

文章目录 1. 调试与测试的区别2. 开发过程中的需求3. 开发模型3.1 软件的生命周期3.2 瀑布模型3.2.1 瀑布模型的特点/缺点 3.3 螺旋模型3.3.1 螺旋模型的特点/缺点 3.4 增量模型与迭代模型3.5 敏捷模型3.5.1 Scrum模型3.5.2 敏捷模型中的测试 4 测试模型4.1 V模型4.2 W模型(双V…...

robomaster机甲大师--电调电机

文章目录 C620电调ID设置速率 电调发送报文电调接收报文cubemx程序初始化发送接收 C620电调 ID设置 速率 1Mbps 电调发送报文 发送的数据为控制电机的输出电流,需要将can数据帧的ID设置为0x200 电调接收报文 机械角度:电机的0到360度映射到0到几千转…...

汽车诊断简介

历史 20世纪80年代,由于美国西海岸严重的雾霾问题,CARB(加州空气资源委员会)通过了一项法律,要求对机动车辆进行车载监测诊断。这推动了OBD-I的引入,并在1990年代被OBD II取代。与此同时,欧洲也…...

少儿编程机构用的教务系统

在编程教育行业快速发展的今天,培训机构面临着学员管理复杂、课程体系专业性强、教学效果难以量化等独特挑战。爱耕云教务系统针对编程培训机构的特殊需求,提供了一套全方位的数字化解决方案,帮助机构实现高效运营和教学质量提升。 为什么编…...

优化理赔数据同步机制:从4小时延迟降至15分钟

优化理赔数据同步机制:从4小时延迟降至15分钟 1. 分析当前同步瓶颈 首先诊断当前同步延迟原因: -- 检查主从复制状态(在主库执行) SHOW MASTER STATUS; SHOW SLAVE HOSTS;-- 在从库执行检查复制延迟 SHOW SLAVE STATUS\G -- 关…...

面试中常问的设计模式及其简洁定义

🎯 一、面试中常问的设计模式及其简洁定义 模式名常被问到解释(简洁)单例模式✅ 高频保证一个类只有一个实例,并提供全局访问点。工厂模式✅ 高频创建对象的接口由子类决定,屏蔽了对象创建逻辑。抽象工厂模式✅提供多…...

基于VSCode+PlatformIO环境的ESP8266的HX1838红外模块

以下是针对ESP8266开发板的红外遥控解码系统开发教程,基于VSCodePlatformIO环境编写 一、概述 本实验通过ESP8266开发板实现: 红外遥控信号解码自定义按键功能映射串口监控输出基础设备控制(LED) 硬件组成: NodeMC…...

Linux中的防火墙

什么是防火墙 windows防火墙的设置 linux防火墙设置命令 什么是防火墙? 防火墙是一种网络安全设备,它能够: 监控和过滤进出网络的流量 阻止不安全的连接 保护计算机和网络免受未授权访问 创建一个安全边界 简单来说,防火…...

补补表面粗糙度的相关知识(一)

表面粗糙度,或简称粗糙度,是指表面不光滑的特性。这个在机械加工行业内可以说是绝绝的必备知识之一,但往往也是最容易被忽略的,因为往往天天接触的反而不怎么关心,或者没有真正的去认真学习掌握。对于像我一样&#xf…...

力扣刷题Day 46:搜索二维矩阵 II(240)

1.题目描述 2.思路 方法1:分别找到搜索矩阵的右、下边界,然后从[0][0]位置开始遍历这部分矩阵搜索目标值。 方法2:学习Krahets佬的思路,从搜索矩阵的左下角开始遍历,matrix[i][j] > target时消去第i行&#xff0c…...

Kubernetes 集群部署应用

部署 Nginx 应用 命令行的方式 1. 创建 deployment 控制器的 pod # --imagenginx:这个会从 docker.io 中拉取,这个网站拉不下来 # kubectl create deployment mynginx --imagenginx# 使用国内镜像源拉取 kubectl create deployment mynginx --imaged…...

Spark 处理过程转换:算子与行动算子详解

在大数据处理领域,Apache Spark 凭借其强大的分布式计算能力脱颖而出,成为处理海量数据的利器。而 Spark 的核心处理过程,主要通过转换算子和行动算子来实现。本文将深入探讨 Spark 中的转换算子和行动算子,帮助读者更好地理解和应…...

Unity3D仿星露谷物语开发42之粒子系统

1、目标 使用例子系统,实现割草后草掉落的特效。 通过PoolManager获取特效预制体,通过VFXManager来触发特效。 2、配置例子特效 在Hierarchy -> PersistentScene下创建新物体命名为Reaping。 给该物体添加Particle System组件。 配置例子系统参数…...

python 上海新闻爬虫, 东方网 + 澎湃新闻

1. 起因, 目的: 继续做新闻爬虫。我之前写过。此文先记录2个新闻来源。后面打算进行过滤,比如只选出某一个类型新闻。 2. 先看效果 过滤出某种类型的新闻,然后生成 html 页面,而且,自动打开这个页面。 比如科技犯罪…...

[Java实战]Spring Boot 整合 Freemarker (十一)

[Java实战]Spring Boot 整合 Freemarker (十一) 引言 Apache FreeMarker 作为一款高性能的模板引擎,凭借其简洁语法、卓越性能和灵活扩展性,在 Java Web 开发中占据重要地位。结合 Spring Boot 的自动化配置能力,开发者能快速构建动态页面、…...

LeetCode 高频题实战:如何优雅地序列化和反序列化字符串数组?

文章目录 摘要描述题解答案题解代码分析编码方法解码方法 示例测试及结果时间复杂度空间复杂度总结 摘要 在分布式系统中,数据的序列化与反序列化是常见的需求,尤其是在网络传输、数据存储等场景中。LeetCode 第 271 题“字符串的编码与解码”要求我们设…...

为什么拆分高低字节而不直接存入数组

您的代码片段是在将一个16位值()拆分为高字节和低字节:IR_RF_Signal.length temp_low IR_RF_Signal.length & 0xFF; temp_high IR_RF_Signal.length >> 8; 虽然我在 PX4-Autopilot 仓库中没有找到这段确切的代码,…...

python打卡day22@浙大疏锦行

复习日 仔细回顾一下之前21天的内容,没跟上进度的同学补一下进度。 作业: 自行学习参考如何使用kaggle平台,写下使用注意点,并对下述比赛提交代码 一、数据预处理 import pandas as pd import numpy as np import matplo…...

C#游戏开发中的注意事项

目录 一、性能优化:提升游戏运行效率 1. 避免不必要的循环和迭代 2. 减少字符串拼接 3. 利用Unity的生命周期函数 4. 使用对象池(Object Pooling) 二、内存管理:避免内存泄漏和资源浪费 1. 及时释放非托管资源 2. 避免空引用异常 3. 合理使用引用类型和值类型 4. …...

Spring Boot项目(Vue3+ElementPlus+Axios+MyBatisPlus+Spring Boot前后端分离)

下载地址: 前端:https://download.csdn.net/download/2401_83418369/90811402 后端:https://download.csdn.net/download/2401_83418369/90811405 一、前端vue部分的搭建 这里直接看另一期刊的搭建Vue前端工程部分 前端vue后端ssm项目_v…...

Spyglass:在batch/shell模式下运行目标的顶层是什么?

相关阅读 Spyglasshttps://blog.csdn.net/weixin_45791458/category_12828934.html?spm1001.2014.3001.5482 除了可以在图形用户界面(GUI)中运行目标外,使用Batch模式或Shell模式也可以运行目标,如下面的命令所示。 % spyglass -project test.prj -ba…...

没有Mac,我是怎么上传IPA到App Store的?

没有Mac,我是怎么上传IPA到App Store的? 最近赶一个小项目上线,写的是一个Flutter做的App。安卓版本一晚上搞定,iOS上架却差点把人整崩。 不是我技术菜,是实在太麻烦了。最关键的,是我这台Windows笔电根本…...

微服务架构中如何保证服务间通讯的安全

在微服务架构中,保证服务间通信的安全至关重要。服务间的通信通常是通过HTTP、gRPC、消息队列等方式实现的,而这些通信链路可能面临多种安全风险。为了应对这些风险,可以采取多种措施来保证通信安全。 常见的服务间通信风险 1.数据泄露:在服务间通信过程中,敏感数据可能会…...

2025-05-11 项目绩效域记忆逻辑管理

好的,我们可以用一个故事来帮助记忆这些规划绩效域的要素,同时通过逻辑关系来串联它们。以下是一个故事化的版本: 《项目管理的奇幻之旅》 在一个遥远的王国里,有一个勇敢的项目经理名叫小K。小K被国王赋予了一个艰巨的任务&…...

工具篇-Cherry Studio之MCP使用

一、添加MCP 打开Cherry Studio,如果没有可以到官网下载:Cherry Studio 官方网站 - 全能的AI助手 按上面步骤打开同步服务器 1、先去注册ModelScope,申请令牌 2、再打开MCP广场,找到高德MCP 选择工具测试,这里有个高德的api key需要申请 打开如下地址高德开放平…...

DeepSeek“智”造:解锁旅游行业新玩法

目录 一、DeepSeek 简介1.1 DeepSeek 技术原理1.2 DeepSeek 在 AI 领域地位 二、DeepSeek 在旅游攻略生成的应用2.1 生成流程展示2.2 优势分析2.3 实际案例剖析 三、DeepSeek 助力旅游宣传文案创作3.1 文案创作模式3.2 效果评估3.3 创意亮点挖掘 四、DeepSeek 优化游客咨询服务…...

LOJ 6346 线段树:关于时间 Solution

Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1​,a2​,⋯,an​),另有一个存储三元组的列表 L L L. 有 m m m 个操作分两种: add ⁡ ( l , r , k ) \operatorname{add}(l,r,k) add(l,r,k):将 ( l , r , …...

java 多核,多线程,分布式 并发编程的现状 :从本身的jdk ,到 spring ,到其它第三方。

Java 在多核、多线程和高性能编程领域提供了丰富的现成框架和工具,既有标准库中的并发组件,也有第三方框架。以下是一些关键框架及其应用场景的总结:便于后面我们站在巨人的肩膀上,继续前行 一、Java 标准库中的多线程框架 Execut…...

httpclient请求出现403

问题 httpclient请求对方服务器报403,用postman是可以的 解决方案: request.setHeader( “User-Agent” ,“Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0” ); // 设置请求头 原因: 因为没有设置为浏览器形式&#…...