xin9le.net

Microsoft の製品/技術が大好きな Microsoft MVP な管理人の技術ブログです。

Rx入門 (3) - Push型とPull型

今回はPush型とPull型の考え方について見ていきます。Push/Pullと言われても何のこっちゃですが、データの流れ方のことです。

Push型

Push型配信の典型的な例に、携帯電話のキャリアメールがあります。携帯電話が定期的にサーバーにメールを確認しに行くのではなく、サーバー側からメールが送信されてくるのを待機するという形です。前者はポーリング型電子メール、後者はプッシュ型電子メールと呼ばれています。前回のサンプルにもあるように、オブザーバーパターンでは発信源がデータを積極的に通知していることが分かります。

Push

上のイメージ図からも分かるように、Push型では情報の発信源に対して複数の受信者を関連付けることができるので、同じ情報を一度に複数の対象者に配ることができますIObservable<T>を利用した配信はPush型と覚えておきましょう。

Pull型

Pull型はPush型と双対をなす考え方で、情報を必要に応じて積極的に取得しに行くのが特徴です。例として、図書館の書籍検索端末について考えてみます。書籍データベースがどこかにあり、その中に図書館にある大量の書籍情報が含まれています。所望の本が貸し出されているかどうか、どの書棚にあるのかなどを調べるために利用者が検索を行ったときに初めて、端末がデータベースを参照し、情報を取得して画面に表示します。別の利用者が検索を行ったときは、再度データベースにアクセスし...となります。

Pull

コレクションの中から特定の条件に合う要素を抜き出してどうこうする、というIEnumerable<T>ベースのLINQスタイルは、まさにPull型と言えます。実際、foreach文などでコレクションからデータを取得する際には、要素を取得する必要があるときになって初めて、MoveNextメソッドCurrentプロパティを利用して逐次アクセスするようになっています。

参考記事

ここでは概念的なことしか書いていませんので、IObservable<T>とIEnumerable<T>の違いについてより詳しく知りたい場合は、次の記事を参考にすると良いと思います。

次回予告

今回はPush型とPull型のデータの流れ方の違いについて確認しました。要約すると、情報を利用する側から見たとき、情報が勝手にやってくる(受動的に待ち受ける)のがPush型、必要に応じて取得する(能動的に取得する)のがPull型ということです。データがどのように流れるのかを理解していることはRxの挙動を追いかける上で非常に重要と思うので、きちんと整理すると良いです。次回はIObserver<T>を省略した記述方法について見ていきたいと思います。