AP4R というか、reliable-msg で実現したいチャネルとスレッドの関係

咳(id:m_seki)さん(この書き方で良いのでしょうか?)に、RubyKaigi の懇親会で質問をさせていただいたのですが、

10分で書く複数のチャネルのあるQueue
id:ita-wasaさんにRubyKaigi2007の宴会で質問された気がするのだけど、メモしなかったのでちゃんと思い出せない。AP4Rでなにが欲しいかわからないので勘で書く。チャネルはパターンでなく、直接指定することにするので、状態変数はチャネルの数だけ作ることにする。
http://d.hatena.ne.jp/m_seki/20070717

という回答を頂きました! +コードつき。フラットなチャネル構造であれば、かなり短いコードで書けるもんですね。かっこいい。質問の内容について、懇親会の時にはうまく説明できませんでした、すみません。自分の中でも完全に問題設定が整理されていないので、ここで言葉に落としてみます。ただし断片の組み合わせになっている可能性あり。

もう1つ前置き。AP4R は、永続化およびチャネルの制御は reliable-msg を使っているので、この話は reliable-msg の層になります。以上、reliable-msg への敬意表明でした。

以下、チャネルとサブスライバ(consumer)が主要な登場人物です。ホントは producer も居るけどここでは副次的。

チャネルの定義

  • チャネルはトークンからなるとする
  • トークンの区切りは . (ドット)、トークンの構成文字はたとえば [a-zA-Z0-9]
  • 例としては、aa.bb.c1, aa.bb.c2, xx.yy.z1 などなど

サブスクライバ

で、やっぱり気になるのが、サブスクライバの待ち方。

チャネルをパターンで待てるようにすると、Rinda と同じことになってしまって、速度を稼ぎにくくなる
http://d.hatena.ne.jp/m_seki/20070717

なのですが、Rinda よりは柔軟性が無くなるのは受け入れて、でもチャネル一本(ex. aa.bb.c1)よりは柔軟な待ち方ができるようにしたい、と考えています。柔軟さの想定は以下のような感じ。

  1. aa.bb.*, xx.* のような前方一致で待つ
    • たとえば、aa.bb.* は、aa.bb.c1, aa.bb.c2 にマッチ
    • * は(ひとまず)複数トークンにマッチすることにしておく
  2. 複数のチャネルを待つ、例えば、aa.bb.c1:xx.yy.z1
    • これは :(セミコロン)で2つのチャネルを待っていると思う、どっちかにマッチする
  3. これらの組み合わせ、例えば、aa.bb.*:xx.*
    • aa.bb.c1, aa.bb.c2, xx.yy.z1 の3つはすべてマッチ、pp.qq.rr はマッチしない

数値(サイズ)

これだけでは、ケースバイケースという結論にしかならないと思うので、ベースにする数字は以下を考えています。

  1. チャネルのトークン数は、3 から(多くても) 5 くらい
  2. チャネルの数(種類)は、10*10*10 くらい
    • ex.) a0.b0.c0, a0.b0.c1, ..., a0.b0.c9, a0.b1.c0, ..., a1.b0.c0, ......, a9,b9,c9
    • もうちょっと大きいところで考える方が面白いかもしれない
  3. セミコロン区切りで複数チャネルを指定する場合、多くても 5 種類くらい
    • セミコロン区切りはあまり必要ないかもしれない。捨てる方向か、ここをホットスポットとしないで考えるほうが良いかもしれない

以上、曖昧なところも多くありますが、質問したかった問題設定はこのようなことでした。紙も持たずにこんな質問してすみませんでした... チャネルのところ、等幅フォントじゃないと見難いな...