我重用 http 客户端连接来对单个端点进行外部调用。该程序的摘录如下所示:var AppCon MyAppfunc New(user, pass string, platformURL *url.URL, restContext string) (*MyApp, error) { if AppCon == (MyApp{}) { AppCon = MyApp{ user: user, password: pass, URL: platformURL, Client: &http.Client{Timeout: 30 * time.Second}, RESTContext: restContext, } cj, err := cookiejar.New(nil) if err != nil { return &AppCon, err } AppCon.cookie = cj } return &AppCon, nil}// This is an example only. There are many more functions which accept *MyApp as a pointer.func(ma *MyApp) GetUser(name string) (string, error){ // Return user}func main(){ for { // Get messages from a queue // The message returned from the queue provide info on which methods to call // 'm' is a struct with message metadata c, err := New(m.un, m.pass, m.url) go func(){ // Do something i.e c.GetUser("123456") }() }}我现在需要建立与通过队列消息接收的不同端点/凭据的客户端连接。我预见的问题是我不能简单地AppCon使用新的端点详细信息进行修改,因为MyApp返回了指向的指针,从而导致重置c. 这可能会影响对非预期端点进行 HTTP 调用的 goroutine。重要的是,该程序并不意味着知道端点(我正在考虑使用switch语句),而是通过队列消息接收它需要的东西。鉴于我提出的问题是正确的,有没有关于如何解决它的建议?
1 回答
不负相思意
TA贡献1777条经验 获得超10个赞
免责声明:这不是对您问题的直接回答,而是试图引导您找到解决问题的正确方法。
尽量避免为您使用单例模式
MyApp
。此外,New
具有误导性,它实际上并不是每次都创建一个新对象。相反,您可以每次都创建一个新实例,同时保留 http 客户端连接。不要使用这样的结构:
AppCon == (MyApp{})
,有一天你会在你的腿上这样做。改为使用指针并将其与nil
.避免竞争条件。在您的代码中,您启动一个 goroutine 并立即进行
for
循环的新迭代。考虑到您重用整个MyApp
实例,您基本上引入了竞争条件。使用 cookie,您可以使连接有点有状态,但您的任务似乎需要无状态连接。这种方法可能有问题。
- 1 回答
- 0 关注
- 73 浏览
添加回答
举报
0/150
提交
取消