序文
Taobao、Facebook、Meituan、これらの業界の大企業はすべて、初期の頃に PHP から始まりました.PHP は、すぐに使える豊富なオープン ソース プロジェクトの特徴を持っています。B駅も同様です。ステーション B の技術開発の歴史: 最初は PHP 言語で開発され、その後、ステーション B の中間プラットフォームは徐々に Node に占有され、バックグラウンド テクノロジーは次第に Java に近づき、より高い同時実行性、より堅牢性、および大きなデータ分析. これは、Bilibili の技術の全体的な混乱につながっています. 初期の段階では、ステーション B はほぼ毎日のように障害が発生していましたが、チームとビジネスの拡大に伴い、あらゆる面からのプレッシャーが高まり、いたるところで火災が発生しました。コードが混沌とし、フレームワーク構造が混沌としており、メンテナンスが困難な状態にある.その文脈を明らかにする必要がある.そのような状況下で、技術スタックを統一することは、間違いなくやるべきことである. 結局、書き換えが最適な解決策であることがわかりました。なぜ行くのですか?最終的な分析では、バックグラウンド プロジェクトの書き換えは、Bilibili によるテクノロジ スタックの統合の試みです. 最終的に Go が選択された理由については、Go が Bilibili プラットフォームのリファクタリングと最適化のニーズを満たすことができることが非常に重要です; R&D毛建監督自身は、Go 言語の忠実な説教者です。
B駅前街道
ステーション B, 最初にフロントエンドとバックエンドを分離し始めたとき, 最初の方法に従いました. このモデルをまだ使用しているページがいくつかあります. たとえば: www.bilibili.com/account/his... (ウェブサイトのソースコード)。これは、SEO を必要としないページに適した方法です。フロントエンドの開発が完了した後、対応する js と css が webpack を介してパッケージ化され、CDN にアップロードされます。次に、対応するリソースを参照する webpack によってパッケージ化された html ファイルが、専用の静的マシンにアップロードされ、その後、操作とメンテナンスは、ページを転送するようにルーティングを構成します。バックエンドの学生は、対応する API インターフェイスを提供するだけで済みます。フロントエンドとバックエンドを分けてメンテし、自分のペースで進めていくことでページとサービスの結合が減り、
まさにフロントエンドとバックエンドを素早く分離できる方法です。PC 側で vue を使用してリファクタリングし、モバイル H5 側で対応するのに時間がかかりました。進歩は速いですが、欠点はゆっくりと現れています。
最初の画面では、リソースがロードされるのを待ってからレンダリングする必要があるため、最初の画面で白い画面が表示されます. 単一のページであれば問題ありませんが、スパ アプリケーションの場合は、読み込み時間が非常に長くなり、白い画面の時間がユーザーエクスペリエンスに大きく影響し、国内の検索会社はスパアプリケーションとの互換性が低いため、クライアント側のレンダリングは非常にseoに不親切になり、seoが必要なページは緊急です.サービス側のレンダリングの必要性。
(ステーション B のホームページでは、右側のモジュールはサーバー側のレンダリングを行い、左側のモジュールはサーバー側のレンダリングを行わない)。
次に、サーバー側のレンダリングを node に依存することが議題に上ります。
選択
まず、ノードフレームワークを選択します.市場に出回っている主流のフレームワークは3つあり,hapi express koaと,いくつかのパッケージングとカスタマイズを経たeggjsなどのフレームワークがあります.最初からeggjsを除外しました.機能は非常に強力です
.機能がたくさんあり、中にはまったく必要ないものもあり、軽量化されていません. 第二に、eggjs は私にとってブラックボックスです. 何か問題があれば、それを解決するために多額のお金を費やします. 長い間. (しかし、私はまだ多くの場所でeggjsから借りてきました。結局のところ、それは非常に強力です)次に、
残りの3つのフレームワークであるexpressは比較的使いやすく、ドキュメントがより
包括的であるため、expressを選択しました(後でリファクタリングされました) = =!)
次にフロントエンドフレームワークの選択です.フロントエンドフレームワークにはng rvなど主流のフレームワークがたくさんあります.私はreactとvueを使用しています.フロントエンドで同型化できるという利点があります.バックエンドと同じロジックを使用する必要はありません.2つのコピーを書く,それは素晴らしいです
(同型ロジックは多分こんな感じです。)
以前はフロントエンドとバックエンドが分かれていたのでPCはvueでリファクタリングしているので当然、今回はサーバーレンダリングもvueでビルドしてvue ssrを使っています(これも後者のアイデアが土台を築きました)
まず、校正用の簡単なページを選択しましょう、タグページを使用しましょう(神に選ばれた子: www.bilibili.com/tag/3503159 )
B駅Golang技術スタック分析
技術スタック | 技術の選択 | 参照リンク |
---|---|---|
RPC | grpc パッケージに基づくウォーデン フレームワークはオープン ソースです https://github.com/bilibili/kratos | |
HTTP フレーム | gin パッケージに基づくブレード マスター フレームワークは、上記のようにオープン ソース化されています。 | |
サービスの登録と発見 | 初期はzkで、その後徐々にオープンソース化されたSpring CloudシステムEurekaの自己開発発見を指すように変化 https://github.com/bilibili/discovery | |
保管所 | DB、redis、memcache、hbase はいくつかのユーザー kv 情報と履歴レコードを保存します。パッケージ化されたライブラリ library/database/ client ライブラリはオープン ソース https://github.com/bilibili/kratos です。 | |
検索 | Station Bのビデオ、ユーザー、履歴レコードなどはesを使用して検索し、クライアントは基本ライブラリlibrary/database/elasticにカプセル化されています | |
小さなファイル ストレージ | Mao Jian によって開発された bfs はオープン ソース化されています。 | |
メッセージ待ち行列 | kafka パッケージに基づくデータバス | |
ログ | uber の zap パッケージに基づくログ フレームワーク | |
構成および構成センター | 環境変数からの構成の読み取り、toml からの構成の解析、およびリモート構成センターのサポート (自己開発、mysql ストレージ、ローカル ランディング、http プロトコル、ロング ポール、クライアントには Ctrip のオープン ソース Apollo と同様の更新イベントがあります) をサポートします。 | |
モニター | オープン ソースのプロメテウスを使用すると、フレームワークとライブラリ (sql、redis、hbase など) にはカウント ポイントと時間統計ポイントが事前に埋め込まれており、ビジネス ロジックでも使用できます。 | |
痕跡 | トレースは、送信に UNIX ドメイン ソケットを使用するエージェント ベースのようで、フレームワークとライブラリは事前に埋め込まれています。 | |
研究開発プロセス管理 | TAPD、ハハ、関連する tapd 構造体情報があります |
その中で、RPC、HTTP フレームワーク、および生成ツールを含むデータ アクセス用のいくつかのライブラリ パッケージはすべて、kratos プロジェクト (https://github.com/bilibili/kratos) を使用して github でオープン ソース化されています。 Kratos は Go マイクロサービス フレームワークのセットです。多数のマイクロサービス関連のフレームワークとツールを含む、bilibili によるオープンソース)
ステーション B で現在使用およびパッケージ化されているミドルウェアの詳細な紹介は、Gopher China 2017ステーション Bの共有に
記載されています。 3840
bilibili のテクニカル ディレクターである Mao Jian の簡単な紹介
bilibili のテクニカル ディレクターである Mao Jian は、2015 年から bilibili (B ステーション) の UGC プラットフォームとインフラストラクチャを担当しており、ライブ弾幕用のオープンソース プッシュ サービス goim を開発し、B ステーション用の BFS 分散ストレージを開発し、B の開発を指導しました。ステーション キャッシュ プロキシ、bili temproxy などは、歴史的なマスター サイトのアーキテクチャを反復および再構築しました. 彼らは過去 6 年間 Cheetah Mobile で働き、MySQL DBA として働き、C 開発を行いました. その中で gopush-cluster はCheetah Mobile のプッシュ システム用に開発されました。アプリケーション サービスのパフォーマンス診断、カーネルの研究、安定したサーバー側アーキテクチャの進化が好きです。Tencent Cloud Most Valuable Professional (TVP)。bilibili のデータプラットフォーム部門を担当し、サーバーサイドの研究開発で 10 年近くの経験があります。高パフォーマンス、高可用性のサーバー開発が得意で、Go、Java、C などの言語に精通しています。ステーション B に参加し、マイクロサービス ガバナンス、マイクロサービス可用性設計、マイクロサービス データ一貫性設計、マイクロサービス ミドルウェア、マイクロサービス モニタリング、マイクロサービス ログ収集、マイクロサービス ロード バランス、マイクロサービス RPC フレームワーク開発などを含む、モノリシック アーキテクチャからマイクロサービスへの完全な変換。
オープンソース業界でより影響力のあるプロジェクト:
- goim https://github.com/Terry-Mao/goim 分散 IM 長時間接続ブロードキャスト サービス。
- bfs https://github.com/Terry-Mao/bfs 分散型の小さなファイル ストレージ。