在选择服务器语言时,除了开发时间之外,还必须考虑哪些因素?



我试图更好地理解服务器语言/框架及其在微服务环境中使用的潜在优点和缺点。开发时间对我来说并不重要,因为这是我自己的个人项目,学习使用正确的工具来解决问题对我来说比构建服务所需的开发时间更重要。

我越想越觉得Elixir应该在90%的情况下使用。原因有两个:

1)并发意味着许多用户可以毫无故障地访问服务

2)大多数微服务的处理开销为0,它们访问数据库并返回json。也就是说,使用更快的语言访问数据库所获得的收益与使用较慢的语言是无法区分的。所讨论的数据库将决定返回数据的速度,而不是服务器语言,因为数据库实现本身将用c++等低级语言编写。这是真的吗?Elixir + Postgresql会比Go + Postgresql慢吗?或者Ruby + Postgresql?是瓶颈是Postgresql还是语言发出请求?)

假设以上两点是正确的,那么对我来说,我有理由在90%的时间里使用Elixir,因为我将获得一个经得起未来流量高峰的服务,因为它通常具有与任何其他数据库检索Rest api相同的执行速度。

另外10%的服务需要处理器速度,比如图像识别服务,我会在c++或Python中实现,因为它已经在c++中实现了用于图像识别的库(如Tensor Flow)。

这是考虑何时为微服务使用特定语言的正确方法吗?如果没有,除了开发时间,我还应该考虑什么?

假设以上两点是正确的,那么我就有理由认为我会在90%的时间里使用Elixir[…]

说这些话的时候要小心!它们诱使您选择您在设置新服务时总是选择的东西,而实际上您应该考虑该服务应该做什么以及哪些语言和框架可以最好地帮助您实现它!也就是说:你的两个前提是正确的!数据库命中是最昂贵的操作,并发是处理较大负载时的重要工具。它们是正确的,但并不完整:您可能还需要考虑其他条件,如资源消耗、平台的调度行为等。

关于语言的计数:托管语言(例如所有基于JVM或。net运行时的语言)总是意味着一定的静态开销,因为它们需要做垃圾收集,或者需要在运行时编译代码,运行时的动态类型推断,反射等。这意味着,他们将需要更多的内存和CPU周期从您的机器比其他语言,如c++, GO, Rust和类似的。

当你必须用c++这样的语言自己做内存管理时,像GO、D和Rust这样的语言试图为完全托管的语言/运行时(如JVM或。net)提供一个中间路线。

与语言/运行时的选择同等重要的是你的体系结构。所有涉及到经典数据库的东西都可能会给您带来伸缩性方面的麻烦,所有触及磁盘的东西都会在负载下杀死您!

那么我的建议是什么?记住所有的变量(请求延迟不是唯一的指标!资源消耗也可能是一个杀手!),选择最好的语言和工具链,无论你的服务有什么目的,以实现和验证不同的体系结构!

最新更新