GoでWebアプリケーションを作成する際のいくつかの欠陥

興味がある場合、ハブにあるすべてのGo Webアプリケーションの問題は何ですか? Go Webアプリケーションを本番環境に一歩近づかせるための方法を知りたい場合は、catへようこそ。



Go Webプログラミングの重要な違いは、結果として、通常はWebサーバーであるプログラムを取得することです。 したがって、Webサーバーが通常応答するものに対して責任を負うことになります。



Hello WorldがPHPとGoでどのように見えるかを比較すると、



Php


<?php echo “Hello World”; ?>
      
      





行く


 package main import ( "fmt" "net/http" ) func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:]) } func main() { http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil) }
      
      





Go言語サイトwikiから取得



ハブに関する次の記事でも同じコードが使用されています: GoでのWeb開発、GoのWebターミナルエミュレーターの作成Websocket を使用した Goblog:Goでのブログ用の自家製静的エンジン、GoでのWebアプリケーションの作成



私自身の記事「 私の認証局-5つのOpenSSLチーム」では、Goで同様の例を挙げました。



関連: 言語を移動します。 小さなクライアント/サーバーアプリケーションGo上のTCP / IPプロキシ



Goの重要な違いと利点は、Goがネットワークでどのように機能し、たとえば、長いポーリングを実装するために多くのオープン接続を保持できることです。



異なる言語/プラットフォームの記事C10k(問題10,000接続)で、 GoはErlangに続いて2番目の結果を示し、10,000から9,775の接続を開きました。



Goの2番目の利点は、コードのシンプルさと読みやすさ、学習の容易さです。これにより、多くのオープン接続で作業する必要があるアプリケーションを開発する際に、No。1の選択肢になります。



エラーこれらすべての例欠陥



欠点は、接続のタイムアウト(期限)がデフォルトで0であることです(つまり、タイムアウトはまったく設定されていません)。 クライアントが接続が閉じられたというパケットを送信しない場合、そのような接続は永久にハングします。 これにより、Webサーバーの寿命が終わるまで、スタンバイモードのゴルーチンがブロックされます。 通常、開いている接続リソースの数は制限されています。 デフォルトでは、Linuxでは、アプリケーションは1024個のファイルを開くことができます(TCP接続はファイルと同じです)。



これは、次のようにGoで作成されたサーバーを意味します



 http.ListenAndServe(":8080", nil)
      
      





非閉鎖化合物を徐々に蓄積し、1日おき、1ヶ月おき、または1年おきにそれらの中にownれさせます。



したがって、デフォルトでインストールされるデフォルトのWebサーバーにタイムアウトを設定することが重要です。



例えば



  // log.Fatal(http.ListenAndServe(":8085", nil)) { s := &http.Server{ Addr: ":8085", Handler: nil, ReadTimeout: 1000 * time.Second, WriteTimeout: 1000 * time.Second, MaxHeaderBytes: 1 << 20, } log.Fatal(s.ListenAndServe()) }
      
      





2番目の欠点は、通常のWebサーバーでしばしば表示されるパラメーターであり、Webサーバーが開く準備ができている接続の最大数です。 この制限に達すると、Webサーバーはキープアライブ接続を犠牲にするか、エラーを発生させて接続を閉じ始めます。



Goはデフォルトではこれを行いません。Goで接続数を制限する方法、接続数を計算する方法、またはこのプロセスをさらに制御する方法はまったく明らかではありません。



接続の管理方法を理解するには、 func(* Server)ListenAndServeおよびfunc(* Server)ListenAndServeTLSのソースを調べる必要があります。両方の関数がfunc(* Server)Serve関数を使用していることがわかります。



この関数は、引数としてnet.Listenerインターフェースを受け取ります。

ここで、接続を制限および制御するために実装できます。

net.Listenerインターフェースをラップする例はLimitListenerです



[go]タグを使用してハブの記事を調べたところ、Timeout、DeadLineがインストールされている、または接続数が制御されている例は見つかりませんでした。



Goが超並列のネットワーク言語として作成されたことを考えると、接続を操作する際の適切かつ熟考された戦略の実装は、Goアプリケーションの重要な要素です。



All Articles