2016-10-11 11 views
1

これは私の問題です。Meteorのサブスクリプションの重複はパフォーマンスを悪化させますか?

ノートパッドにメモを保存できるアプリがあります。

現在、ユーザーがメモ帳をクリックすると、そのメモ帳を最初に5つのメモとして返す文書を購読します。

ユーザーが新しいメモ帳に移動するたびに、新しいサブスクリプションが設定され、そのメモ帳の5つのメモがminimongoになります。だから、minimongoは一度にメモコレクションに5つのメモしか持っていません。

ユーザーエクスペリエンスを向上させるために、アプリケーション全体の初期読み込みを変更しましたので、すべてのメモ帳と最初の5つのメモメモ帳ごとにだから私たちはミニモォで、常にメモの数(5×(メモ帳の数))を持っています。

初期荷重は少し重いですが、それ以降はノートパッド間を移動する方がはるかに高速です。

私はを購読しています。これはユーザーのメモ帳を返し、メモ帳ごとに5つのメモを返します。

実際にメモ帳をクリックすると、myNotepadInfoに登録され、メモ帳の最初の5桁も返されます。最初のサブスクリプションはすでにこの情報を取得しているため、実際にはminimongoのドキュメントは変更されません。しかし、私はまだmyNotepadInfoを購読したいと思っています。なぜなら、テンプレートのサブスクリプションに依存するより多くのノートメカニズムをロードしているからです。

私のアプリはこれらの変更を完全に処理していますが、実際に何が起きているのかわかりません。変更後のメモ帳の読み込み方法には具体的な違いはありません。

基本的に私は最初のサブスクリプションと重複する2番目のサブスクリプションを持っています。

2番目のサブスクリプションが最初のサブスクリプションと重複しているように見えますが、クライアントへのドキュメントの転送が少なくてすみますので、高速にする必要がありますか?

+0

[meteor documentation](https://docs.meteor.com/api/pubsub.html#Meteor-subscribe): '*ただし、実行関数の次の反復が同じレコードセットに登録されている場合(同じ名前とパラメータ)、Meteorはスマートで、無駄な購読/再購読をスキップすることができます。* ' 起動時にすべてを購読するのは良い方法ではないと思います。あなたの読み込み時間は、多くのメモ帳があれば強くなります。だからこそサブスクリプションが必要です。先に動的なロード/検索を実装したい場合は、[簡単:検索](https://github.com/matteodem/meteor-easy-search)を選択するのが良い選択です。 –

答えて

0

この2つの重要な質問は、(1)クライアントに送信しているデータの量です。 (2)あなたは何人のユーザーを期待していますか?

2番目の点は説明が必要です。 Meteorの現在の(2016年)パブのサブアーキテクチャの主要コンポーネントは、クライアントサブスクリプションがサーバーに登録され、追跡されることです。再利用できない(つまり、別のサブスクリプションを複製しない)サブスクリプションを追加すると、そのアプリケーションのCPU要件が高くなります。ここでは、各ユーザーがメモ帳を「所有」しているように聞こえます(そうではないかもしれませんが)。そうであれば、サブスクリプションの再利用率が低いことを意味します。各ユーザーは、ユーザー間で再利用できないため、メモ帳を受け取るためには個別のサブスクリプションが必要です。したがって、1人のユーザーあたり2つのメモ帳サブスクリプションは、メモ帳サブスクリプションに起因するアプリケーションのCPUフットプリントの部分を効果的に倍増させます。

これは必ずしも悪いことではありません。あなたのアプリが管理用、家庭内サービス用、または少数のユーザー用に設計されている場合は、それほど大きな違いはありません。高いユーザー数を望んでいる/期待している消費者向アプリの場合、それは悪い選択です。

オブザーバー再利用でKadiraの良い記事is hereと私は彼らの(有料)Bulletproof Meteor記事もお勧めします。

最後に、これらの問題を改善するためのKadiraツールのうち、Subs ManagerFast Renderを確認することができます。彼らはまだ積極的に維持されているかどうかチェックするべきですが、私はそうしていません。

+0

こんにちはJeremyさん、ありがとうございました。ユーザーは自分の情報を購読します。この出版物では、クエリで 'this.userId'を使用してメモ帳とメモを返します。どのように私はこれを行うだろうか?私は理解していない、それはあなた自身のデータを購読する唯一の方法であるようだ。ユーザーがサブスクリプションを共有するように設定する方法はありません。私は何か不足していますか? – nearpoint

+0

私は何かが欠けているとは思わない。あなたの出版物で 'Notepads.find({userId:this.userId})'を返すようなことをしているのであれば、オブザーバーを再利用することはできないので、最初に概説した2つの戦略質問。ユーザーあたりのメモ帳ごとに2つのサブスクリプションがあると、CPUの問題がより早く解決され、メテオスケールのボトルネックが発生します。 (上記のKadiraの記事で参照されているthis.userIdのヌルチェックは、効率を少し向上させる唯一の方法ですが、これは実際に主な問題には対応していません)。 –

関連する問題