-4

http クライアント接続を再利用して、単一のエンドポイントへの外部呼び出しを行います。プログラムの抜粋を以下に示します。

var AppCon MyApp

func 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 呼び出しを行うゴルーチンに影響を与える可能性があります。些細なことではありませんが、プログラムはエンドポイントを認識しているわけではなく (私はswitchステートメントの使用を検討していました)、キュー メッセージを介して必要なものを受け取ります。

私が指摘した問題が正しいことを考えると、それを解決する方法に関する推奨事項はありますか?

編集1

提供されたフィードバックに基づいて、これで問題が解決すると確信しています。

  1. のシングルトンの使用を削除しますMyApp
  2. MyApp再利用を可能にするhttp クライアントを切り離す
var httpClient *http.Client

func New(user, pass string, platformURL *url.URL, restContext string) (*MyApp, error) {

    AppCon = MyApp{
          user:        user,
          password:    pass,
          URL:         platformURL,
          Client:      func() *http.Client {
      if httpClient == nil {
        httpClient = &http.Client{Timeout: 30 * time.Second}
      }
        return httpClient
    }()
          RESTContext: restContext,
      }

    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)

      // Must pass a reference
      go func(c *MyApp){
        // Do something i.e c.GetUser("123456")
      }(c)
    }
}
4

1 に答える 1