各位对业务系统技术栈迁移有啥看法
行业
传统软件行业、工业信息化
现状
原来的业务系统是用 C++写的,NodeJs 作为应用容器,对外开放了 WebService 。也就是 NodeJs 是 tomcat ,C++写的业务是 war 包,这么一个策略。
然后就是目前我们需要进行微服务改造,最终要 SaaS 化
问题
1 、NodeJs 和 C++代码已经超过一百万行了,全部推翻重写风险略微有点大。
2 、现在 NodeJs 这一层目前处于不够稳定的状态,经常悄无声息的挂了,也没有特别牛的技术储备。
3 、古老的工业软件设计,仅能支持冷备,整体无状态化改造困难,C++的大佬真的很难招,是的,我们只支持 Windows
4 、原来的架构师,非常极其十分喜欢造轮子,比方说网关、注册中心等等,但是受制于手下同学的战力,真的是不太好使。
5 、C++没啥好使的 ORM ,也没有合适的分布式事务组件,作为业务系统,真的不可避免的要和数据库打交道啊。
6 、目前是按照项目交付的,现场太多,基础组件不稳定,各位同事苦不堪言。
策略
1 、使用 Java 慢慢替换现有的 NodeJs 这一层(杭州,公司的 Java 储备还可以),使用公共组件慢慢替换现有的各种不好使的自己造的轮子。
2 、不装了,我特么直接用 Java 开始一个重写业务,代码和我总有一个能跑。
请教各位是如何看待这样的大业务系统迁移的问题的?
为什么想动架构,还有个很大的原因是,我们有个现场,100 个用户的并发,直接把我们系统打挂了。客户提出,我们给你们家机器,但是我们目前没有横向扩展的能力
为什么要选择 Java ,第一是我的主力语言是 Java ,第二是公司还有其他业务线,Java 的储备还算比较足的。
感谢各位的回复,目前已经和大领导达成的策略
1 、不能一下子重构,但是可以从公共组件、边缘业务开始。
2 、尽量选择语言无关的开源组件替换。
3 、先做 Linux 化,再做无状态改造,无法改为无状态的服务考虑在网关层或者调度服务中响应。
4 、SaaS 化的事情往后拖一下,先对付现场。
你层级多高? cto 或者总监这件事可行,否则,只能是你跑…
切身经历告诉我,不要寄希望于彻底重写一次到位,尽量想如何一点一点替换
Node.Js 套 C++还是第一次见 讲讲怎么玩的
没特别理解,SaaS 化和技术栈的改变之间的逻辑关系是什么?
如果想相对平滑的过度,其实.net ( C#)+ IIS 是相对更稳妥的技术选型。( c++的老库可以复用,然后灰度更新)
试试新需求用 Java 实现,然后用跨语言的 rpc 与原有系统连接,比如 grpc
原来的能不动就不动了,又不是不能跑 :D
百万行的代码的项目,从零开始 Java 重写?想想就头皮发麻
悄无声息的挂了?写过脚本监听端口掉了自动重启试试?我们就是这么干的
同意 2 楼,只能慢慢迭代
超過一百萬行重寫除非是換領導了
不然
附议楼上的 C# 调用 cpp 更方便。但是为了微服务啥的,招人和开发效率 建议 java 但是硬件要提高。
如果真像你说的 nodejs 是 tomcat 的话 那 nodejs 可以直接丢弃。另外一百万行代码不可怕 js 代码永远都是一坨坨的,cpp 也有头文件无形中增加了太多没用代码
还有一个办法把 c++的业务方法都找出来 jndi+springboot 说白了就是套一层 java 壳。然后你就可以慢慢的把 c++的消化掉
接入层架好网关慢慢做灰度迁移吧
这是个典型的遗留系统迁移。
关键字“遗留系统”,“防腐层”。 你会得到很多相关的常用套路。
个人建议平滑过度,补齐单元测试、集成测试。 挨个模块挨个模块迁移。
这个课题很大,几句话说不清楚。也不想说,点到为止。
早知道,还是 Java.jpg
我们就有类似的情况,原有的整套都是 C++写,代码量五十万网上
其实思路就是——模块化、服务化
简单点就是内部一部份一部份的拆出来,然后再服务化(这个过程是不换语言的);服务化之后,就可以看机会一个服务一个服务重写、重构,若 Java/Go/C++这些
一开始先别考虑什么微服务(如引入网关、注册中心什么的),不划算。开始要做的就是解耦,模块化、服务化、再重构重写
目前是架构师(新任命的),CTO 想搞这个事情。
现在的想法就是慢慢替换,一次性重写实在是风险太高了,现场太多了
具体细节我也不清楚,大概就是 NodeJs 直接调用 dll 里面的函数?
首先排除重写这个选项。既然微服务了,就新的用 java 写。 不出问题的不换,出问题的模块慢慢换成 java 。这是一个长期的规划,不要想着一次解决问题。 对了 java 写久了,最后一样会变成屎山的。 要我说能跑就行,实在跑不了了在原有上面改才是最稳妥的。 屎山换语言也还是屎山。
因为目前表现来看,是 NodeJs 这一层问题很大,又没有足够强的大佬。第二个就是业务系统,C++可用的组件太少了,开发效率也不高。第三个就是自己造的低质量轮子太多了,已经维护不过来了。
我们目前也做到了,自动重启,但是我们的行业特殊,自动重启是要被审计...
jndi 也考虑过,哈哈哈,主要是原来的业务系统同事有抵触,而且这种东西容易出现做好了是应该的,做不好是 shabi 这么个情况
哈,感谢
直接推到重写不现实,C++那边也没实现微服务化。至于代码层面,跑起来的代码才是好代码,但是从目前的技术需求来看,以我们公司现有的储备,维护会愈发困难。
了解下云架构,既然 op 补充说弹性扩容能力,那么完全可以适当改造就具备(具体改多少看具体业务)
我最早就是因为直接面对负载量保障,所以从云计算的一开始就各种探索,最后找到了云的思路,重集群轻单机
这个也是一个思路,核心问题就是如上我说的,我们没有横向扩展的能力,虽然我们有网关(我们叫调度服务)和注册中心(别问,问就是理解不一致)
既然用微服务了,那就可以异构微服务。
迁移原则是:仅在必要时或极低成本时迁移,C 代码以保留为主,迁移为辅。
- 在 nodejs 前再加一层,用于兼容微服务间调用方式,如 http 。
老代码以保留为主,分离为辅。
- 如果 1 个模块功能已经比较完善,那就不必要用 java 重写,直接 http 调用
- 如果 1 个模块在未来需要大量开发,那就用 java 开新服务。这样 1 个模块既有 java 代码,也有 c 代码。这个模块内部,需要功能间方法调用,如果功能简单,则可以直接以 java 重写,如果功能复杂,则 http 调用。
Dubbo 支持异构微服务,其他的技术栈你可以再找找。
首先,你要把基于 windows 的 C++程序改成基于 Linux 的。这一步其实不难,最多重写 make 文件。
然后,把 C++的巨石服务尽可能分拆为多个单领域服务,譬如:组织机构、用户、角色、订单等等。
最后,无非就是容器化,这个就好简单了。
模块拆分吧,先从边缘业务开始重写,慢慢替换,过程中可能还需要新旧系统同时跑。
2 、现在 NodeJs 这一层目前处于不够稳定的状态,经常悄无声息的挂了,也没有特别牛的技术储备。
挂了无所谓,pm2 启动 NodeJs ,再重启呗
我们是面向工厂的,而且行业特殊,重启是要被审计的...
能不动就别动...
用过 nodejs 多年,表示 nodejs 和 C++两者的性能都是非常高的 。nodejs 作为应用层还是非常合适的。如果只能 100 并发,肯定是你们的代码哪里阻塞的问题。但是你们的技术储备没有懂 nodejs 的,那就没办法了。
哈哈哈,100 个用户就挂了。但是 100 万行代码看着都头大呀,我觉得动架构真的很需要勇气,而且完成之后带来海量的问题,到时候万一绝望了怎么办,我看大概率只能你跑了。
我的建议是,不要重写,而是把原有的优化。你们的问题是在于没有招到 nodejs 的人才。假如实在找不到,再考虑换技术栈的事情。感觉你们公司有其他技术栈的软件,却招一推 java 程序员,感觉招聘这块没有针对性。如果你确定全部转到 java 块,那么,重构风险你就背吧。个人觉得历史包袱应该蛮多的
确实,我们内部一直认为是人的问题,完全没到语言的瓶颈,但是奈何是没有 NodeJs 的储备,原来搞这套的人已经跑路了,现在都是 C++的同事兼着 NodeJs...
杭州的工业信息化圈子就这么大,不行就回到老东家划水(手动狗头)
你们是做 mes 系统的吗,还是其他的工业系统,我是做设备研发的,算是半个同行,感觉这行很多公司用的是 C#或者 java 呀,我是一直用 C#的
哈,是的。我们公司的业务老大是 C++出身...
记录日志找到 node 挂的原因,修复这个老系统稳定性。
新业务用楼主擅长的搞。
一般解法都是另起炉灶,慢慢迁移过去。你们搞个新系统,慢慢加功能,满足部分用户需求,把这部分用户迁移过去。顺便梳理下,原系统的功能,没用的就干掉。
但是即使如此,也是很漫长,非常耗费人力物力
最后一个终极问题:你如何确保新的代码不会变成屎?凭什么这次就会不一样?
100 个并发就挂 而且机器不能扩容
那瓶颈在 io? db?
否则扩容一般就可以
如果瓶颈在 io? 不换语言应该也能解决
想当年第一家公司做 MES 就是 java. 这类系统 C#也很合适。
过往公司也有平台和业务都是 CPP 然后套上 nodejs 结果很快淘汰了。
总结下经验选项有三
一路 c++到底,把 nodejs 也用 c++换掉
套壳 java/C#慢慢替换
重新写一套替换老系统
另外 mes 之类的不要上微服务搞什么服务发现之类的噱头, 拆分成单独应用相互调用就好了。
核心问题还是你能不能推动这个事
其次就是 java 的全套微服务改造不仅仅是业务代码 要求有运维能力
从落后 N 久到跟上时代 新中间件用的可不少....
开发业务代码成了相对最简单的事
确实庞大的和复杂的。
首先是技术栈的变换,这个主要视员工技术栈而定,楼主说了,有 java 人才,而且自己也是 java 人才,所以 这点没毛病。
但是,一入 java 深似海,各种框架,中间件,组件,分布式,DevOps ,容器。。。。这些都需要攻克的,基础工具(代码,api 文档,知识库等等)和流水线还是要搭建好。。。
第二,关于业务系统重构,从边缘系统开始,让兄弟们练手
直接上 rust, 一劳永逸.
我感觉你根本没有弄清楚瓶颈在哪,就想着重构。重构不是万能药,你如果对目前的困境没有认知,甚至不知道怎么解决当前的问题,重构是必然失败的。
个人建议
- 找清楚当前时不时崩溃的原因,通过各种方式得出一个在当前局面增强稳定性的方案
- 评估重构的代价,重中之重是从当前如何平滑过渡到重构的方案
- 评估重构成功之后的优势,从业务角度和运维角度,评估 1 和 3 ,最终得出方向性结论
这其实是一场政治问题,并不是技术问题
无论如何是另起炉灶,还是怎么样,都得先解决 nodejs 的问题,解决的 nodejs 的问题,保证能交付,剩下的怎么搞都可以了。
感觉应该从机器不能扩容这个方向去解决,把一些共享的状态加锁,应该就可以完成扩容了吧。百万级别的代码重构和变成异构架构听着就头大
nodejs 又不是很难,你就修一下呗
实在行不行,可以把 nodejs 用 typescript 改造一下,肯定比 js 稳多了
你先解决眼前的问题,再考虑重写
超过一百万行基本上没有迁移的可能了,这个技术债几乎会永远存在了,即使写了新的系统,也会被老系统拖累,最后大概率是老代码新代码一起跑,出了问题两边都要看...
#4 我觉得是这样:如果没有 sass 话就是客户单独部署,一个客户一套代码,哪怕定制也是互相隔离的。但是 SAAS 化了以后,所有客户一套代码,定制需求上来后开发的效率、成本就跟技术栈密切相关了,典型的 C++么有 java 好招人。
招 nodejs
先找大佬处理 nodejs 的问题,再解决迁移的问题吧
代码和我总有一个能跑。
牛逼😂
代码和我总有一个能跑。 哈哈哈哈
重写一个新项目,但是可以一点点写,然后灰度接入主项目的网关层,用以验证重写项目的稳定性和可靠性。当然你们开发的速度要快于灰度的速度,最终实现全体切换到新项目
无论哪种都挺难,一般遇到这种问题要么混到彻底维护不下去, 要么劝 boss 花钱做 2.0
以原项目为基础做替换必定会遇到要向原来的设计妥协的情况,可能会导致新写的功能依旧被污染成 shi 山
重做 2.0 会导致你们有相当长一段时间是没有产出的,并且大概率要一边维护老的一边开发新的,疲于奔命最后干不下去
他这根本不是重构,他想要的是重写。私以为百万行代码进行 Saas 化,招几个技术大佬重构一下比重写成本低多了
除非你能让老板看到技术栈替换对业务有什么利好方向,不换会有什么非常大的问题,不然准备看面试题比较好一些。
有一句话很重要:“技术没有业务重要”
go 可以交叉编译 exe
100 个用户就把系统打挂了,会不会是数据库有慢查询语句……
这几天通过腾讯云香港轻量访问 youtube, 超慢。。。 各位有没有这种情况? 有 每逢佳节 王八开会,网民受累 慢的时候不到 300K ,难度腾讯 1 个母鸡放太多仔…
在自己的小服务器建了一个密码管理器,但是怕被入侵,同时又不想放弃网页密码管理器的便利性。所以想问问有没有什么 webui 服务能够控制密码管理器的端口的开放。预期方案:- 不用…
我在 namecheap 有一个 .ac 后缀的三位长度域名,但是貌似这个后缀没办法通过备案, 迫于太懒想少敲几个字,就想问一下大家有没有办法通过这个域名正常的显示部署在阿里云…