【野鳥の会】 BBS.2ch.net 全発言統計の巻 part4

このエントリーをはてなブックマークに追加
851FOX ★
質問でーす

現 stats.2ch.net はDNSクエリに対して非同期(よんだらすぐリターン)になっていますが
これを同期にするのってのは難しいんですか?

1) サーバの設定 (集計プログラムの呼び出し方等)
2) リターン値の返し方 (集計プログラムからどういう経路で呼び出し元へ返すの?)

なんてとこが知りたかったりします。
852root▲ ★:04/11/17 17:18:56 ID:???
同期というか、1 query受信したごとに、
その都度指定したプログラムを呼び出すようにしたいとかいうことですかね。
853root▲ ★:04/11/17 17:19:30 ID:???
>>852 は、簡単にできます。
ちょっと負荷上がりますが。
854FOX ★:04/11/17 17:23:11 ID:???
呼び出したいというよりは
「値を返したい」が目的だったりします。
855root▲ ★:04/11/17 17:26:46 ID:???
呼び出し元に何か返したいとしたら、
簡単にやるならプログラムのexit codeでやるのが楽かと。

つまり、>>853 の手法で子供のプログラムを呼び出す時にその終了を待つようにして、
呼び出し元プログラムで何かすると。

shell scriptなら、./log/run をたぶんこんなかんじにすればいいかなと。

while read $line; do
echo $line | multilog -t ./main
echo $line | 処理プログラム
if [ $? -eq 0 ]; then
処理プログラムの戻り値が0だったときの処理
else
それ以外の時の処理
fi
done
856root▲ ★:04/11/17 17:28:00 ID:???
こうやっておくと、
DNSクエリがない間は、readのところで入力を待っています。
857FOX ★:04/11/17 17:30:26 ID:???
ふむふむ

1) 呼び出されるプログラムは exit(????); で通知する。
2) exit のコードを貰って、呼び出し側はDNS look upの返り値に整形して
  大本の呼び出し側(bbs.cgi)に返すと

仕組みは理解したはずー
858root▲ ★:04/11/17 17:36:23 ID:???
>>857
1)はそれでよいです。

3)はひょっとして gethostbyname()したおおもとのプログラムに返す値を、
exit()の結果に応じてダイナミックに変えたいといっています?

今のしくみだと、前と同じものをもう1回聞かれた時に違う値を返す、
ってのはできますが(BBX/Rock54で採用)、
一発目の応答を変えるってのは、今の仕組みではちょっと難しいかも。
859FOX ★:04/11/17 17:44:46 ID:???
そうなんです

【bbs.cgi】 -DNS look up-> 【DNS server】 -処理呼び出し-> 【集計プログラム】
                                     ↓
                                    処理&リターン値(数値)
                                     ↓
5454545454 <- 【23.23.23.23形式に変換】 <-exitで通知- 【5454545454】

こんな事を考えているです。
つまり 【23.23.23.23形式に変換】 このあたりが複雑ということですか?
860root▲ ★:04/11/17 17:51:30 ID:???
やりたいのはこんなかんじ ?

bbs.cgi → gethostbyname() →(DNS問い合わせ)→ BBS → 処理プログラム

というDNS問い合わせが起こったときに、*その問い合わせへの答え*として、

処理プログラム → BBS →(何らかの値)→ gethostbyname() → bbs.cgi

というルートで値を戻したい。
861FOX ★:04/11/17 17:53:06 ID:???
そなんです。
862root▲ ★:04/11/17 17:54:34 ID:???
お、かぶった。>>859 >>860 は同じこと書いていますね。

ええと、問い合わせを受けたときに bbs.cgi に値を返しているのは、DNSサーバです。
つまり、BBSシステムと非同期であると。

で、これを同期(というかダイナミック)にしたいということですね。

それは、今のBBSの仕組みそのままでは難しいすね。
同じような別の仕組みを作れば、できるかも。
863FOX ★:04/11/17 17:57:10 ID:???
具体例でいくと、

read.cgi の呼び出された総数をカウントしたい
その結果を都度 read.cgi の出力(html) に表示したい

こんなことなんですが、
864root▲ ★:04/11/17 17:59:04 ID:???
>>863
(回数-1)回、つまり「それまでにread.cgiが呼ばれた回数」なら、出来なくないかも。
でも、ちと重そうだなぁ。
865FOX ★:04/11/17 18:01:49 ID:???
負荷のことは置いておいて、
仕組みの話しなんですが、

exit(1234) ; とやったら bbs.cgi が 1234 を受け取り
出力に "1234" と入れたいってことなんです。

具体的な例として read.cgi のカウントを上げています
考えているのはもっと仮想化されたものです
866FOX ★:04/11/17 18:02:48 ID:???
>>865
bbs.cgi と read.cgi がごっちゃになってる。。。
read.cgi に読み直してくださいー
867root▲ ★:04/11/17 18:05:26 ID:???
ふうむ。

簡単なプロセス間通信をしたい、ってことですね。
それなら、DNSのフレームワークじゃないのを使ったほうがよさげですね。

しかも導入が簡単で、わりと軽いやつか。
868root▲ ★:04/11/17 18:10:11 ID:???
こんな感じの概念?

<< read.cgi >>
c = getcount(p);
printf("count = %d\n", c);

で、getcount() は別のサーバSで動いている
サーバプログラムsに何か情報pを伝えて、
サーバプログラムsはgetcount()に結果を戻し、
read.cgiはその結果を表示する。
869FOX ★:04/11/17 18:26:19 ID:???
そうなんです、

DNS のフレームワークでない方がいい?
コスト的、とくにサーバ間の通信ではとってもお得に感じるんだけど、、、
870root▲ ★:04/11/17 18:51:21 ID:???
>>869
はい、DNSはコスト低いし、らくちんですね。
どのシステムにも標準実装されてるし。

ちょっと会議入るんで、オフライン。
やりたいことはたぶん理解できました & 使えそうな仕組みはあるはずなので、
今夜 news19 をバージョンアップしながら、ぼちぼち考えてみます。