为什么Golang现在还不能用于构建企业系统的原因 - Dmitry


企业应用程序是一个长期可靠的系统,具有许多可持久保存许多年的数据。如今,Golang世界不太可能提供以建立企业系统的方式构建任何系统。
下图是Martin Fowler定义的企业系统:

 
错误处理差
Golang在错误处理方面提供了更大的自由度。由于缺乏开发人员的责任,通常会导致应用程序中的错误处理不佳。
最流行的情况与sql查询的执行有关:

defer rows.Close() // omitted errors from sql driver

Go中没有明确的方法来处理此返回的错误。实际上,go语言提供了捕获错误的特定方法:

result, err := foo()

错误是典型的返回值,却会通过多种方式被忽略:

defer rows.Close() // omitted errors from sql driver
defer body.Close()
// omitted IO errors
result, _ := foo()
// omitted errors from foo function

此外,这会导致在紧急函数调用后立即导致应用程序崩溃的风险增加,并且通常会降低可靠性。

根据M.Nygard的“发布它release it!”,可靠的系统必须处理每个不重要的错误而不会崩溃。没有权衡。

作为解决方案,我们可以使用其他语言的try/catch/finally结构添加可靠的机制,但是需要移除panic函数。当然,这将是一种较慢的方法,但更可靠。
 
编写手动组合SQL查询
Golang中处理数据库查询的典型方法是手动编写查询。如果SQL查询被手工编写的,那么数据库的整合将是一个瓶颈。并非所有开发人员都擅长SQL和使用数据库。诸如Hibernate(Java)和Entity Framework(.NET)之类的功能齐全的ORM生成的典型查询已开放,用于数据库和缓存数据优化。这是根据“Release原则”来编写可靠的应用程序的最有效方法之一。
有些库将来可能是功能齐全的ORM(例如GORM和XORM)。我相信,与手工编写的SQL查询相比,它们将来会更受欢迎。
 
重新发明轮子
通常,golang开发人员都在选择重新发明轮子。这种行为无处不在:任务计划程序,迁移工具,记录器,工作池,使用十进制数字的库,授权库和其他工具。

它们没有经过良好的测试,没有充分的文档记录并且在生产中使用不足。风险太大,无法在企业应用程序中使用它们。

为了减少有风险的编程代码的数量,足以检查现有库中是否有可用的解决方案。例如,您可以使用目录awesome-go
 
生态系统
Go生态系统包括Consul, Kubernetes, Zipkin 和Træfik,它是一个非常年轻且发展迅速的技术栈,没有公认的使用标准。

golang生态系统中没有工具可以帮助构建可靠的企业系统。

考虑到以上所有内容,我们需要非常谨慎地将第三方中间件集成到基础架构中,并且公司必须在此中间件中具有足够的专业知识以支持流程。否则,它将成为具有不同技术的生产环境中的雷区。好消息是,市场上有许多管理解决方案可在使用Golang生态系统时最大程度地降低风险。不幸的是,它很昂贵。
Go生态系统还太年轻,缺乏工具和编程文化, 但我相信将来它将成为一个拥有伟大人才的伟大生态系统。语言社区正在朝着正确的方向努力:性能和简化。但是我们不能忘记可靠性也很重要。我们越早了解可靠性的价值,我们就会越快地在Golang中编码更多的企业系统。
 
再次强调:

  1. 只是我的看法
  2. 无关我的技能
  3. 无关我的狗
  4. 无关“为什么我的狗在其企业狗系统中不需要使用Golang”
  5. 不是关于Golang的最佳编码实践
  6. 与处理go错误有关的最佳实践无关
  7. 不是关于如何以正确的方式选择正确的工具
  8. 一般而言,与Golang设计无关
  9. 不是断言“没有人可以将Go用于企业系统”
  10. 不是断言“没有人需要将Go用于企业系统”

正如我所观察到的,这涉及将Golang用于企业的风险(我的意思是指更多的文化和生态系统方面问题,而不是对语言设计指指点点)。这些都是我个人看法。
当然,像Google和Netflix这样的许多大公司在企业中都使用Golang,在我看来也存在风险,当然其他开发人员可以有他的观点和他的经验。
本文的主要目的是进行讨论,看看有多少人有相同的看法。

参考:Go语言中用于错误处理的Defer、Panic和Recover