我有一个用golang编写的应用程序,它会将基本数据加载到全局变量中,这样可以使应用程序响应速度快,并导出一个http接口(interface)来在用户对数据库进行更改时更新变量。
但是我部署了另一台服务器,并使用了代理。出现了一个问题,当用户向更新 url 发送 http 请求时,它会将流量加载到其中一台服务器。因此该服务器更新此 var,但其他服务器不更新。
比如utils.go:
package utils
var BasicDatas map[string]*MyModel
func UpdateVar(){
// do some work
}
func PreLoadVar(){
// preload data to basicDatas
}
和 main.go
package main
import(
"codebase/utils"
)
func main(){
utils.PreLoadVar()
}
那么是否可以在多主机之间共享 var?或者任何图书馆都可以帮助完成这项工作?
Nsq.io 似乎是个不错的选择,但如果有的话,我想找一个更简单的。 谢谢:)
最佳答案
您的全局变量是 caching 的一种非常简单的形式,众所周知,当您在多台服务器上运行您的应用程序时会出现问题。有几种方法可以解决此问题:
- 正如 Bill Nelson 所建议的那样:将您的数据库用作中央存储,并且根本不要在您的应用程序中缓存您的数据。
- 使用简单的键值存储将缓存外部化,例如使用 Redis连同 many Redis clients in Go 之一.
- 使用分布式缓存,例如 groupcache .
如果您手上有太多时间,您可以使用像 nsq 这样的消息传递解决方案来实现您自己的分布式缓存,但我建议不要这样做 - 这不是一个简单的问题。
关于memory - 使用 Go 在主机之间共享变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26263057/