十二要素应用程序后端的默认配置是将其(网络)位置放在环境变量中,例如DB=mysql://user:pw@host/db_name
.
但是,如果您的后端配置更加动态,推荐的方式是什么?在我的情况下,该应用程序可以根据环境使用 1 到 n 个后端。我的想法是使用像 JSON 这样的序列化格式并将其放在一个变量中,例如
DB="{1: 'host:port', 2: 'host:port'}"
这是处理这种情况的更好方法还是更好的选择?
十二要素应用程序后端的默认配置是将其(网络)位置放在环境变量中,例如DB=mysql://user:pw@host/db_name
.
但是,如果您的后端配置更加动态,推荐的方式是什么?在我的情况下,该应用程序可以根据环境使用 1 到 n 个后端。我的想法是使用像 JSON 这样的序列化格式并将其放在一个变量中,例如
DB="{1: 'host:port', 2: 'host:port'}"
这是处理这种情况的更好方法还是更好的选择?
我不知道这是否是“首选”方法,但我认为它会起作用。
您将希望为未来的开发人员记录这种特质,并且可能会在这个不寻常的设置中添加一些指向错误配置的详细错误/日志记录。例如,如果您只想指定一个数据库,则应该清楚无论如何都需要以 quasi-JSON 样式指定。
不过,我认为更多的 12-factor-y 将是在您的服务器之间设置一个中间负载平衡器。这样,您的应用程序可以连接到负载均衡器或单个服务器,而对底层服务的性质几乎没有透明度。
所以而不是:
SetEnv DB {mysql://something@somewhere, mysql://something@somewhereelse}
你将会拥有
SetEnv DB mysql://something@load-balancer
负载均衡器在后台处理多个数据库。
您还可以有一个 2-db 系统,一个用于读取,一个用于写入。读取可以负载平衡并复制master-server
.
SetEnv READ_DB mysql://something@load-balancer
SetEnv WRITE_DB mysql://something@master-server
然后在测试情况下,他们将使用相同的连接字符串:
SetEnv READ_DB mysql://something@load-balancer
SetEnv WRITE_DB $READ_DB # not sure about syntax here