2012-04-13 14 views
49

これは場合に便利です:サーバーがダウンしていると、クライアントはリアルタイム同期 Meteorアプリケーションはどのようにオフラインで動作しますか?

  • のために接続することはできません

    • ユーザーがオンラインに行くことを望んでいないインターネットに接続
    • はありませんが、アプリケーションで作業したい
  • +0

    ありませんもちろんオフラインのソリューション全体を実装することは可能ですが、それは何千ものコード行です – Raynos

    +0

    これは近日公開予定のappcacheによって部分的に解決されています:http://devel-docs.meteor.com/#appcache(少なくともHTML5キャッシュマニフェスト)。良い見て! – Vindberg

    +0

    フルオフラインモバイルアプリを開発する必要がある場合はどうすればよいですか? [私の質問](http://stackoverflow.com/questions/27893600/meteor-for-non-internet-mobile-app)これは未回答です。誰でも洞察力がある。 –

    答えて

    55

    はい!これは、ほとんどの場合、すでにMeteorで実装されています。

    サーバーへの接続が失われても、クライアントは引き続きローカルで機能することができます。データベースの書き込みは、クライアント上で成功し、瞬時に画面に反映されます。接続が再確立されると、Meteorは保留中のメソッド要求をすべてサーバーに再送信し、サーバーからの結果をクライアント表示に更新します。これはすべてレイテンシ補正の結果であり、オフラインではサーバが非常に遅いように扱われます。

    クライアントは反応的な 'Meteor.status()'出力を監視して、現在の接続の状態を確認できます。たとえば、Meteor.statusを使用して、再接続タイマーとgmailのような '今すぐ接続する'ボタンを含むポップアップを駆動することができます。

    編集:もちろん、流星は魔法ではありません。 「リロード」を押すか、ページなどから離れて移動すると、オフラインの間にMeteorセッションが失われ、ネットワークを回復するまで再開できなくなります。これは、オフラインモードのすべてのWebアプリケーションに当てはまりますが、あなたのアプリのユーザーには驚きではありません。

    +2

    これは確かに答えです。n1mmy – dennis

    +29

    ローカルページ状態が失われた場合に回復することができるように、接続が利用できないときにLocalStorageのクライアントにダーティレコードを保存するのは面白いでしょう。流星の中でこの機能を見たいと思っています。 私は実際には、データセット全体を(おそらくアプリケーションキャッシュマニフェストのファイルとして)ローカルに保存する方法を検討して、オフラインで再オープンして使用できるようにすることにも興味がありますが、これは難しい要件です。 –

    +6

    私はあなたのBackbone.jsアプリが同じアルゴリズムでオフラインで動くようにライブラリを開発しました。 https://github.com/Ask11/backbone.offline –

    11

    「あなたのタブが閉じるか、再読み込みする」問題を解決するオプションがいくつかあります。私はまだそれらを試していないが、面白く見える。

    https://github.com/awwx/meteor-offline-data

    流星オフラインデータMeteor.Collectionラップ "オフライン コレクション" を実施流星オフラインデータプロジェクトの

    ホーム、:サーバーから

    データでありますブラウザデータベースに永続的に保存されている は、アプリケーションがオフラインで起動する場合でも、アプリケーションに利用可能にします。

    ブラウザによっては、ブラウザを閉じて再度開いたときに変更が保存され、ブラウザデータベースにも保存されます( )。次に アプリケーションがオンラインになると、変更がサーバーに送信されます。

    アップデートは、オフライン中でも同じ アプリケーションで開いているブラウザウィンドウで反応的に共有されます。

    https://github.com/GroundMeteor/Meteor-GroundDB

    特長:通常の流星に

    ライトフットプリント

    幅広いブラウザのサポートクローム、サファリ、FirefoxとInternet Explorer 9の フォールバック。メソッドのコレクションの再開で 変化のないのlocalStorage再開がオフライン クライアント側のみのデータベースに対してSmartCollectionのサポートのためにオフライン更新クロス ウィンドウのタブのサポートワークスない場合、コレクションが今後のlocalStorageに 圧縮データにEJSON.minifyとEJSON.maxifyを使用しますサーバー側

    -1

    にカスタマイズ可能な競合ハンドラになります私は専門家ではないですが、のソリューションを想像してみましょう:

    ないタブレット/セルに(ではない私たちは、このようなデバイス上で流星スタックをインストールできることを確認)、デスクトップ上では、ユーザーは、POS、いくつかのトランザクションログ、 (オフライン注文)» (物理的にローカルではない在庫を使用する取引は、オフラインで確認する必要があります)

    さらに、一部の機能はオンラインでのみ使用できます(オフラインで注文しているユーザーは、オフラインで注文しています)

    もちろん、アプリケーションのすべての部分をオフラインで使用できるわけではありません:重要なレコードの作成、一部のトランザクション、フルコレクションを必要とする検索などです。オフライン機能はローカルMacすでに稼働している現地のフルサイズのMeteorが稼動しています。

    Oplogは、集中化されたサーバーのミラーコレクションにこれらのオフラインDBを同期させます。 ユーザーごとに1つの特定のDBがあるため、すべての大きなデータがユーザーのコンピュータでオフラインで利用できるわけではありません。 アイデアは、一部の機能の可用性を維持することです。 他の方法では、すべてのユーザーのオフライントランザクション用に1つのDBのみを持つことができますが、oplogはこれらのトランザクションをすべてのユーザーのオフラインDBで同期します。できるだけ早くこれらのレコードをPOSTしてクリアすることができますが、プライバシには向いていません。クライアントのオフラインDBはミラー化されており、集中化されたサーバー上にミラー化されているため、ユーザーごとに1つの特定のDBが必要なユーザーまたは情報によって作成されたレコードのみが含まれます。

    セントラルサーバー側の機能は、これらのレコードを定期的に検証し、これらのレコードをより大きいすべてのユーザー(セントラルDBを含む)にPOSTします。

    簡単な方法:すべてのトランザクションは、利用可能な場合にウェブサービスにトランザクションを送信するローカルオフライン流星アプリで行われます。 (この方法は、ユーザーが、2つのアプリケーションを使用して行ったり来たり管理する必要はありません。)

    我々は2つの請求書番号の概念を使用することもできます 販売請求書番号:(?ドキュメントID)取引時に生成し

    逐次請求書番号:会計目的のために、後で生成されます(オンラインの場合、15〜20秒の文書の場合)。

    ここでのアイデアは、ローカルの流星群にローカルな持続性を持たせることです。 Oplogは集中管理された永続性と同期しています(asynchrone webserviceにオンラインではありますが、大型のDBを搭載した自動シンク)

    (いずれにしても、2つのアプリケーションがローカルで実行されていて、中央で1つのサービスが提供されていて、優先的にオンラインのものを使用するようにユーザーに指示する快適な方法とオフラインの場合はオフラインのもの)

    コミュニケ多くの知識のある人が作業方法を評価し文書化します。私はまだ流星を使っていませんでしたが、まだ基本的な学習プロセスにあります。 ?

    おかげで、

    マルク・ラインの

    +1

    あなたの答えは幾分包括的ですが、私はあなたが少し不足していると思います。 – Dave

    +0

    確かに、私は可能性を評価していますが、最良の解決策が何であるかはわかりません。 (ところで、あなたがそれを読んだので、私のポストを更新したかもしれない)私が欠けている点についての精度を得ることはうれしい。とにかくありがとう。 – EMHmark7

    0

    下:ブラウザが完全に変化を得たのでアプリがそれを要求したすべてのどのくらい毎回(実際のセッションを

    1)のいずれかを保存することができますについて。そのようなアプリは、10秒ごとに十分ではない、我々はすべてのイベントが必要)。私たちはそれをFirefoxと言うことでプログラムできますか? (ただし、HTML、JS、MinoMongoDBなどを1つの変更で保存する必要があります)

    2)または、私たちはローカル側のものを扱うクライアントサイドのフル流星スタックを持っています)何らかの形でCRUD操作をブラウザの別のタブやインスタンスにある別のオンラインアプリに伝えています。 (その2番目のアプリケーションは、実際のリモートサーバーによって提供される)問題は、そのような2つのアプリケーションが通信できるかどうかです。私はブラウザがセキュリティ上の理由からそれを禁止すると思います)

    さらに創造的な考え方があります:クライアントのスタック上でoplogを有効にします。その後、オンラインでオンラインになるたびに、実際のクライアントのoplogをメインアプリケーション(別のログログ)でエクスポート/インポートすることができます。

    3)クライアントの流星からcall完全スタックからサーバ上の別の流星スタックへ。 (それはありますか?可能です流星でURLのドメイン制限に関するいくつかのルール)

    しかし、それはタブレット上でフル流星スタックを持つ可能性を修正しません(私はない意識shuchの事が可能です午前)

    関連する問題