如果Go应用程序找不到外部依赖项/服务,应该会发生混乱

时间:2018-03-06 13:31:58

标签: go

Golang应用程序应如何处理缺少的外部依赖项? 当一个应用程序启动并且找不到数据库时,它应该保持数据的持久性,知道应用程序在该状态下无用,我是否应该惊慌失措?

我可以无限地记录某些东西,打印到stderr,或使用其他方法通知,但我不确定何时选择每种方法。

2 个答案:

答案 0 :(得分:1)

以下是Go标准库中的一个示例。

  

Package crypto

import "crypto" 
     

func (Hash) New

func (h Hash) New() hash.Hash
     

New返回一个新的hash.Hash计算给定的哈希函数。新   如果散列函数没有链接到二进制文件,则会发生混乱。

答案 1 :(得分:1)

无法访问外部网络服务的应用程序不应该出现紧急情况。这应该是预期的,因为网络往往会失败。我会将错误包装起来并进一步传递。

请考虑以下情形。您有多个应用程序服务器连接到两个数据库服务器您正在一次升级一个数据库服务器。当一个人关闭时,一半的应用程序服务器惊慌失措并崩溃。升级第二个数据库服务器,现在每个应用程序服务器都已消失。相反,当数据库不可用时,只需报告错误,例如通过发送HTTP状态500.如果您有负载均衡器,它会将请求传递给正在运行的应用程序服务器。当数据库服务器恢复时,应用程序服务器将重新连接并继续工作。

另一种情况是,您正在运行一个处理数据库以创建报告的交互式应用程序。该连接不可用。应用程序惊慌失措并坠毁。从用户的角度来看,它看起来像一个bug。我希望有一条消息说无法建立连接。

在标准库中,当内部资源不可用时,可以接受恐慌。见template.Must。这意味着应用程序本身出了问题。