始める前に、私が誰なのか、そしてなぜそれがこの場(chǎng)合重要なのかについて少し説明します。私は Notebook Manufacturing Company のソフトウェア開発者で、過去 2 年間ここで働いています。私が現(xiàn)在いるチームでは、私が唯一の開発者で、データ パイプライン、自動(dòng)化、Go と Grafana を使用した監(jiān)視システムの作成、監(jiān)視、保守を擔(dān)當(dāng)しています。
もう一つ付け加えさせていただくと、前年、私はインターンをしていました。そして私は獨(dú)學(xué)です。
わかりましたが、なぜそれが重要なのでしょうか?
そうですね、私には上級(jí)開発者もいなかったし、自分だけでは解決できない障害や問題に直面したときに私を?qū)Гい皮欷雰?nèi)部からの指導(dǎo)もありませんでした。それが私がこの記事を書いている主な理由です。とても楽しかったのでシェアしたいと思います。それは素晴らしいソフトウェアや畫期的なものではありませんが、物事をゼロから構(gòu)築することが可能であることを思い出させてくれます。 100 萬人に 1 人の 10x 開発者である必要はありません。
追伸: ちなみに私は neovim を使っています。
100萬行
この數(shù)字は誇張か何かのように見えるかもしれません、そして、そうであってほしいと思いますが、そうではありません。ほら、製造業(yè)のコンテキストで作業(yè)する場(chǎng)合、部品ごとに多くの製造キューのすべてのポイントを追跡する必要があるときに、必要なアイテムの數(shù)と、それによって生成されるデータの量が考慮されないことがあります。
それが小さなネジであっても、前世代の CPU であっても、タイムスタンプを使用して追跡する必要があります!
つまり、はい、生成されるデータの量は適切であり、それは単なる始まりにすぎません。 (私の観點(diǎn)から) この問題をクールにしているその他の優(yōu)れた點(diǎn)は次のとおりです:
- このデータのソースは圧縮などされていなかったため、平均リクエスト時(shí)間は良い日でも 2 ~ 3 分近くかかりました。ソースに遅れがあると、5 分以上かかる可能性があります (私よりも古い Java システムです)。
- 形式については、XML 応答を処理するか CSV 応答を処理するかを選択できましたが、もちろん CSV を選択しました。私はマゾヒストではありません。
- また、データを取得する間隔を最低 1 時(shí)間で選択する必要がありました (いいえ、理由はわかりません。はい、マイナーな間隔を試してみました)。
- ソースには遅延読み込みやキャッシュ システムがなかったため、2 つの等しいリクエストは異なる時(shí)間で同じ応答を生成します。
- そして最後に、事態(tài)をさらに盛り上げるために、これは SQL Server Reporting Services として知られる Microsoft の製品であり、獨(dú)自のあいまいな注意事項(xiàng)があります。ああ、データベースは MSSQL を使用する必要があるのですが、これが面倒です。
これが全體のコンテキストです。ここから楽しい部分が始まります。
最初の反復(fù) - DMP
私がソフトウェアに取り組む方法は非常にシンプルです。醜くてほとんど機(jī)能しないものにします ->見た目はそのままにして機(jī)能を改善 ->まだ醜いですが、より最適化されています ->美しく、最適化され、機(jī)能します ->そして、マネージャーは、あなたの仕事があまりにも優(yōu)れていたため、ソースがそれを処理できず、機(jī)能停止が発生したと言いました。 FML.
とにかく、DMP は Dumb Mode Protocol の略です。できる限り愚かな方法で動(dòng)作させるだけです。つまり、かろうじて動(dòng)作するようにすることを意味します。
そのため、最初のラウンドでは、私の目標(biāo)は単純で、認(rèn)証、リクエストの作成、データの解析、データベースへの送信でした。とてもシンプルですよね?そして、紙面では、使用しなければならなかった認(rèn)証および認(rèn)可方法が ntlmssp であることを発見するまで、そうでした。これは、存在を知らなかったチャレンジ/レスポンス認(rèn)証方法である ntlmssp でした。実際のところ、それを見つけるにはレガシー .NET 4 コードを使用する必要がありました。 C# をやったことがありません。
私よりも古いレガシーコードを調(diào)べた後、コードを理解するのに苦労しました。なぜなら、コードを書いた人は、何らかの理由で、それを抽象化、コンストラクター、および OOP の 5 層に隠すのが良い考えだと考えたからです。楽しくない、謙虛な経験。そして、それを機(jī)能させました。 1 時(shí)間後、どうやら送信元にレート制限があるため、ユーザーがブロックされました。ただし、キャッシュや遅延読み込みはありません。
すべてが終わったら、クエリ パラメータを渡してデータを取得するだけで済み、ソースを複雑にする必要はありません。わかりました。クエリ パラメーターのドキュメントを調(diào)べてみましょう。
...
この時(shí)點(diǎn)では、すべてのことを考慮すると、おそらくあなたの推測(cè)は正しかったでしょう。ドキュメンテーション?これはシリコンバレーでのみ提供されるある種のエキゾチックな食べ物ですか?
とにかく、知恵を絞った結(jié)果、この SQL Server Reporting Services のサイト/インターフェイスを検査することにしました。そして、嬉しいことに、そして憎しみにも、フィルターとその値を知る方法があったのです。
ページ內(nèi)の (「すべて」) フィルターで、たとえばすべての製造ラインを選択することは、すべてのボックスをチェックすることを抽象化したものにすぎないことだけがわかります。 OK、フィルターをコピーしてクエリ文字列に入れ、エンコードして満足しましょう!
うまくいきました!あるいはそう思いました。
ユーザーがブロックされたと私が言ったことを覚えていますか?そうですね、そのようなタスクを?qū)g行するための管理者権限があり、経営幹部からその実行を許可されている (実際、それは経営幹部から要求されています) だけでは、複數(shù)の要求を?qū)g行するには十分ではなかったようです。ユーザーはブロックされましたが、マネージャーにとっては「何も起こらなかった」と言っているのと同じでした。幸いなことに、私はかなり早くブロックを解除することができました。
それまでの間、私はこのプロジェクトの殘りの部分にどのように取り組むかを検討することにしました。この時(shí)點(diǎn)で私はすでにそのサンプルを持っており、それは投稿のタイトルどおりのものでした。 7 桁を見て、このデータ量を扱った経験がまったくなかった私にそれができるかどうか自問しました。
自分のアイデアを形にするために、excalidraw に參加して、やりたいことをデザインしました。ワーカー プールの概念は知っていましたが、これまで実裝したことはありませんでした。そこで、それについて読んで、いくつかの実裝を見て、非常に助けてくれた友人に尋ねました。彼は私にいなかった先輩です。
疑似コードで書き出した後、次のように思いました。
「おお、これはなかなかいいですね。これらすべてのチャネルとゴルーチンでメモリ リークが発生することは確実にありませんね?」
わかりました、その言葉通りではなかったかもしれませんが、その通りでした。最初の反復(fù)を?qū)g行し、(ブロックされることなく) リクエストを処理し、メモリにロードした後、ワーカー プールの概念を適用しました。
そしてBSODに直面しました。面白いことに、それはクラウドストライクのストライキと同じ日でした。私はまさか自分が工場(chǎng)に大規(guī)模な停止を引き起こしたとは思っていませんでした。
もちろん、仕事には Windows を使用する必要がありますが、心配する必要はありません。 WSL2を使用しています。
最初のスタック オーバーフローの膨大なスタック トラックを調(diào)べた後、間違いに気づきました。データをコンシューマ チャネルに送信するときに、主に主キーの違反、または単にエラーを適切に処理していなかったことが原因で、一部のデータでエラーが発生する可能性があることを考慮していませんでした。
教訓(xùn)として、エラー チャネルを使用して重大な問題を回避してください。そして、単純な文字列チェック (醜いですが機(jī)能します) を介してエラーを処理するか、単にトップレベルでログを記録するだけで、満足することができます。直面したエラーは重大なものではなかったので、続行することができました。
2 回目の反復(fù)。メモリリーク。
このステップで発生したメモリ リークの量を見て、C を?qū)g行しているのではないかと思いました。しかし、それは単なる大きなスキルの問題でした。
とにかく、あなたは次のように考えているかもしれません。
「このような単純なプロセスで、どのようにしてメモリ リークが発生したのですか?」
それは簡(jiǎn)単です。私は學(xué)び、試していました。
このステップでの主な問題は、私が素樸にデータが適切に挿入されていることを確認(rèn)できず、主キーの違反の量が私の記憶を侵害していたことでした。これは解決方法がわかっていた問題です。データをキャッシュしましょう!
待ってください。各行が一意であることを考慮して、各行の一意の識(shí)別子を作成するにはどうすればよいですか?
さて、これは多くの人が私を笑うところでしょう。なぜなら、公平を期すために、それが私を最もイライラさせる部分だからです?,F(xiàn)在の情報(bào)行を単純に結(jié)合してハッシュ関數(shù)に解析すると、そのハッシュがマップ內(nèi)のキーになりました。
「なぜ Redis ではないのですか?」 - あなたは自問しているかもしれません。
それは単純です、官僚主義。小さな會(huì)社ではありません。実際のところ、おそらく皆さんの多くは自社製のラップトップを使用しているでしょう。 Redis インスタンスをリクエストするという単純な行為には、少なくとも 3 営業(yè)日、4 回の會(huì)議、官僚制の神への犠牲、そしてその理由と方法を説明する完全な文書が必要になります。
そうですね、単純なハッシュ マップを使用して、最初の実行前に事前初期化しましょう。全體的な読み込み時(shí)間は長くなりますが、リクエストよりも早くなります。
そうすることで、新しいモーターを持ったかのように全體的なプロセスが改善され、メモリリークが停止し、バッチが毎回失敗することもなくなり、エラーや切斷の量も減少しました。とても良いことですよね?そうですよね?
もう、何かがごちゃ混ぜになっていることがわかります。
3回目の反復(fù)。人生は良いものかもしれない。
私が考慮していなかった點(diǎn)の 1 つは、バッチ挿入を行うことでデータが検証されるという事実でした。流れを簡(jiǎn)単に表すと次のようになります。
データの取得 ->データのハッシュがハッシュマップに存在するかどうかを確認(rèn)します。バッチ&挿入
それで、何が問題なのでしょうか?では、バッチ內(nèi)の 1 つの挿入が失敗した場(chǎng)合はどうなるでしょうか。エントリなしで再試行されるのでしょうか?その場(chǎng)合、システムを混亂させたり、ワーカー プール実裝の利點(diǎn)を失わずに、どれくらいの再試行を行うことができますか?
それを知る方法はたった一つ!確認(rèn)してみましょう。
1 つ追加できる點(diǎn)は、このソースが 25 列を超える列を返したという事実です。そのため、MSSQL の制限である 2100 パラメーターを超えないよう、バッチごとに挿入するデータの量に注意する必要がありました。
この時(shí)點(diǎn)で、私はすでに、限られたリソースで実稼働スペースを模倣する Docker コンテナーで物事を?qū)g行していました。コンテキストを追加するために、このプロセスは 1 GB の RAM と約 0.5 CPU で実行されました。もっと多くのリソースを割り當(dāng)てることもできましたが、それは単に強(qiáng)引なやり方になってしまいます。
この新しい反復(fù)をコンテナー內(nèi)で実行し、いくつかのタイムスタンプを追加し、後で分析するためにファイルにログアウトします。再試行の量により、約 5 分増加することがわかりました。これは機(jī)能しません?!弗扩`ティ」エントリを削除するという選択肢はありませんでした。
4 回目の反復(fù)。人生は良いものです。
この問題を解決するために、労働者の數(shù)を増やしました。私は約 50 人ほどのワーカーを使用していましたが、ThePriimagen の最上位にいる Discord ユーザーのランダムな推測(cè)のおかげで、ワーカーを 1000 人に増やし、各ワーカーがトランザクション內(nèi)の各エントリを検証するようにしました。トランザクションが失敗した場(chǎng)合は、単にロールバックしました。
そうすることで、中心的な問題を解決し、このプロセス全體の速度を全體的に向上させることができました。今度は、それを prod に入れて監(jiān)視するときが來ました。なぜなら、prod ゴブリンがソフトウェアを混亂させる可能性があるからです。 (スキルの問題とも呼ばれますが、この名前は禁止されています。)
このシステムのフェッチ間隔を減らすことが要求され、ほぼリアルタイム (つまり、遅延に気付かないほど十分な速度) にすることが要求されることを知って、今回はもう少し堅(jiān)牢な新しいコンテナを作成しました。負(fù)荷に耐えられるかどうかを確認(rèn)し、間隔を 3 分に設(shè)定します。平均フェッチ?xí)r間を考慮すると、多少の重複はあるかもしれませんが、実際にどうなるか見てみたかったのです。
一晩実行し、後で確認(rèn)するために結(jié)果をログに記録しました。そして驚いたことに、勤務(wù)時(shí)間が終了する前にマネージャーから電話を受けました。言っておきますが、彼は技術(shù)者などではありません。
「ねえ、[私が公開できないシステム名] と対話するものを「私たち」は導(dǎo)入しましたか?」
「はい、リクエストに応じてリアルタイムでデータ取得システムを?qū)毪筏蓼筏?。なぜです?」
「うーん、止めてもらえますか? 停電が発生したため、ここでは作業(yè)できません。」_
これは、ギャディとレントルマン、まったく別のレベルの畫期的な製品です。文字通り、20 以上の生産ラインを 1 分間ほど停止しました。とにかく、システムを停止したところ、すべてが正常に戻りました。
翌日、取得の間隔を 3 分ではなく 30 分に増やすように言われました。まあ、大丈夫でしょう。噓はつきません。最高速度でのパフォーマンスを見ることができなくなるのは少し殘念でしたが、少なくとも、うまく機(jī)能するようになりました。
この新しいシステムにより、このデータを使用したレポートの平均更新時(shí)間は 8 ~ 10 秒に短縮され、その結(jié)果、管理者によって同じソースのレポートが同様に要求されることが多くなりました。良い仕事には、より多くの仕事が與えられます!
考慮事項(xiàng)
それは主に、Go が実際にどれほど強(qiáng)力であるかを?qū)g感させられたという事実により、楽しい経験でした。 Google Chrome よりも少ないメモリ、Microsoft アプリよりも少ないストレージ、Windows 電卓よりも少ない CPU パワーを使用して、文字通り総當(dāng)たりで処理を進(jìn)めていた古いプロセスを改善することができました (文字通り、挿入前にデータベース內(nèi)の各行をチェックしていました。前の人がそれが良いアイデアだとどう考えたのかはわかりません。)本當(dāng)に楽しかったです
とにかく、このプロセス全體を通してあなたの考えを自由に共有してください。どのようにアプローチするか、別の方法で何をしただろうか。私には開発者の同僚がいないので、それについての意見をもっと知りたいです。
以上がリクエストごとのエントリの処理方法 - Go! を使用しての詳細(xì)內(nèi)容です。詳細(xì)については、PHP 中國語 Web サイトの他の関連記事を參照してください。

ホットAIツール

Undress AI Tool
脫衣畫像を無料で

Undresser.AI Undress
リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover
寫真から衣服を削除するオンライン AI ツール。

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡(jiǎn)単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中國語版
中國語版、とても使いやすい

ゼンドスタジオ 13.0.1
強(qiáng)力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

Golangは主にバックエンド開発に使用されますが、フロントエンドフィールドで間接的な役割を果たすこともできます。その設(shè)計(jì)目標(biāo)は、高性能、同時(shí)処理、システムレベルのプログラミングに焦點(diǎn)を當(dāng)てており、APIサーバー、マイクロサービス、分散システム、データベース操作、CLIツールなどのバックエンドアプリケーションの構(gòu)築に適しています。 GolangはWebフロントエンドの主流言語ではありませんが、Gopherjsを介してJavaScriptにコンパイルしたり、Tinygoを介してWebAssemblyで実行したり、テンプレートエンジンを備えたHTMLページを生成してフロントエンド開発に參加できます。ただし、最新のフロントエンド開発は、JavaScript/TypeScriptとそのエコシステムに依存する必要があります。したがって、Golangは、コアとして高性能バックエンドを備えたテクノロジースタック選択により適しています。

GOでGraphQlapiを構(gòu)築するには、GQLGenライブラリを使用して開発効率を向上させることをお?jiǎng)幛幛筏蓼埂?1.最初に、スキーマに基づいた自動(dòng)コード生成をサポートするGQLGENなどの適切なライブラリを選択します。 2。次に、graphqlschemaを定義し、投稿の種類やクエリメソッドの定義など、API構(gòu)造とクエリポータルを説明します。 3。次に、プロジェクトを初期化し、基本コードを生成して、リゾルバにビジネスロジックを?qū)g裝します。 4.最後に、graphqlhandlerをhttpserverに接続し、組み込みの遊び場(chǎng)を介してAPIをテストします。メモには、プロジェクトのメンテナンスを確保するためのフィールドネーミング仕様、エラー処理、パフォーマンスの最適化、セキュリティ設(shè)定が含まれます

GOをインストールするための鍵は、正しいバージョンを選択し、環(huán)境変數(shù)を構(gòu)成し、インストールを検証することです。 1.公式Webサイトにアクセスして、対応するシステムのインストールパッケージをダウンロードします。 Windowsは.msiファイルを使用し、macosは.pkgファイルを使用し、Linuxは.tar.gzファイルを使用し、 /usr /localディレクトリに解凍します。 2.環(huán)境変數(shù)を構(gòu)成し、linux/macOSで?/.bashrcまたは?/.zshrcを編集してパスとgopathを追加し、Windowsがシステムプロパティに移動(dòng)するパスを設(shè)定します。 3.政府コマンドを使用してインストールを確認(rèn)し、テストプログラムを?qū)g行してhello.goを?qū)g行して、編集と実行が正常であることを確認(rèn)します。プロセス全體のパス設(shè)定とループ

sync.waitgroupは、ゴルチンのグループがタスクを完了するのを待つために使用されます。そのコアは、3つの方法で協(xié)力することです。追加、完了、待機(jī)です。 1.ADD(n)待機(jī)するゴルチンの數(shù)を設(shè)定します。 2.done()は各ゴルチンの端で呼び出され、カウントは1つ減少します。 3.wait()すべてのタスクが完了するまでメインコルーチンをブロックします。使用する場(chǎng)合は、注意してください。Goroutineの外部で追加する必要があります。重複を避け、Donが呼び出されていることを確認(rèn)してください。 Deferで使用することをお?jiǎng)幛幛筏蓼埂¥长欷?、Webページの同時(shí)クロール、バッチデータ処理、その他のシナリオで一般的であり、並行性プロセスを効果的に制御できます。

Goの埋め込みパッケージを使用すると、靜的リソースをバイナリに簡(jiǎn)単に埋め込み、Webサービスに適しており、HTML、CSS、寫真、その他のファイルをパッケージ化できます。 1。追加する埋め込みリソースを宣言します// go:embed comment hello.txtを埋め込むなど、変數(shù)の前に埋め込みます。 2。static/*などのディレクトリ全體に埋め込み、embed.fsを介してマルチファイルパッケージを?qū)g現(xiàn)できます。 3.効率を改善するために、ビルドタグまたは環(huán)境変數(shù)を介してディスクロードモードを切り替えることをお?jiǎng)幛幛筏蓼埂?4.パスの精度、ファイルサイズの制限、埋め込みリソースの読み取り専用特性に注意してください。埋め込みの合理的な使用は、展開を簡(jiǎn)素化し、プロジェクト構(gòu)造を最適化することができます。

オーディオとビデオ?jiǎng)I理の中核は、基本的なプロセスと最適化方法を理解することにあります。 1.基本的なプロセスには、取得、エンコード、送信、デコード、再生が含まれ、各リンクには技術(shù)的な困難があります。 2。オーディオおよびビデオの異常、遅延、音のノイズ、ぼやけた畫像などの一般的な問題は、同期調(diào)整、コーディング最適化、ノイズ減少モジュール、パラメーター調(diào)整などを通じて解決できます。 3. FFMPEG、OPENCV、WeBRTC、GSTREAMER、およびその他のツールを使用して機(jī)能を達(dá)成することをお?jiǎng)幛幛筏蓼埂?4.パフォーマンス管理の観點(diǎn)から、ハードウェアの加速、解像度フレームレートの合理的な設(shè)定、並行性の制御、およびメモリの漏れの問題に注意を払う必要があります。これらの重要なポイントを習(xí)得すると、開発効率とユーザーエクスペリエンスの向上に役立ちます。

GOで書かれたWebサーバーを構(gòu)築することは難しくありません。コアは、Net/HTTPパッケージを使用して基本サービスを?qū)g裝することにあります。 1. Net/HTTPを使用して最もシンプルなサーバーを起動(dòng)します。処理機(jī)能を登録し、數(shù)行のコードを介してポートをリッスンします。 2。ルーティング管理:Servemuxを使用して、構(gòu)造化された管理を容易にするために複數(shù)のインターフェイスパスを整理します。 3。共通の実踐:機(jī)能モジュールによるグループルーティング、およびサードパーティライブラリを使用して複雑なマッチングをサポートします。 4.靜的ファイルサービス:http.fileserverを介してHTML、CSS、JSファイルを提供します。 5。パフォーマンスとセキュリティ:HTTPSを有効にし、リクエスト本體のサイズを制限し、セキュリティとパフォーマンスを改善するためのタイムアウトを設(shè)定します。これらの重要なポイントを習(xí)得した後、機(jī)能を拡大する方が簡(jiǎn)単になります。

Select Plusのデフォルトの目的は、他のブランチがプログラムブロッキングを避ける準(zhǔn)備ができていない場(chǎng)合にデフォルトの動(dòng)作を?qū)g行できるようにすることです。 1.ブロックせずにチャネルからデータを受信すると、チャネルが空の場(chǎng)合、デフォルトのブランチに直接入力されます。 2。時(shí)間と組み合わせて。後またはティッカー、定期的にデータを送信してみてください。チャネルがいっぱいの場(chǎng)合、ブロックしてスキップしません。 3.デッドロックを防ぎ、チャネルが閉じられているかどうかが不確かなときにプログラムが詰まっていることを避けます。それを使用する場(chǎng)合、デフォルトのブランチはすぐに実行され、亂用することはできず、デフォルトとケースは相互に排他的であり、同時(shí)に実行されないことに注意してください。
