Dispatcher は RI に呼び出され、転送先ノードに関する処理を実行する。 特に転送先ノードの選出について、固有のアルゴリズムを持つ。
Dispatcher は転送先ノードの候補一覧であるノードリストを保持する。 ノードリストは選出アルゴリズムによって様々な形式が考えられる。 以下に RoundRobin 形式などで簡単に利用できるノードリストの例を示す。
struct node {
struct node *next;
uint32_t addr;
};
struct node_info {
struct node *node_list;
struct node *last_node;
uint32_t default_target;
};
上記の例の場合、他の node 構造体ポインタ変数のアドレスをメンバ変数 next へ 格納することで動的なノードリストを構築できる。
なお、RI がマルチスレッドで動作する場合は、ノードリストの操作時にロックを かける必要があるだろう。
RI が dtsd からノードの追加・削除の指示を受けた場合、 Dispatcher はノードリストへノードの追加・削除を行う。 このとき、ノード情報の実体を追加・削除するだけでなく、生死状態を表す フラグを切り替えるなどの手法も考えられる。 またノードの追加方法として、RI の起動オプション経由でノードリストの元となる 文字列を渡すなどする方法も可能である。
ノードリストからアルゴリズムに従って転送先ノードを選出する。 RI が解析したリクエストから選出に必要な情報(メソッドや User agent など)を 元にノードを選出することも可能である。