DUICUO

ここでは、学習する価値のある、推奨されるオープンソース プロジェクトとフレームワークをいくつか紹介します。

今日、私はある投資家仲間から、Netty のようなプロジェクトは複雑すぎて習得が困難だと感じているので、価値のあるオープンソース プロジェクトをいくつか推奨してほしいという質問を受けました。

実際、私たちが毎日使用している Spring と Netty は長年使用されており、非常に困難に思えるかもしれません。

以下では、私がレビューして良質だと感じたプロジェクト(ほぼすべて私自身が参加したプロジェクト)をいくつかご紹介します。難易度は簡単なものから難しいものまで様々です。これらのプロジェクトには、JavaやGoのプロジェクトに加え、主流のミドルウェアやクラウドネイティブのプロジェクトも含まれます。

Javaプロジェクト

XXLジョブ

難易度: 🌟🌟 推奨度: 🌟🌟🌟

xxl-jobはGitHubで27,000スターを獲得している、定番のスケジューリングフレームワークです。機能が複雑ではないため、最近はあまり更新されていません。

このタイプのスケジューリング フレームワークは日常的に使用されているため、非常に理解しやすく、実装も比較的簡単です。次に例を示します。

  • MySQLロックを使用して、分散ロックの問題をシンプルかつ簡単に解決する
  • スレッドプールの使用:各タスクのスケジュールは可能な限り影響を受けないようにする必要があるため、スレッドプールが広く使用されています。非同期タスクの結果を取得するためのベストプラクティスもいくつかあります。
  • RPC呼び出し:これも作者が作成した組み込みRPCフレームワークが含まれています。実装原理は複雑ではありません。作業で使用しているRPCフレームワークをより深く理解するために、ソースコードを確認することをお勧めします。

cim

難易度: 🌟🌟🌟 推奨度: 🌟🌟🌟

IM インスタント メッセージングの基本機能を備えており、これに基づいて次のことも実現できます。

  • インスタントメッセージ
  • プッシュ通知
  • IoTメッセージングプラットフォーム

CIM を通じて、分散システムについて学ぶことができます。

  • メタデータはどのように保存および同期されますか?
  • RPC 呼び出しはどのように実装されますか?
  • 長期接続システムはどのように実装されますか?
  • 複雑な分散システムなどで統合テストを実行する方法。

詳細な紹介については、プロジェクトホームページのReadmeをご覧ください。最適化が必要な箇所(実際にはまだ完了していないToDoリストがかなりあります)が見つかった場合は、お気軽にプルリクエストを送信してください。

パワージョブ

難易度: 🌟🌟🌟 推奨度: 🌟🌟🌟🌟

PowerJobもスケジューリングフレームワークですが、後発の製品という利点があります。市場に出回っている他のスケジューリングシステムの利点を組み合わせながら、いくつかの新機能も追加しています。以下はPowerJobの機能比較表です。

コミュニティもxxxl-jobよりも活発で、バージョン5.1.0がリリースされたばかりです。また、多くの学習記事や資料もまとめられています。

リモート通信にはAkkaを使用しており、このトピックに興味のある方は、ベストプラクティスをいくつか紹介しているので、見逃さないでください。コードも良く書かれており、拡張性も高く、いくつかのクラスは効果的に設計されています。例えば、よく使われるExecutorはMapProcessorから拡張されています。

タスクスケジュールセクションから始めることをお勧めします: tech.powerjob.worker.actors.TaskTrackerActor#onReceiveServerScheduleJobReq

パルサー

難易度: 🌟🌟🌟🌟 推奨度: 🌟🌟🌟🌟

Pulsarは現在、多くの企業で広く利用されている、主流のクラウドネイティブ・メッセージキュー・ミドルウェアです。Pulsarを通じて、以下のことを学ぶことができます。

  • API 設計: Pulsar のクライアントは開発者向けに設計されており、各反復とアップグレードでは使いやすさを維持しながら互換性を考慮する必要があります。
  • 非同期呼び出し:Pulsarではほぼすべてのリクエストが非同期であるため、非同期操作とコールバックを多用します(ただし、いくつか落とし穴もあります)。高パフォーマンスなコード記述方法を学ぶことができます。
  • Netty のベスト プラクティス: メッセージを送受信するための基盤となるネットワーク フレームワークも Netty によってサポートされており、Pulsar はそれをカプセル化します。
  • プロトコルベースの多言語クライアント。
  • Pulsar は通信のエンコードとデコードにプロトコルを使用するため、さまざまな言語の API を生成でき、これに基づいて他の言語でクライアントを作成するのが非常に便利になります。

しかし、Pulsar自体の複雑さから、始めるのは簡単ではありません。クライアントサイドのコードから始めることをお勧めします(JavaでもGoでも問題ありません)。

スターロックス

難易度: 🌟🌟🌟🌟🌟 推奨指数: 🌟🌟🌟🌟

StarRocksは、私が最近初めて出会ったOLAPデータベースプロジェクトです。この分野の経験はほとんどなかったので、ゼロから学んでいました。

幸いなことに、この期間中に必要に応じていくつかの PR を送信し、徐々に慣れていきました。

これらのオープンソース プロジェクトでの私の経験から、データを扱う企業は製品に対してより喜んでお金を払うので、StarRocks のようなデータベース プロジェクトは最も将来性があり (そして最も利益率が高い) ということが分かりました。

しかし、このプロジェクトは初心者向けとは言えません。ビッグデータの分野に既に触れた経験のある人が学ぶのに適しています。でも、心配しないでください。私自身も全くの初心者でした。基礎知識が全くなかったので、ただコードに従ってデバッグするだけでしたが、Javaで書かれているので理解できました。

オープンテレメトリー

難易度: 🌟🌟🌟🌟 推奨度: 🌟🌟🌟🌟🌟

OpenTelemetry は現在、クラウドネイティブの可観測性の事実上の標準となっており、徐々に大企業にとって不可欠なテクノロジー スタックになっています。

Javaエージェントは、トレース、メトリクス、ログなどのアプリケーションデータを自動的に収集できます。まずはopentelemetry-java-instrumentationをお勧めします。これは、このプロジェクトからパッケージ化されたJavaエージェントの中で最も頻繁に使用されるためです。これにより、以下のことを学ぶことができます。

  • 任意の関数のインターセプターの書き方
  • スレッドとプロセス間でトレース情報を渡す方法。
  • 一般的に使用されるフレームワークはどのように機能しますか?
  • たとえば、gRPC の原則を理解する必要がある場合は、OpenTelemetry が gRPC にポイントを埋め込む方法を確認して、その中核となる原則を理解できます。
  • エレガントなAPI設計

一方、OpenTelemetry は私がこれまで見た中で最もエレガントなコードの 1 つであり、皆さんにぜひ確認することをお勧めします。

Go(クラウドネイティブプロジェクト)

cプローブ

難易度: 🌟🌟🌟 推奨度: 🌟🌟🌟

cprobe は、kafka_exporter、nginx_exporter、mysql_exporter などのさまざまなエクスポーターを統合することを目的とした可観測性プロジェクトです。

また、上位レベルの抽象化も組み込まれているため、さまざまな監視オブジェクトの構成を統合的に管理でき、単一のプロセスを展開してすべてのアプリケーションを監視できます。

このプロジェクトから次のことが学べます。

  • Prometheus やメトリックなどの監視システムの基礎。
  • Go言語の基本的な使い方

ビクトリアログ

難易度: 🌟🌟🌟🌟 推奨度: 🌟🌟🌟🌟

これはVictoriaMetricsのサブプロジェクトです。名前の通り、主にログ処理に使用されます。Elasticsearchの簡易版と考えてください。機能はシンプルですが、リソース消費量はElasticsearchよりもはるかに低くなっています。詳細は、以下の負荷テストのグラフをご覧ください。

このプロジェクトから次のことが学べます。

  • データはディスク上でどのように保存され、取得されるのでしょうか?
  • Goの現在のバージョンには、goroutineとチャネルに関するベストプラクティスがいくつか採用されているため、コードはそれほど複雑ではありません。まずはクエリのエントリポイントを確認することをお勧めします。

要約

これらはすべて私が真剣に取り組んだプロジェクトです。長期的に取り組んで収益を上げたいなら、現在非常に人気のあるStarRocksをお勧めします。

単に Java スキルを向上させたいだけなら、Pulsar と OpenTelemetry をお勧めします。どちらもコードに関するベストプラクティスが多数あります。

クラウドネイティブおよび Go プロジェクトを開始する場合は、cprobe が適切な選択肢です。

もちろん、どんなプロジェクトでも最も重要なのは粘り強く続けることです。たまにしか見ないプロジェクトは、忘れられてしまいがちです。少なくとも、実際に実行してコードをデバッグするべきです。

参考リンク:

  • https://www.yuque.com/powerjob/guidence/wu2e93.
  • https://github.com/VictoriaMetrics/VictoriaMetrics/blob/master/lib/logstorage/storage_search.go
  • https://crossoverjie.top/tags/OpenTelemetry/.
  • https://crossoverjie.top/2024/10/09/ob/StarRocks-dev-env-build/.