我正在努力更好地了解服务器语言/框架及其在微服务环境中使用的潜在优势和劣势。开发时间对我来说并不重要,因为这是我自己的个人项目,学习使用正确的工具解决问题对我来说比构建服务所需的开发时间更重要。
我越是想到它,我越认为Elixir应该在90%的时间内使用。原因有两个:
1)并发意味着许多用户可以无误地点击服务
2)大多数微服务都有0个处理开销,它们命中数据库并返回一个json。即使用更快的语言命中数据库所带来的收益与使用较慢的语言无法区分。有问题的数据库将确定返回数据的速度,而不是服务器语言,因为数据库实现本身将用较低的语言(如C ++)编写。 (这是真的吗?Elixir + Postgresql会明显慢于Go + Postgresql吗?甚至Ruby + Postgresql?瓶颈是Postgresql还是提出请求的语言?)
假设上述2是真的,那么我有理由相信,我会在90%的时间内使用Elixir,因为我会获得一个面向未来的流量峰值服务,因为它通常具有相同的速度执行任何其他数据库检索Rest API。
另外10%的时间服务需要处理器速度,如图像识别服务,然后我将用C ++或Python实现,因为它已经在C ++中实现了用于图像识别的库(即Tensor Flow)。
这是考虑何时使用特定语言进行微服务的正确方法吗?如果没有,除了开发时间,我还应该考虑什么?
答案 0 :(得分:0)
假设上述2是真的,那么我有理由认为我会在90%的时间内使用Elixir [...]
制作这些陈述时要小心!他们会诱使您选择在设置新服务时总是选择的东西,实际上您应该考虑该服务应该做什么以及哪些语言和框架可以帮助您最好地实现这一目标!那说:你的两个前提是真的!数据库命中率是最昂贵的操作,并发性是处理更大负载时的重要工具。它们是真实的但不完整:您可能需要考虑其他条件,如资源消耗,平台的调度行为等。
关于语言的数量:托管语言(例如基于JVM或.NET运行时的所有内容)总是意味着一定的静态开销,因为他们需要进行垃圾收集,或者他们需要随时随地编译代码,动态在运行时输入类型,反射等。这意味着,与其他语言(如C ++,GO,Rust等)相比,它们需要更多的内存和CPU周期。
虽然您必须自己使用C ++等语言进行内存管理,但GO,D和Rust等语言试图为完全托管的语言/运行时(如JVM或.NET)提供中间立场。
至少与您在语言/运行时中的选择一样重要的是您的架构。所有涉及经典数据库的东西都可能会让你在扩展方面遇到麻烦,所有击中磁盘的东西都会在负载下杀死你!
那么我的建议是什么?记住所有变量(请求延迟不是唯一的指标!资源消耗也可能是一个杀手!),选择最好的语言和工具链,以满足您的服务满足和验证不同架构的任何目的!