pullかpushか
AとBで連携したいとき、pullかpushか考える場面が時々ある。
こちらから、むこうに、はたらきかけて、データを引っ張り出すのが、pull。
むこうから、こちらに、はたらきかけられて、データを突っ込まれるのが、push。
こういう連携について、ちょっとメモしておこう。
バッチなんだけど、やたら他システムとの連携が多い、機能をつくっている。他システムが提供してくれている連携の仕組みは、たいてい、CSVファイルかWeb APIのどちらか。
たとえば、ブラウザとWebサーバは、ブラウザからWebサーバにリクエストをなげてレスポンスをもらう。ブラウザから、Webサーバに、はたらきかけて、データを引っ張り出す。H時々「Webサーバからpushできればなあ」と思うことがありつつも、HTTPは、基本pullという制約にしばられている。
そこをなんとかしたいと、がんばって、Webサーバからブラウザへpushできるようにした仕組みとして、Cometという技術もある。AdobeのAMFもたしか、HTTPの上位のプロトコルだけど、pushする仕組みを提供していたはず。
Webは、HTML5というかWeb Socketでもっとかんたんになるのかもしれない。
AとBで連携のタイミングが、はっきりとわからないときは、定期的にpollingするとかいうこともある。準備ができているかを確認して、準備ができていなければ、時間を置いてまた確認。準備ができていれば、そこでpullとか。
ファイルの受け渡しなんかもそうなのか。システムAとシステムBでファイルを受け渡しする。システムAのバッチの起動時間までに、システムBのバッチが必ずファイルをつくっているとは限らないから、システムAのバッチを起動するけど、システムBのバッチがファイルをつくってくれるまで、スリープしながら、ループして、待機とか。
データを受け渡しできなければ、リトライを適当に繰り返して、タイムアウトする。
AとBで直接連携しないで、メッセージングのミドルウェアを間に、はさむというのもある。