- 主题:请教一下dotnet的兼容性
代码的兼容性:
从 dotnet c0re 3.1 起,dotnet 的代码兼容性已经非常优秀,从 dotnet c0re 3.1 升级到 dotnet 5.0,然后再升级到 dotnet 6.0,都是只修改项目文件里面的版本声明,然后更新下 nuget 包对应版本就足够了。包版本不更新一般也没问题。(还需要更新CI里面 dockerFile的 base image sdk 和 runtime 版本,如果你用到的话)
第三方依赖这几年没见过因为 breaking change 升不上去的情况,api 接口都是经过慎重考虑的。每个版本更新都会有专门的 breaking changes 文档页,都是些很细微的地方,基本没影响。碰到过一些版本不适配的情况是 unit test 的 Nunit framework 用低版本的 package 不认识高版本的 .net 版本的情况,升级 package 到最新就好了。
.NET framework (windows 下的那个)的兼容性已经保持了20年了,不过不属于我们的考虑范围。
轻重问题:
现在我们是在 linux 用 docker 跑基于 asp.net c0re 的微服务,一个服务镜像打包后大概 200MB 左右,启动速度通常 1s 内,对于 server 端没什么好抱怨的了。如果你初始化代码写得多可能会稍慢点,但肯定在秒级别。实在在意启动速度可以启用 NativeAOT,虽然我觉得在 server 端意义不大,而且不少库不支持。
整个框架其实已经很轻量级了。如果用 MinimapApi 会更加轻量级。刚看了下 MinimapApi 的 helloworld 模板程序,跑了 15s 100 并发的 benchmark 之后,占用内存大概 160 MB 左右。不过 dotnet 是带 GC 的,你内存大,一直跑它就会多占用内存到阈值再 GC,可以通过 cgroup 之类的东西来限制。看自己的取舍是用 workstation GC (保持低内存占用但吞吐量差点)还是 server GC (优先吞吐量,内存可能会占用比较高).
开发环境:
我司基本上都是 Window 和 Mac 做开发工具,Windows 下用 Visual Studio 2022,Mac 用 JetBrains Rider 的比较多,有一个 Visual Studio for Mac,但我帮别人解决问题的时候用过几次,个人认为并不好用。vscode 有时候也用,可用性还不错,特别是快速代码浏览的时候,直接打开目录,不用等 vs 加载项目,但开发的爽快感个人感觉还是比不上 Visual Studio。
没见过有人真的在 linux 下面开发。或者你可以试试用 vscode remote,在 windows 下面开发 linux 上面的代码库。
【 在 eGust 的大作中提到: 】
: 我们公司一直用 ruby on rails 开发 web 应用,最近开始考虑技术转型。新的开发栈基本是前后端彻底分离,后端只提供 web api 就好了。我个人是比较倾向 c# 的,主要原因是用了 ts 之后回不去没类型的开发了,再加上跟 java 和 go 比还是更喜欢 c# 的语法,尤其是能重载运算符
: ,这样做计算的时候代码更好读,另外 async/await 的语法也应该更容易上手。
: 但是在有人提出了反对意见,由于我对 c#、asp.net 的历史和生态也没啥概念,所以特地来请教一下。
: ...................
--
FROM 113.65.10.*
欢迎到时候一起讨论~
【 在 eGust 的大作中提到: 】
: 太感谢了,刚才回了一堆又没发出来,也许过几天会再出来……
: 总之我感觉有信心了
--
FROM 113.65.10.*
频繁 scale 波动,cold start的话,的确比较麻烦,比不上 aot 的和解析语言
据说 java 在 lambada 上更快点,不知道为什么,都是类似的处境
之前看文章有些人迁移到了 Container App,保留一个 instance 常驻来解决这个问题
aws 应该是 App2Container
不过我对这里面的成本之类的不熟悉
【 在 eGust 的大作中提到: 】
: 目前感觉问题不大
: 唯一有问题的应用场景就是 aws lambda,冷启动时间实在是太感人了。相同的功能,如果用 node18 给 128M 内存,冷启动 950ms 返回结果。dotnet6 + 128M 大概 9s,如果把内存增加到256的话将近4s。
--
FROM 59.41.68.*
我感觉不是太理解你这个 web service 的定义
一般作为 web service,不是常驻一个服务端进程,一直处理传过来的 http request 吗?
【 在 eGust 的大作中提到: 】
: 我的实现还是基于 web service,对 lambda 的 event 进行转发。本地启动服务的时候,也能感觉到不是马上就起来的,所以 web service 本身的初始化也是占用不少时间的。如果直接处理 lambda event,就能把这部分时间省下来,缺点是直接绑 aws 上了。这个目前来说我觉得不重要
: 乙簿褪谴蟾攀砸幌拢懈龈拍疃选
: 这方面可能 node 还是有优势吧,另外一个用 rust 写的服务,冷启动也要 1s+ 才返回结果。不过做的事情不一样,不好直接比。基于 web service 的实现,本身服务的启动速度非常敏感。而对传统的 web 框架来说,服务启动的时间不敏感。我回头还得再试个 py,这样做对比的时候有
: ...................
--
FROM 59.41.68.*
噢,你说的是 serverless
我们是传统的写个 service,让它一直跑。跑在自己 DC 类 k8s 集群上,实例在更新之前一直存在。
lambda 如果保证比较稳定的输入量的话,一直 hot 着应该还好。或者自己写一个定时请求保活?
这得根据你们的具体的业务情况来了。现在云产品可供选择的太多,规划起来脑仁疼。。
【 在 eGust 的大作中提到: 】
: aws lambda 是基于极其轻量的 vm(基于 firecracker,据称只有5M的 overhead,启动速度也是毫秒级别)的服务,并不会保证有一个实例持续运行。超过一定时间没有访问的话,该 vm 就被干掉了。
: serverless 就是这么一个概念,前端静态文件放 s3 上面,cloudfront 自带 cdn 功能,给个域名就行。api request 走的是 api gateway,相当于 load balancer,根据请求启动对应的 lambda。lambda 本身是有一个 handler 会接受到一个 event,里面带有一定格式的数据。所以实际
: 鲜敲挥蟹务进程的,只在使用的时候才会启动 vm 调用 handler。
: ...................
--
FROM 218.17.141.*
了解
【 在 eGust 的大作中提到: 】
: 用 node 做示例的话,应用大概是这样的
: // app.ts
: import fastify from 'fastify';
: ...................
--
FROM 218.17.141.*
楼主应该在新西兰?
【 在 jimmycmh 的大作中提到: 】
: 没特殊需求,选大路货是最合适的,除非你是老板愿意为个人喜好付费
--
FROM 59.41.68.*
自建 DC
我们的量用aws已经很不划算了
【 在 mingtong 的大作中提到: 】
: 你们用的aws还是azure
--
FROM 59.41.68.*