none
サーバー上のマスタが更新されたら、全クライアント上の表示もアプリケーションの再起動なしに更新したい RRS feed

  • 質問

  •  

    お世話になります。

    Visual Basic 2005 + SQL Server 2000でクライアントサーバーシステムを構築しています。

     

    今の設計では、クライアントアプリケーションは起動時に必要なマスタをDataSetにロードし、
    以降はDataSet上のデータを利用して、画面上のコンボボックスのデータソースに使っています。

    なぜ、起動時にすべて読み込むようにプログラムしたかというと、毎回読み込むとネットワーク上の
    トラフィックが増大してしまうことと、サーバーに無用な負荷がかかってしまうからです。

     

    ほとんどの端末では1日中そのアプリケーションを立ち上げたままにするので、

    基本的に起動時の処理は1日1回ということになります。

     

    従来はマスタの更新がめったになかったので、クライアントへの反映が1日1回でもよかったのですが、

    業務のやり方を変える為、クライアントへの反映を少なくとも10分以内程度に収める必要が

    出てきました。

    サーバー上のマスタが更新されたら、クライアントすべてにプッシュ配信する方法が

    ありますでしょうか。

     

    私が思いついた方法は、サーバー上にマスタのバージョンを格納しておき、

    クライアントはそのバージョンをポーリングして、更新されていたら、データを取得するという方法です。

    しかし、プッシュ配信の方がネットワークトラフィックを減らせるような気がするのです。

     

    何かいい方法がありますでしょうか。

    ご教授ください。

    2008年2月27日 11:11

回答

  • 自動化も魅力がありますが、操作性の低下という可能性もあります。

     

    たとえば、テキストボックスに入力中にバックグラウンドで反映処理が実行され砂時計になる、とか。

    そういうことで苦情がきたら本末転倒になってしまいます。

     

    また、遠隔地のお話からするとコンボボックスの横に「最新の情報に更新」ボタンをつけるだけでよいかもしれません。

    #処理時間が長いということをユーザーが意識して自発的に実行する

     

    いずれにせよ、自動化という理想のみを追うのではなく、適切な妥協点を顧客との間で決めるのがよいでしょう。

     

    2008年2月28日 1:53
  •  gunung さんからの引用

     ネットワークトラフィックに過敏になっているのは、全クライアント40台程度

    のうち10台ほどが遠隔地にあるからです。

     遠隔地のネットワークとはインターネットVPNでつながっているのですが、

    地方のため十分な速度のある回線が用意できていません。

     

    私なら。

     

    その条件の場合、

     

    ・マスタ更新をしたら最終更新時刻をデータベースに保存するようにします。

    ・2~3分に1回、マスタの最終更新時刻を確認するようにします。

    ・マスタが更新されてる場合は通知します。その際、ユーザーの操作を中断させることのないように通知します。

    ・レプリカの更新はまどかさんの言ってるような感じで手動にします。

    ・1日1回の更新はやめて、毎朝作業の前に更新チェックをしてもらいます。

     

    という感じにすると思います。

     

    「最低でも10分でマスタ更新を通知したい」という要望を満たすと

    トラフィックが大変なことになってしまう場合は、

    ボトルネック部分をうまくごまかします。

     

    例えば、

    VPNの接続コストが高い場合は外部に公開されたHTTPサーバー上に

    最終更新時刻のみかかれたファイルを置いてそれを参照するとか。(多少のリスクがありますが)

    同様にデータベース接続のコストが問題の場合はデータベースに最終更新時刻を保存せずに

    テキストファイルに保存しておいて、ファイル共有で確認するとか。

     

    工夫はいろいろできますが。

    500kbpsもあるならそれほど工夫しなくても快適なアプリケーションを作れると思います。

    2008年2月28日 2:21

すべての返信

  •  gunung さんからの引用

    しかし、プッシュ配信の方がネットワークトラフィックを減らせるような気がするのです。

     

    いいえ。

    どのようにプッシュ配信するにしろ、

    それとほぼ同様な、プッシュ型と全く同じ転送量か、少ない転送量のプル型システムが作成可能です。

    #なぜなら、クライアント側ではデータが必要かどうかを知っているからです。

    実際には、うまい仕組みであればプルもプッシュも転送量はほとんど変わりません。

    ですから、転送量でプッシュ/プルを選択するものではありません。

     

     gunung さんからの引用

    サーバー上のマスタが更新されたら、クライアントすべてにプッシュ配信する方法が

    ありますでしょうか。

    クライアントにリスナを、サーバーにセンダをおけば当然できます。

    ですが、上記のように、作っても転送量削減には意味がないと思います。

     

     gunung さんからの引用

    従来はマスタの更新がめったになかったので、クライアントへの反映が1日1回でもよかったのですが、

    業務のやり方を変える為、クライアントへの反映を少なくとも10分以内程度に収める必要が

    出てきました。

     

    データの丸コピーをとる、レプリカ戦略をとったのも転送量削減のためですよね。

    で、その戦略が簡単であったのはマスタ更新が1日1回だったからです。

     

    どんな戦略が有効なのかは、量によります。

     

    マスタ更新が毎秒1回行われるシステムだったら、レプリカ戦略をとってはいませんよね?

    なら前提となる量が変わったのだからそれを見直す手ももちろんありますよね。

     

    現在提示されてる条件は

    Visual Basic 2005

    SQL Server 2000

    マスタ更新は10分以内に反映、

    だけです。

     

    マスタ更新の頻度も、クライアント数も、ネットワークの速度もわからないので、

    量に関して殆どわかってないわけですから、

    どこにでもある当たり前なアドバイスしかできません。

    例えば…

     

    ・比較的量に関して鈍感な(どんな量でもうまくうごく)、優秀な戦略に「キャッシュ」があります。

    ・更新におけるサーバーの平均転送量はおおよそ「更新量x更新頻度xクライアント数」です。

    ・レプリカ戦略では「最終更新時刻やそれに類するものをレプリカ側が確認する」というのが普通です。

    ・「ポーリング」と「必要なときに確認する」では前者の転送量の方が多くなります。

     

    といった感じで。

    周知or自明ですが。

    2008年2月27日 17:47
  •  gunungさんおはようございます。

     SQL Server 2005ならクエリ通知機能というのがあるようです。ご参考までに。

     

    http://msdn2.microsoft.com/ja-jp/library/t9x04ed2(VS.80).aspx

     

     コンボボックスに表示する量のトラフィックが気になると言うことはクライアント数がすごいことになっているのですか。 

    2008年2月27日 23:03
  • >れい様

     

    丁寧な回答ありがとうございます。

     

    情報不足で申し訳ございません。

     

    背景

     背景からご説明しますと、対象のアプリケーションは工場内の
    作業日報を入力するためのソフトです。
     更新するマスタとは、製造番号のマスタです。

     

    更新頻度

     私の勤めている会社は受注生産なので、製造番号は顧客から受注してから取得
    されます。

     通常は受注してから、即日作業に掛かるということはありませんので、

    夜間バッチで受注システムから作業日報の入力システムに反映させて

    います。

     そのデータは翌朝、アプリケーションの起動時にクライアントに反映されるという

    仕組みです。

     

     業務のやり方を変更した後では、1日1回のバッチ更新以外に、

    緊急に必要な製造番号の取り込み処理を行います。

     一部の製造番号が緊急に必要となるので、手動で受注システムからの取り込み処理

    を不定期に実行することになります。

     このようなケースは1日に1回も必要なく、数日に1回程度になります。

     

    クライアント台数とネットワーク速度

     ネットワークトラフィックに過敏になっているのは、全クライアント40台程度

    のうち10台ほどが遠隔地にあるからです。

     遠隔地のネットワークとはインターネットVPNでつながっているのですが、

    地方のため十分な速度のある回線が用意できていません。

     

     情報をまとめると、下記の通りです。

    • マスタ更新頻度 不定期、数日に1回
    • クライアント台数 40台程度(うち10台程度が遠隔地)
    • ネットワークの速度
      • 同じネットワーク 100Mbps
      • 遠隔地 実測500kbps程度
    • マスタのデータサイズ
      • 2000件程度 × レコードサイズ 100バイト程度

     各クライアントに反映されたデータは、DataGridViewコントロールのコンボボックス列

    に表示しています。

     全データをバインドして、コンボボックスのオートコンプリートを利用して入力しています。

     

    以上です。

    必要な情報は網羅されていますでしょうか。

     

    >三輪の牛様

     返信ありがとうございます。

     まさに求めていた機能です。

     この機能のためだけにSQL Server 2005を導入することは出来ませんが、

     環境をアップグレードする機会がありましたら、積極的に活用したいと思います。

     

     イメージとしては、Observerパターン(デザインパターンの中にある)のイメージなんですけど。

     (適用するパターンは最適なものではないかもしれません。最近勉強しはじめたばかりなので。)

    2008年2月28日 1:00
  • 自動化も魅力がありますが、操作性の低下という可能性もあります。

     

    たとえば、テキストボックスに入力中にバックグラウンドで反映処理が実行され砂時計になる、とか。

    そういうことで苦情がきたら本末転倒になってしまいます。

     

    また、遠隔地のお話からするとコンボボックスの横に「最新の情報に更新」ボタンをつけるだけでよいかもしれません。

    #処理時間が長いということをユーザーが意識して自発的に実行する

     

    いずれにせよ、自動化という理想のみを追うのではなく、適切な妥協点を顧客との間で決めるのがよいでしょう。

     

    2008年2月28日 1:53
  •  gunung さんからの引用

     ネットワークトラフィックに過敏になっているのは、全クライアント40台程度

    のうち10台ほどが遠隔地にあるからです。

     遠隔地のネットワークとはインターネットVPNでつながっているのですが、

    地方のため十分な速度のある回線が用意できていません。

     

    私なら。

     

    その条件の場合、

     

    ・マスタ更新をしたら最終更新時刻をデータベースに保存するようにします。

    ・2~3分に1回、マスタの最終更新時刻を確認するようにします。

    ・マスタが更新されてる場合は通知します。その際、ユーザーの操作を中断させることのないように通知します。

    ・レプリカの更新はまどかさんの言ってるような感じで手動にします。

    ・1日1回の更新はやめて、毎朝作業の前に更新チェックをしてもらいます。

     

    という感じにすると思います。

     

    「最低でも10分でマスタ更新を通知したい」という要望を満たすと

    トラフィックが大変なことになってしまう場合は、

    ボトルネック部分をうまくごまかします。

     

    例えば、

    VPNの接続コストが高い場合は外部に公開されたHTTPサーバー上に

    最終更新時刻のみかかれたファイルを置いてそれを参照するとか。(多少のリスクがありますが)

    同様にデータベース接続のコストが問題の場合はデータベースに最終更新時刻を保存せずに

    テキストファイルに保存しておいて、ファイル共有で確認するとか。

     

    工夫はいろいろできますが。

    500kbpsもあるならそれほど工夫しなくても快適なアプリケーションを作れると思います。

    2008年2月28日 2:21
  • まどか様

    れい様

     

     早速のご返信ありがとうございます。

    みなさんのおっしゃるとおり、更新を自動化するのは動作速度の低下を

    招きそうで危険ですね。

     はっと、気づかされました。

     

     マスタのバージョンをクライアントから定期的に確認させ、

    ユーザーに更新の存在を通知する。

     通知はユーザーが手動で更新ボタンを押す

     

     という形にしたいと思います。

     

     この方法なら、端末が一斉にマスタを更新して、トラフィックやサーバーの

    負荷が爆発するということも防げそうですね。

     

     すっきりしました!

    ありがとうございました。

    2008年2月28日 2:36