現在のアプローチに満足できず、Erlang でプロトコル スタックを構築する方法を再設計しようとしています。重要度順に並べられた機能:
パフォーマンス
新しいプロトコルバリアントを追加する柔軟性と実装速度
開発者がシェルからプロトコルのバリアントを探索するのに役立ちます
私の現在のモデル(すでにこの質問で説明されています)は、関数呼び出しによる send() とメッセージによる受信の醜い非対称性に加えて、限界に達しています。
プロトコル エンジン全体の全体像は次のようになります。
下部:
各スタックの下部にいくつかのポートまたは場合によっては gen_tcp もあります (独立したチャネル用に複数の同一のスタックがあるため、ここでプロセスを登録するだけで静的になりすぎることはできず、どこにでも PID を渡す必要があります。
ポートの上には、スーパーバイザーによって管理されるいくつかのモジュールがあります (システムで開始され、エラーが発生しない限り、存続期間全体が維持されます)。
頭の部分:
(event_handler の意味ではなく一般的な意味で) イベントの発生によってトリガーされるのは、接続指向のプロトコルの終わりです (たとえば、
connect()
およびclose()
セマンティクスを使用)。スタックを形成するために互いの上に積み重ねられたモジュールは動的に構成可能であり、接続ごとに変更される可能性があるため、プロトコルスタックのトップエンドはおそらく動的にのみ開始できます。
現在計画されているのは、モジュール名のリスト + オプションのパラメーターをトップレベルから渡すことであり
connect()
、スタックに呼び出されている間に消費されます。トップレベルのプロセスがリンクされるため、ここで何か問題が発生すると、接続全体が失敗します。
モジュールの種類とモジュール間の通信の種類
これまでに見つかったいくつかの種類のモジュールがあります。
ステートレス フィルター モジュール
状態を持つモジュールは、一部は gen_server に適合し、一部は gen_fsm に適合しますが、ほとんどは単純なサーバー ループになるでしょう。
レイヤー間の通信の種類:
独立したパケットの送受信(外から見て独立)
何かを送信し、応答があるまでブロックし、結果を戻り値として返す同期呼び出し。
複数のモジュールと通信するマルチプレクサ (議論を容易にするためにここで定義しています)
上向きのモジュールと通信するための異なるアタッチメント ポイント (現在はアトムによって名前が付けられています) を持つデマルチプレクサ。
現在、私の唯一のデマルチプレクサはスタックの静的な下部にあり、動的に作成された上部にはありません。マルチプレクサは現在、上部のみにあります。
リンクされた以前の質問処理の回答とコメントで、一般的に API はメッセージではなく関数のみで構成されるべきであると聞きましたが、そうでないと確信しない限り、これに同意します。
問題の説明が長くなってしまい申し訳ありませんが、あらゆる種類のプロトコルの実装にまだ一般的に使用されていると思います。
ここで一般的に役立つ何かを達成するために、これまでに計画したことを回答に書き、結果として得られる実装とそれに関する私の経験についても説明します。