关于技术架构的思考

技术选型实则是取舍的艺术

这句话是我偶然在一篇技术架构方面的文章上看到的,每当我需要给新项目进行技术选型,决定技术架构时,一直坚信的。

当我们做技术选型时,需要考虑的东西非常多。比如,用关系型数据库还是非关系型数据库,MySQL还是PGsql,要不要用Redis,需不需要支持分布式文件存储,模块化还是耦合,用什么协议与第三方系统交互,用golang还是java,golang的话用gin还是kratos,微服务还是单体,系统预计有多大并发。

这些技术都没有优劣之分,我们需要根据实际的场景选择最合适的方案。记住,可以有远见,但不要过度设计。过度的设计对于系统和开发人员都是一种负担。我见过很多小团队,无脑上微服务,实际上微服务有它的代价,而小团队没有得到微服务的好处,反而为了微服务架构付出了不必要的代价。

先理解需求

在技术选型上,我最常犯的错就是对于需求的理解不够,常常因为一些细节问题推翻技术架构设计的某一个局部,虽不至于整体推翻,但是也做了很多弯路。在选择数据库的时候,要考虑实际场景,比如,读多写少还是写多读少,数据量有多大,需求会不会频繁变更,变更对于数据结构的影响大吗。一般我会用MongoDB和MySQL处理常规场景。我说的常规场景是指,当项目按照迭代的方式进行,后期大概率会发生不小的调整和变更,数据结构不是特别复杂,数据量单表相对较大等等情况下,我会选择MongoDB,比如文档类项目、社交项目、企业官网等。当数据量不是特别大,数据关系比较传统关系比较确定且复杂等情况下会选择MySQL。其实现在两个数据库在大部分场景下都可以互相替代,在选择的时候还可以考虑团队的偏向、历史技术沉淀等因素。我认为MySQL不适合处理海量数据的存储,单表上亿简直是灾难。MySQL的分库分表也有它的缺陷存在,在需求对整体数据进行分析处理的时候,即时分库分表了,效率也非常低下,同时在使用的时候复杂度也比较高。在技术选型的时候,我会尽量让开发人员能够写简单的代码,不用因为选型给业务思考带来更多的负担。

有一些和第三方对接的场景,要去调研清楚,第三方能够提供什么数据,支持什么技术栈。和第三方之间是通过推还是拉的方式拿数据,是全量还是增量,增量同步的时候多久做一次数据校验。支持什么协议对接,消息队列还是Restful或者别的协议。我曾经对接过一个GPT服务,一开始设计的是会有一个数据清洗加推送的服务,把本服务数据清洗过后推送给他们。后面一聊发现,他们需要自动生成sql语句,连我们的数据库执行查询语句。就把对接方式改成了直连中间库。中间浪费了测试数据清洗和数据推送技术可行性的时间。应该在和GPT方聊完再去确定技术架构的。

一些取舍

沉淀

接的项目多了,就可以沉淀下来一些规范。现在部门也沉淀出了一套处理不同类型项目的技术选型规范,可以复制粘贴基础库半小时内搭好一个框架。

除了框架搭建和技术选型以外,我们还沉淀了CICD规范、代码规范、依据DDD的分层规范、Git管理规范、研发流程规范等等各个维度的大大小小十几个规范。

MySQL还是MOngoDB

现在MongoDB用的多,一般不是很复杂的业务都直接上MongoDB了,主要是简单灵活,开发快。

时序数据库

有时候会有一些IOT设备的实时数据推送,一般会把这类数据存到TDengine,还挺好用的,可以用
SQL的语法处理数据,不用搭建一整套的大数据脚手架工具,就是生态不够完整,希望越来越好吧。

搜索

搜索要求比较高的时候会上Elasticsearch(以下简称ES),不过这个东西太吃资源了。有时候要求不高的时候会用MongoDB的Text类型索引,也支持搜索,不过只能支持完整单词匹配,分词做的不是很好,毕竟不是专门做搜索的。MongoDB好就好在不用多加一个第三方组件,然后也没有ES那么吃资源,内存毕竟挺贵的。虽然MongoDB也基于内存做查询优化的,但是相比于ES就好多了。

动态属性

曾经给IT部门设计过一个资产管理系统,他们要求资产类型和资产的属性都是可以扩展和自定义的。于是用了MongoDB去实现。其实需求就是一个EAV模型 Entity-Attribute-Value(实体、属性、值),使用MongoDB实现EAV会更加方便灵活,因为MongoDB天然支持JSON格式数据的存储。具体不再赘述了,有空再另一篇文章记录一下当时怎么设计的。简单讲就是下面这种结构,这是一个人员的实体,固定属性是Name,还有sex、region、QQ等可以让用户自定义的扩展属性。
请添加图片描述

golang的服务开发框架选择

golang在业界并没有一个统一的标准,不像java,基本上被Spring一统天下了。我司用的比较多的分别是Gin和Kratos,我一般用Kratos,可以做单体,也方便扩展微服务。Kratos这套是完整的解决方案,有API生成,依赖注入,限流,错误处理等等部件。在做一些组件上的技术选型的时候,一般会花更多的心思。比如选择限流方案,需要考虑限流的策略算法,资源池型和令牌桶型;需要考虑社区活跃度,有多少人用,除了问题官方会不会立马解答,要看看issue库里面坑多不多;另外还要考虑对代码侵入性高不高,能不能在中间件层无侵入注入。

服务监控和告警

没什么特殊要求的话, 整个部门共用一套K8s监控集群,内部安装了Prometheus+Grafana+alertmanager做监控、看板和告警。可以满足集群内部和外部的监控需求。

命名规范

这里主要是MongoDB的命名规范,下划线、中划线、首字母大写驼峰、首字符小写驼峰,这些选择感觉很多厂的选择都各不相同。我觉得只要部门内所有的系统保持一致就行了,具体用哪种反而不重要。我会去MongoDB的官方文档中,看他们CRUD的示例的集合和字段是用哪种风格,然后决定用什么,把这套规范推广至整个部门,让所有项目保持一致。只要一致,就可以减少一些成本。

代码检查

一般会利用Git的Pre-Commit做一个代码提交前的自动检查,在代码提交前,自动调用golangci-lint插件检查代码风格。

Git管理

GIt管理一般有GItFlow和GIthub Flow。少于5个开发的项目用GIthub Flow,就一个Master分支,用MR进行合并代码。多于5人用GIthub Flow,多了一些develop或者版本分支,代码合入到这些分支,分支开发完了才合入到master。提MR之前要用git rebase保证提交历史是线性的。

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

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

相关文章

怎么解决bash: composer: command not found问题

是不是遇到过bash: composer: command not found问题,怎么解决呢?下面由composer教程栏目给大家来详细介绍该问题的解决方法。 1、先看报错 2、由于错误的原因,安装很多东西都失败了。网上有的说是环境变量的问题,又一个个找也没…

面向对象三大特征之二:继承

继承的快速入门 什么是继承? Java中提供了一个关键字extends,用这个关键字,可以让一个类与另一个类建立起父子关系 继承的特点 子类能继承父类的非私有成员(成员变量、成员方法) 继承后对象的创建 子类的对象是由…

认知能力测验,①如何破解数字推理类测试题?

校园招聘(秋招春招),最为常见的认知能力测验,在线工具网将整理分析关于认知能力测验的系列文章,希望能帮助大家顺利通过认知能力测评,找到自己心仪的工作。 数字推理测试,是我们在求职中经常会…

中通单号查询,中通快递物流查询,对需要的单号进行备注

批量查询中通快递单号的物流信息,对需要的单号进行备注。 所需工具: 一个【快递批量查询高手】软件 中通快递单号若干 操作步骤: 步骤1:运行【快递批量查询高手】软件,并登录 步骤2:点击主界面左上角的“…

袋鼠目标检测数据集VOC+YOLO格式1400多张

袋鼠是双门齿目袋鼠亚目袋鼠科大袋鼠属的哺乳动物。袋鼠跳得最高、最远。雌性袋鼠都长有一个前开的育儿袋,袋鼠也因此得名。 [8]袋鼠泛指任一种属于袋鼠目的有袋动物, [7]它头小眼大耳朵长,面部较长,鼻孔两侧有黑色须痕。袋鼠胆小…

Python函数和模块的使用

我的博客 文章首发于公众号:小肖学数据分析 在开发过程中,函数和模块帮助我们将复杂的代码逻辑分解为可管理的部分,提升代码的可读性、可维护性和重用性。 本文将介绍如何在Python中有效利用函数和模块,提供详细的示例。 函数的…

《Linux C编程实战》笔记:一些系统调用

目录 dup和dup2函数 fcntl函数 示例程序1 示例程序2 ioctl函数 dup和dup2函数 #include <unistd.h> int dup(int oldfd); int dup2(int oldfd, int newfd): dup 函数复制 oldfd 参数所指向的文件描述符。 参数&#xff1a; oldfd&#xff1a;要复制的文件描述符的…

Spring Cloud Alibaba

文章目录 Spring Cloud Alibaba1 介绍2 Nacos&#xff08;注册中心和配置中心&#xff09;2.1 示例 3 Sentinel&#xff08;流量控制和熔断降级&#xff09;3.1 流量控制示例 4 GateWay4.1 断言4.2 过滤器4.2.1 局部过滤器4.2.2 全局过滤器 4.3 网关限流 5 链路追踪Sleuth Spri…

QT案例 使用WMI获取win_32类的属性值,包括Win32提供程序类中的属性

最近涉及到读取WINDOWS 系统电脑设备的各种信息&#xff0c;在一些特殊的PE或者简化系统中是没有WMI查询工具的&#xff0c;所以就自己写了个查询大部分WMI属性值的工具&#xff0c;免去了查网站的功夫。涉及到的方法内容就汇总做个总结。 PS:因为工作中软件基本都是我一个人开…

改进lora-scripts,支持SDXL训练,以及启动脚本

分享下自己改进的一个lora训练脚本&#xff0c;在ubuntu下如果SD-WEBUI的环境已经搭好的话&#xff0c;只需要下载lora-script就可以支持训练了&#xff0c;直接命令行方式训练。 首先&#xff0c;我们需要克隆下项目&#xff1a; git clone https://github.com/Akegarasu/lo…

docker安装Prometheus

docker安装Prometheus Docker搭建Prometheus监控系统 环境准备(这里的环境和版本是经过测试没有问题,并不是必须这个版本) 主机名IP配置系统说明localhost随意2核4gCentOS7或者Ubuntu20.0.4docker版本23.0.1或者24.0.5,docker-compose版本1.29 安装Docker Ubuntu20.0.4版本…

NO-IOT翻频,什么是翻频,电信为什么翻频

1.1 翻频迁移最终的目的就是减少网络的相互干扰&#xff0c;提供使用质量. 1.2 随着与日俱增的网络规模的扩大&#xff0c;网内干扰已成了影响网络的质量标准之一&#xff0c;为了保障电信上网体验&#xff0c;满足用户日益增长的网速需求,更好的服务客户&#xff0c;电信针对…

JAVAEE大型金融支付-第1章-讲义-项目介绍

第1章 讲义-项目介绍与环境搭建 1.项目背景 1.1 项目背景 随着移动支付的盛行&#xff0c;商业银行、第三方支付公司、其它清算机构、消费金融公司等众多类型的机构&#xff0c;都在为商户 提供网络&#xff08;移动&#xff09;支付解决方案。另一方面&#xff0c;用户的支…

视频推拉流平台EasyDSS点播文件播放请求添加token验证的实现方法

EasyDSS视频直播点播平台可提供一站式的视频推拉流、转码、点播、直播、播放H.265编码视频等服务&#xff0c;搭配RTMP高清摄像头使用&#xff0c;可将设备的实时流推送到平台上&#xff0c;实现无人机视频推流直播等应用。今天我们来介绍下EasyDSS系统点播文件播放请求添加tok…

谷歌的开源供应链安全

本内容是对Go项目负责人Russ Cox 在 ACM SCORED 活动上演讲内容[1]的摘录与整理。 SCORED 是Software Supply Chain Offensive Research and Ecosystem Defenses的简称, SCORED 23[2]于2023年11月30日在丹麦哥本哈根及远程参会形式举行。 摘要 &#x1f4a1; 谷歌在开源软件供应…

Tor网络原理详解

引入 匿名通信是一种通过采用数据转发、内容加密、流量混淆等措施来隐藏通信内容及关系的隐私保护技术。为了提高通信的匿名性&#xff0c;这些数据转发链路通常由多跳加密代理服务节点构成&#xff0c;而所有这些节点即构成了匿名通信系统&#xff08;或称匿名通信网络&#…

Flask学习四:补充

插件 flask-caching 简介 Flask-Caching 是一个 Flask 扩展&#xff0c;旨在为 Flask 应用程序添加缓存功能。缓存是一种提高应用性能的技术&#xff0c;通过将常用数据暂时存储在一个快速访问的位置&#xff08;如内存或磁盘&#xff09;&#xff0c;从而减少对较慢资源&…

【Nginx】Nginx了解(基础)

文章目录 Nginx产生的原因Nginx简介Nginx的作用反向代理负载均衡策略动静分离 Nginx的Windows下的安装Linux下的安装Nginx常用命令 负载均衡功能演示 Nginx产生的原因 背景 一个公司的项目刚刚上线的时候&#xff0c;并发量小&#xff0c;用户使用的少&#xff0c;所以在低并发…

MIT6.5840-2023-Lab2C: Raft-Persistence

前置知识 见上一篇 Lab2A。 实验内容 实现 RAFT&#xff0c;分为四个 part&#xff1a;leader election、log、persistence、log compaction。 实验环境 OS&#xff1a;WSL-Ubuntu-18.04 golang&#xff1a;go1.17.6 linux/amd64 Part 2C: persistence 大部分的bug都与这…

Datawhale 12月组队学习 leetcode基础 day3 递归

这是一个新的专栏&#xff0c;主要是一些算法的基础&#xff0c;对想要刷leedcode的同学会有一定的帮助&#xff0c;如果在算法学习中遇到了问题&#xff0c;也可以直接评论或者私信博主&#xff0c;一定倾囊相助 进入正题&#xff0c;今天咱们要说的是递归&#xff0c;递归是是…