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で直接連携しないで、メッセージングのミドルウェアを間に、はさむというのもある。