小架构step系列01:小架构初衷

1 概述

小公司做业务服务,需要聚焦到实际的业务上,尽快通过业务服务客户,给客户创建价值,公司才能生存下去。在技术上采用的Web应用架构具备以下特点:
  • 主要由开源组件组装而成。这样既可以节省成本,也可以把时间聚焦到实际的业务当中,尽快实现业务。
  • 需要功能丰富,能够支持业务快速开发。数据量虽然不一定大,但业务可能很多,关系型存储、非结构化存储、文件存储、关键字搜索、任务调度、消息中间件等一个都不能少,每个都需要用。
  • 不需要支持大的“量”级。大多情况下不涉及大数据、高并发之类的,不能过度设计。
  • 成本要低。不能采用耗费资源过大的组件,客户服务器预算有限,大多只能提供一台或者一个双机的服务器。
这里把这种架构成为“小架构”,这个“小”主要是指小型,其内涵是很丰富的,其核心是要支持业务快速开发,功能丰富且好用。
为了支持业务快速开发,仅仅把一系列开源组件组合还不够,还需要:
  • 提供一个工程模版,把程序的启动、参数/返回值处理、异常处理等都规范好,可以直接开发业务。
  • 把开源组件的配置、启动等封装起来,给业务提供能够之间使用的服务。比如消息中间件,业务注入一个服务就可以发消息,不需要关心下面用的到底是Kafka还是RocketMQ,也不关心它们是如何配置的,如何启动的。
  • 提供一些通用的服务。有些是用开源软件不够易用的需要封装一下,有些没有开源软件提供能力的则自研一个。
  • 提供一套规范,大家在这规范下可以快速开发出一致的、易维护的代码,也能够减少一些踩坑的情况。
这系列“小架构”的文章就主要是讲解如何搭建这种“小架构”的,以及了解相关原理。

2 来由

2.1 一个机会

在一家公司里,受限于人力有限和维护成本,从零建设架构的机会一般是很有限的,不太会每个项目都重头搞个不同的架构,这对公司的发展和维护是非常困难的。这意味着在一家公司里,能够接触到架构变更的机会是非常有限的,可能待很长时间都不一定有一次。架构的变动也是慎之又慎,毕竟底层的东西影响范围比较大。当时间长了,架构本身就会积累很多东西,也就更加难改变了。
自己在一家公司待的时间很长,经历过几次架构改动,架构有在逐步迭代完善。但还是有不少东西受限于历史原因和业务当时的限制而不得不做的妥协,留下了各种各样的“遗憾”。经常会有点小小的感慨:如果这个能一开始就做好一点就好了。所以面对这种感慨,自己萌生了有没有可能重头再写一个的想法。在工作上不好说什么时候能有这种机会,但在业余上则是可以尝试一下,把自己的一些心得实践一下,也把一些自己觉得“遗憾”的地方纠正一下。

2.2 整理知识

做一件事情时间长的好处是这个事的全流程基本了解,里面有哪些坑和如何折中解决的也都了解。但也有个缺点,就是每次的迭代都是碎片化的,一个个知识就像一颗颗小珍珠一样散落到各个地方,总是感觉差一根绳子把这些零散的珍珠串接起来形成一个项链,也就是一个知识的体系。
借这个机会则可以把这些知识重新整理一下,把自己的一些思考记录下来,修正一些自己觉得不太好的地方,把自己之前了解的原理片段串联起来,从而形成一个小知识体系。

2.3 挑战

这种小架构,麻雀虽小却五脏俱全,要把里面的知识整理清楚,并不容易。一个东西好像是理解了,但如果要把它有条理的表达出来,难度就不在一个档次了。自己实际经历的不少东西是历史沉淀下来的,历史的局限也在里面,要把它的一些局限更换掉,既需要对局限的内容深入了解,也要钻研一些新的知识,才能把这些局限更换掉,这需要花不少时间。而在工作之外,时间本来就比较少,要把这个事情做成,挑战也比较大,需要自己给自己一股挤时间的劲,额外挤出足够的时间才有可能完成这个事情。把这个事列出来,也算是有一股监督的力量来推动一下自己。

2.4 局限

笔者并没有研究过各个公司的架构,很多理解也仅是一家之言,所以这系列的文章有比较多的局限性,整理出来既可以供大家参考,也可以向大家学习。欢迎交流和指正。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

苹果AR/VR头显路线图曝光,微美全息推进AI/AR智能眼镜新品开启视觉体验篇章

日前,郭明錤发表了一篇关于苹果(AAPL.US)2025-2028头戴式产品路线图的文章,里面提到苹果正在开发涵盖MR头显、AI眼镜、AR眼镜、Birdbath眼镜等共计7款设备。 苹果的头显设备中,大量出货的产品是类似于Ray-Ban Meta的智…

python pyecharts 数据分析及可视化(2)

一、任务要求 任务二:感冒高发期分析 【任务说明】 感冒是一种常见的急性上呼吸道病毒性感染性疾病,多由鼻病 毒、副流感病毒、呼吸道合胞病毒、埃可病毒、柯萨奇病毒、冠状病 毒、腺病毒等引起。临床表现为鼻塞、喷嚏、流涕、发热、咳嗽、头 痛等&#…

React自学 基础一

React基础 React 是一个由 Facebook(现 Meta)开发并维护的、开源的 JavaScript 库,主要用于 构建用户界面(UI),尤其是单页面应用程序中的动态、交互式界面。 简单示例: import React, { useSt…

PHP语法基础篇(八):超全局变量

超全局变量是在 PHP 4.1.0 中引入的,并且是内置变量,可以在所有作用域中始终可用。 PHP 中的许多预定义变量都是"超全局的",这意味着它们在一个脚本的全部作用域中都可用。在函数或方法中无需执行 global $variable; 就可以访问它们…

NumPy-核心函数concatenate()深度解析

NumPy-核心函数concatenate深度解析 一、concatenate()基础语法与核心参数函数签名与核心作用基础特性:形状匹配规则 二、多维数组拼接实战示例1. 一维数组:最简单的序列拼接2. 二维数组:按行与按列拼接对比按行拼接(垂直方向&…

aws(学习笔记第四十八课) appsync-graphql-dynamodb

aws(学习笔记第四十八课) appsync-graphql-dynamodb 使用graphql来方便操作dynamodb 理解graphql中的graphql api,schema,resolver 学习内容: graphqlgraphql apischemaresolver 1. 代码连接和修改 1.1 代码链接 代码链接(app…

关于微前端框架micro,子应用设置--el-primary-color失效的问题

设置了manualChunks导致失效,去掉即可,比较小众的问题 下面是deepseek的分析 关于 manualChunks 导致 Element Plus 主题变量失效的问题 你找到的确实是问题的关键所在。这个 manualChunks 配置影响了 Element Plus 样式和变量的加载顺序,从而导致主题变量失效。…

MySQL 学习 之 你还在用 TIMESTAMP 吗?

目录 1. 弊端1.1. 取值范围1.2. 时区依赖1.3. 隐式转换 2. 区别3. 解决 1. 弊端 1.1. 取值范围 TIMESTAMP 的取值范围为 1970-01-01 00:00:01 UTC 到 2038-01-19 03:14:07 UTC,超出范围的数据会被强制归零或触发异常‌。 具体表现为在基金债券等业务中&#xff0…

java中字节和字符有何区别,为什么有字节流和字符流?

在Java中,字节(byte)和字符(char)是两种不同的数据类型,它们的主要区别在于所表示的数据单位、用途以及编码方式,字节流和字符流的区分就是为了解决编码问题。 字节(byte)&#xff…

伴随矩阵 线性代数

伴随矩阵的定义 伴随矩阵的作用是什么?我们可以看到其伴随矩阵乘上自己等于一个数(自身的行列式)乘以E,所以对于一个方阵来说,其逆矩阵就是自己的伴随矩阵的倍数。 所以说伴随矩阵的作用就是用来更好的求解逆矩阵的。…

百胜软件获邀走进华为,AI实践经验分享精彩绽放

在数字化浪潮席卷全球的当下,零售行业正经历着深刻变革,人工智能技术成为重塑行业格局的关键力量。6月26日,“走进华为——智领零售,AI赋能新未来”活动在华为练秋湖研发中心成功举办。百胜软件作为数字零售深耕者,携“…

六种扎根理论的编码方法

一、实境编码 1.概念:实境编码是一种基于参与者原生语言的质性编码方法,其核心在于直接采用研究对象在访谈、观察或文本中使用的原始词汇、短语或独特表达作为分析代码。该方法通过保留数据的"原生态"语言形式(如方言、隐喻、习惯用…

【Spring篇09】:制作自己的spring-boot-starter依赖1

文章目录 1. Spring Boot Starter 的本质2. Starter 的模块结构(推荐)3. 制作 xxx-spring-boot-autoconfigure 模块3.1 添加必要的依赖3.2 编写具体功能的配置类3.3 编写自动化配置类 (AutoConfiguration)3.4 注册自动化配置类 (.imports 或 spring.fact…

Qt6之qml自定义控件开发流程指南

Qt6之qml自定义控件开发流程指南 🛠️ 一、基础控件创建 定义 QML 文件 在工程中新建 QML 文件(如 CustomButton.qml),文件名首字母大写。 使用基础组件(如 Rectangle、Text)构建控件逻辑,通过…

Vue简介,什么是Vue(Vue3)?

什么是Vue? Vue是一款用于构建用户界面的JavaScript框架。 它基于标准HTML、CSS和JavaScript构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。无论是简单的还是复杂地界面,Vue都可以胜任。 声明式渲染…

从零开始构建Airbyte数据管道:PostgreSQL到BigQuery实战指南

作为数据工程师,ETL(Extract, Transform, Load)流程是日常工作的核心。然而,构建和维护数据管道往往耗时且复杂。幸运的是,开源工具Airbyte提供了一种更便捷的解决方案——它支持350预构建连接器,允许通过无…

JavaScript的初步学习

目录 JavaScript简介 主要特点 主要用途 JavaScript的基本特性 JavaScript的引入方式 1. 内联方式 (Inline JavaScript) 2. 内部方式 (Internal JavaScript / Embedded JavaScript) 3. 外部方式 (External JavaScript) JavaScript的语法介绍 1.书写语法 2.输出语句 3.…

洛谷P1379 八数码难题【A-star】

P1379 八数码难题 八数码难题首先要进行有解性判定,避免无解情况下盲目搜索浪费时间。 有解性判定 P10454 奇数码问题 题意简述 在一个 n n n \times n nn 的网格中进行,其中 n n n 为奇数, 1 1 1 个空格和 [ 1 , n 2 − 1 ] [1,n^2…

MySQL Buffer Pool 深度解析:从架构设计到性能优化(附详细结构图解)

在 MySQL 数据库的世界里,有一个决定性能上限的"神秘仓库"——Buffer Pool。它就像超市的货架,把最常用的商品(数据)放在最方便拿取的地方,避免每次都要去仓库(磁盘)取货。今天我们就…

使用numpy的快速傅里叶变换的一些问题

离散傅里叶变换(DFT)的频率(或波数)确实主要由采样点数和物理步长决定。 最高波数和最小波长的乘积是1。单位长度内波的周期数。 (注意角波数是 k 2 π λ k \frac{2 \pi}{\lambda} kλ2π​) 使用numpy…