# Dshawk ネットワークフローデータの動的グラフ構築アーキテクチャ ## 背景 ## 要件 - リアルタイムに可視化したい - 中央のデータベースをなくしたい - 長期のデータ保存はいらない - graph search はいる? - 部分のみ表示 - ロールでまとめる - n seconds before を表示 (option) ## 関連 Weave Scopeの実装 Hubbleの実装 - [Hubble internals — Cilium 1.10.90 documentation](https://docs.cilium.io/en/latest/internals/hubble/) - [cilium/hubble-ui: Observability & Troubleshooting for Kubernetes Services](https://github.com/cilium/hubble-ui) etcdのwatch APIの仕組み ## 設計 ![[Pasted image 20210520055411.png]] - メンバーシップ管理 - SWIMM Protocol - 単にAPI ServerのVIPを指定するだけでいいかも? - gRPCによるストリーミング - [Core concepts, architecture and lifecycle | gRPC](https://grpc.io/docs/what-is-grpc/core-concepts/#server-streaming-rpc) > サーバーストリーミングRPCは、クライアントのリクエストに応じてサーバーがメッセージのストリームを返すという点を除いては、ユニアーリーRPCに似ています。すべてのメッセージを送信した後、サーバのステータス詳細(ステータスコードとオプションのステータスメッセージ)とオプションの末尾のメタデータがクライアントに送信されます。これでサーバ側の処理が完了します。クライアントは、サーバーのメッセージをすべて受け取ると完了します。 > クライアント・ストリーミングRPCは、単項RPCと似ていますが、クライアントが単一のメッセージではなく、メッセージのストリームをサーバに送信する点が異なります。サーバは、通常、クライアントのメッセージをすべて受信した後に、単一のメッセージ(ステータスの詳細およびオプションの末尾のメタデータを含む)で応答しますが、必ずしもそうではありません。 > 双方向ストリーミングRPCでは、クライアントがメソッドを呼び出し、サーバーがクライアントのメタデータ、メソッド名、デッドラインを受け取ることでコールが開始されます。サーバーは、初期のメタデータを送り返すか、クライアントがメッセージのストリーミングを開始するのを待つかを選択できます。 > クライアント側とサーバー側のストリーム処理は、アプリケーションに依存します。2つのストリームは独立しているため、クライアントとサーバは任意の順序でメッセージを読み書きすることができます。例えば、サーバーは、クライアントのメッセージをすべて受信するまで待ってから、自分のメッセージを書き込むことができます。また、サーバーとクライアントは「ピンポン」を行うことができます。つまり、サーバーがリクエストを取得し、レスポンスを返送し、クライアントがレスポンスに基づいて別のリクエストを送信する、といった具合です。 - メモリ上でグラフDB - [krotik/eliasdb: EliasDB a graph-based database.](https://github.com/krotik/eliasdb) > The database can be embedded or used as a standalone application. > When used as an embedded database it supports transactions with rollbacks, iteration of data and rule based consistency management. - [https://dgraph.io](https://dgraph.io/) - [Build a graph from your event-stream with Go and ArangoDB | by Emin Laletovic | Ministry of Programming — Technology | Medium](https://medium.com/mop-developers/build-a-graph-from-your-event-stream-with-go-and-arangodb-d02b7e8d1a61) - フローの差分をローカルノードでみる - ローカルノードでバッファリングして、フローの差分があるときだけ送る - エッジの重みメトリクスは Prometheus。最新の値だけなら、Streamingで配信。 - ふだんはAPI Serverでキャッシュ。数時間ぐらい。 BrowserからリクエストがあったらStreaming配信する。 ## k8s での実装 - Helm Template [hubble/install/kubernetes at v0.5 · cilium/hubble](https://github.com/cilium/hubble/tree/v0.5/install/kubernetes) ## 可視化の実装 - Grafana - [Build a data source plugin | Grafana Labs](https://grafana.com/tutorials/build-a-data-source-plugin/) - [Build a panel plugin | Grafana Labs](https://grafana.com/tutorials/build-a-panel-plugin/) - [New in Grafana 8.0: Streaming real-time events and data to dashboards | Grafana Labs](https://grafana.com/blog/2021/06/28/new-in-grafana-8.0-streaming-real-time-events-and-data-to-dashboards/)