興味がある場合、ハブにあるすべての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サーバーにタイムアウトを設定することが重要です。
例えば
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アプリケーションの重要な要素です。