Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >大型项目的关键因素有哪些?

大型项目的关键因素有哪些?

提问于 2024-12-20 10:40:09
回答 3关注 0查看 73

对于大型项目在设计可扩展和可维护系统架构时,真实项目中最关键的考虑因素有哪些? 目前很多开源项目,建议是基于开源改造还是自己构造轮子?

回答 3

架构师之路

发布于 2024-12-23 08:49:40

15年加盟到家后,框架/组件/基础服务/技术平台,正好也是自己负责范围的一部分,开源还是自研,谈一谈自己的想法。

其一,早期不建议自研。

早期研发人数较少,公司也不确定能走多远,业务相对简单,业务以“快速迭代”为最高优先级,此时一般会选择“自己熟悉的技术”作为选型:

(1)研发语言:熟PHP选PHP,熟Java选Java;

(2)数据库:熟MySQL选MySQL,熟SQL-server选SQL-server;

(3)框架组件:熟Ruby on Rails选ROR,熟ThinkPHP选ThinkPHP,熟Spring boot才选;

(4)…

此时千万不要纠结选型,选自己熟悉的,业务以快速迭代为最优先,公司得先生存下来。

多说一句,此时对于技术合伙人的技术视野就有一定要求,如果早期方向不对,等公司发展若干年,数据量并发量上涨很多倍,成本以及未来的技术应对恐怕会有麻烦。

58早期选型是微软技术体系,后来数据量增大,并发量增大,机器数据库越来越多,性能扛不住,成本也扛不住,后来CTO带领大家转型开源阵营,虽然阵痛了1-2年,但长远来说,绝对是正确的决策。

如今,如果你再创业,选云,选Spring体系,八成不会走太大的弯路。

其二,随着规模的扩大,要控制技术栈。

随着业务越来越复杂,研发人数越来越多,如果每个leader都选择自己擅长的框架,就会出现这样的情况:

(1)站点框架,team A用着SSH,team B用着Spring+SpringMVC+Mybatis;

(2)服务框架,team C用着REST,team D用着dubbo,team E用着thrift;

(3)数据库访问,team X用着mybatis,team Y用着DAO,team Z用着jdbc;

(4)…

对于整体而言,跨部门的调用越来越麻烦,重复造的轮子越来越多,技术效率会逐步降低,研发+测试+运维成本都越来越高。

即使不自研,技术栈也请尽量统一。

其三,统一了技术栈,建议浅浅的封装一层。

统一了技术栈以后,如果不封装,redis官方Java客户端Jedis可能有这样一些接口:

String Memcache::get(String key)

String Memcache::set(String key, String value)

String Memcache::del(String key)

浅浅的封装一层,会变成这样:

String DaojiaKV::get(String key) {

         String result = Memcache::get(key);

         return result;

}

String DaojiaKV::set(String key, String value) {

         String result = Memcache::set(key, value);

         return result;

}

String DaojiaKV::del(String key) {

         String result = Memcache::del(key);

         return result;

}

这有什么好处呢?

(1)对上游屏蔽底层实现的细节,调用方不用关注缓存是memcache还是redis,调用方只关注DaojiaKV;

(2)底层变化的时候,对上游透明,当memcache不能满足需求,要切换为redis时,所有调用方不需要大的变化,升级一个最新的DaojiaKV即可,DaojiaKV的接口不变,实现变为:

String DaojiaKV::get(String key) {

         String result = Jedis::get(key);

         return result;

}

String DaojiaKV::set(String key, String value) {

         String result = Jedis::set(key, value);

         return result;

}

String DaojiaKV::del(String key) {

         String result = Jedis::del(key);

         return result;

}

(3)统一实现一些通用的功能,就不需要每一个上游升级了,例如,要实现一个缓存访问时间统计的功能,所有调用方不需要大的变化,升级一个最新的DaojiaKV即可:

String DaojiaKV::get(String key) {

         Long startTime = now();

         String result = Jedis::get(key);

         Long endTime = now();

         reportKVTime(startTime- endTime);

         return result;

}

String DaojiaKV::set(String key, String value) {

         Long startTime = now();

         String result = Jedis::set(key, value);

         Long endTime = now();

         reportKVTime(startTime- endTime);

         return result;

}

String DaojiaKV::del(String key) {

         Long startTime = now();

         String result = Jedis::del(key);

         Long endTime = now();

         reportKVTime(startTime- endTime);

         return result;

}

同理,如果要实现统一的告警,调用链跟踪,SQL执行时间,也可以用类似的方法。

其四,随着规模的进一步扩大,需要适当的造一些轮子。

业务进一步发展,研发团队进一步扩张,虽然使用了统一的技术栈,但不同研发团队的痛点是极其类似的:

(1)有站点,监控服务的可用性,处理时间监控需求;

(2)有告警需求;

(3)有自动化发布,自动化运维需求;

(4)有服务治理,服务自动发现需求;

(5)有调用链跟踪需求;

(6)有SQL监控需求;

(7)有系统层面数据收集与可视化展现的需求;

(8)…

此时,开源的框架可能满足不了需求了:

(1)开源框架/组件太重了,我们需要的可能只是一个轻量级的框架/组件;

(2)开源框架/组件,只能满足我们的一部分需求;

(3)不了解开源框架/组件的设计理念,要二次开发成本更高(维护dubboX的同学,维护数据库中间件Atlas的同学可以出来说两句);

(4)有些通用的需求是和业务紧密结合的,开源框架/组件可能满足不了;

(5)…

此时,如果技术实力具备,可以统一研发一些框架和组件,解决所有技术团队的通用痛点,满足所有技术团队的通用需求。

总结:复用开源,还是造轮子自研?

初期建议:不自研,用熟悉的,业务快速迭代为优先,需要一定技术视野。

长远建议

(1)统一技术栈;

(2)浅浅封装一层;

(3)适当造轮子;

杜金房

发布于 2024-12-24 13:23:13

当然是先用开源的。

开源的,凡上比较流行的项目,都已经被很多人很多场景验证了。稳定的代码不是写出来的,是跑出来的。

对于流行的开源项目,如果你发现一个Bug,并修复了,建议给主游提PR,这样,相当于即为开源项目做了贡献,又相当于整个开源社区都在为你打工。

有一些开源代码,可能框架很好,但你要做很多改造才能适合你的业务,给上游提PR因为改造太大肯定无法合并。这时候,你有两个选择:1)Fork一个,自己成为开源主导者;2)闭源(注意在遵守开源协议的前提下)。

总之,站在巨人的肩膀上是没有错的。很多号称自研的系统其实也不是从头自研的,只不过有的不是站在肩上,而是站在巨人的腰上或腿上。

但如果你的项目无法跟开源协议兼容,那就只好自研了。如你所说自研“大型项目”而不用一点开源代码,那将是一个大型的工程。

揭光发

发布于 2024-12-25 08:12:08

就一句:站在巨人的肩膀上!

使用成熟的开源方案,能避开太多坑,减少大量不必要的损耗。

如果商业上允许,法务上合规,优秀的开源项目自然是最好的选择。我看到过太多各种理由的自建轮子,理由都是站不住脚的,可能是为了取悦自己让自己觉得搞出一个轮子有成就感,可能为晋升加点火药,可能说开源的项目扩展性不好不适合自己的业务(深究一下会发现可能他根本没仔细研究清楚)。

和开发者交流更多问题细节吧,去 写回答
相关文章
java常量有哪些_Java中的常量有哪些?
JAVA常量就是在程序中固定不变的值,是不能改变的数据。例如数字1、字符“a”、浮点数3.2等。那么java的常量有哪些呢?在Java中,常量包括整型常量、浮点数常量、布尔常量、字符常量等。
全栈程序员站长
2022/09/08
4.7K0
java常量有哪些_Java中的常量有哪些?
SaaS公司估值东山再起,影响估值的关键因素有哪些?
T客汇官网:tikehui.com 撰文 | 译者 徐婧欣 核心提示:最近,不同于过去的毫无章法,SaaS公司的估值开始恢复正常。过去的投资者在选择投资对象时将收入增速视为首要因素,而现在投资者的关
人称T客
2018/03/26
7870
SaaS公司估值东山再起,影响估值的关键因素有哪些?
后台项目有哪些亮点, 有哪些难点,你怎么解决的
在您描述项目时,也可以通过提供一些可视化的东西,如流程图、示意图、截图或视频来帮助面试官更好地理解您的项目。 除此之外,应该从用户角度出发认真思考项目的需求和业务场景,语言要积极向上,表达有信心和条理。
张哥编程
2024/12/07
3640
SCSS的用法有哪些?
SCSS(Sassy CSS)是CSS的一种扩展语言,它提供了一些方便的功能和语法来帮助开发者更高效地编写和组织CSS代码。下面是一些SCSS的常见用法和示例:
王小婷
2023/11/02
3800
Linux的用途有哪些?
Linux因其强大的功能和灵活性,在多个领域和场景中得到了广泛的应用。以下是Linux的主要用途及其适用场景:
是山河呀
2024/11/30
8750
IO的分类有哪些
ma布
2024/10/21
1430
Kaizen的好处有哪些?
在今天的大多数公司中,都有一种减少浪费和提高质量的一致动力。Kaizen方法的好处远远不止于减少浪费或提高质量,虽然很多不同的质量工具都能让你走到这一步,但是Kaizen可以让你走得更远。适当地实施Kaizen方法可以在组织的所有层次上以各种方式取得积极的结果。实施Kaizen的好处包括但不限于:
用户9972271
2022/12/19
9030
企业服务增长之道(7):哪些关键因素会影响SaaS公司的销售业绩?
抓销售,我就不谈了。CRM一上,销售制度一管,销售提成一分,规规矩矩,明明白白。尤其一些指标是非常明确的,电话数、拜访数、KP见面次数,这些都是硬性指标,只要做,大棒加胡萝卜,总能做上去。
谢强byron
2021/04/26
4030
企业服务增长之道(7):哪些关键因素会影响SaaS公司的销售业绩?
开发软件APP的难点有哪些?有哪些好用的开发平台?
在数字化转型的大潮下,开发一款属于自己的APP成为了许多企业和创业者的梦想。然而,从零到一打造一款高质量的APP并非易事,它涉及多环节的精细协作和专业技术的支撑。本文将为您详细解析APP开发的流程、面临的难点,助您在APP开发之路上更加得心应手。
Zoho Creator低代码
2024/06/14
3930
开发软件APP的难点有哪些?有哪些好用的开发平台?
住宅代理的优势有哪些?
使用住宅代理成为了这几年很多公司不约而同选择做的事情,其概念在⽹络应⽤领域⾮常流⾏。对于需要匿名、安全、地理定位灵活性和改进性能的企业来说,住宅代理是必不可少的。在本⽂中,Oxylabs将讨论住宅代理的定义、类型,以及住宅代理的⼀些优势。
用户7850017
2023/05/06
3560
住宅代理的优势有哪些?
DDOS常见的类型有哪些?
之前讲过DDOS有哪些类型,但是因为时间问题没有那么详细的去分享。并且最近有几个客户被攻击后,也不确定是受到什么样的攻击,因此,再写一些关于DDOS的种类分享给他们,先简单介绍一下各种类型的攻击。
墨者盾
2019/06/12
1.6K0
DDOS常见的类型有哪些?
Ribbon 的核心组件有哪些
Spring Cloud Ribbon 是一个客户端负载均衡器,它的核心组件包括负载均衡器、服务列表和负载均衡策略。
堕落飞鸟
2023/04/07
4290
前端的长度单位有哪些
首先在前端开发中,会遇到各种不同类型的长度单位,而整体的长度单位分为两大类:绝对长度和相对单位。
程序媛夏天
2024/01/18
3190
常见网站的类型有哪些?
随着时代的不断发展,很多企业都开始注意到互联网的重要性,想要进入互联网最容易的方法就是建设企业网站。在建设网站的时候,需要先了解到网站的类型,这样才能设计出优秀的网站。那么,大连网站建设的类型有哪些?主要分为四大类,我们就一起来看一下吧!
大金SEO
2019/07/29
5.5K0
单点登录落地实现技术有哪些,有哪些流行的登录方案搭配?
实现单点登录说到底就是要解决如何产生和存储那个信任,再就是其他系统如何验证这个信任的有效
艾编程
2020/06/10
3.5K0
有哪些好用的甘特图插件?
甘特图对于业务场景中的工程项目管理、预算执行、生产计划等都能将原有的表格数据,转变为直观的甘特图模式。作为纯前端表格控件SpreadJS 的插件,甘特图可以作为一个特殊的“Sheet”融入已有的表格中,方便进行数据的可视化展示,也能更直观的查看计划执行情况,如下图所示:
葡萄城控件
2023/10/16
6090
有哪些好用的甘特图插件?
常见的网络攻击有哪些?
近期的网络攻击有些频繁,晚上凌晨左右一般会接好几个电话,反映的都是不同的网络攻击。有些病毒攻击不在我们的解决范围内,今天墨者安全主要针对DDOS攻击,CC攻击防御的等给大家分享一些常见的网络攻击类型。
墨者安全筱娜
2019/04/13
3.2K0
常见的网络攻击有哪些?
MySQL 的优化方案有哪些?
性能优化(Optimize)指的是在保证系统正确性的前提下,能够更快速响应请求的一种手段。而且有些性能问题,比如慢查询等,如果积累到一定的程度或者是遇到急速上升的并发请求之后,会导致严重的后果,轻则造成服务繁忙,重则导致应用不可用。它对我们来说就像一颗即将被引爆的定时炸弹一样,时刻威胁着我们。因此在上线项目之前需要严格的把关,以确保 MySQL 能够以最优的状态进行运行。同时,在实际工作中还有面试中关于 MySQL 优化的知识点,都是面试官考察的重点内容。
码农架构
2021/02/23
2.9K0
MySQL 的优化方案有哪些?
性能测试的类型有哪些
性能测试是为测量或评估被测软件系统与性能效率相关的特性而实施的一类测试,它关注被测系统在不同负载下的各种性能效率。软件系统的性能效率相关特性的覆盖面非常广泛,包括系统的执行效率、资源占用、系统容量等。
漫谈测试
2024/10/09
2910
性能测试的类型有哪些
进程的调度算法有哪些
进程的调度算法是操作系统用来决定哪个进程可以执行的一种策略,常见的进程调度算法包括:
程序员朱永胜
2023/12/05
6650

相似问题

roomService后台相关表有哪些,对应的字段有哪些?

0177

默认脏字有哪些?

0281

腾讯有哪些AI的技术?

1542

上传视频的审核有哪些?

0158
相关问答用户
萃橙科技 | 合伙人擅长4个领域
腾讯 | 技术专家擅长2个领域
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档