2016-05-29 2 views
10

私はRethinkDBでアプリケーションを構築しています。私はchangefeedsの使用に切り替えようとしています。しかし、私は建築的な選択に直面していると私はいくつかのアドバイスを取得したいと思います。RethinkDB changefeedsのパフォーマンス:アーキテクチャーアドバイス?

私のアプリケーションは現在、ユーザーログイン(すべてフロントエンドに送信)で複数のテーブルからすべてのユーザーデータを読み込み、フロントエンドからの要求を処理し、データベースを変更し、変更されたアイテムを準備してユーザーに送信します。私はそれをchangefeedsに切り替えたいと思う。私はそれを見て、私は2つの選択肢があります:

  1. テーブルごとに1つの変更フィードを設定します。特定のサーバーにログインしているユーザーをフィルタリングし、その変更を手動でユーザーに配布します。これらの変更フィードは決して閉じない。彼らは私のサーバーの寿命を持っています。
  2. ユーザーがログインするときは、そのユーザーのデータのみの個別の変更フィードを設定します(セカンダリインデックスのgetAllを使用)。現在ログインしているユーザー数と同じくらい多くの変更フィードを維持します。ユーザーがログアウトすると閉じます。

解決策1には大きな欠点があります:RethinkDBの変更フィードには、時間(またはバージョン番号)の概念がありません。たとえば、Kafkaがそうです。つまり、a)初期データをロードし、b)初期ロード以降に発生した変更を取得する方法がないことを意味します。変更が失われる可能性のある時間ウィンドウがあります:初期データロード(a)と変更フィードが設定された瞬間(b)の間です。私はこれを心配している。

includeInitialを使用して初期データを取得し、中断することなく後続の変更を取得できるため、ソリューション#2が優れているようです。私は最初の負荷パフォーマンスに対処しなければならないでしょう(すべてのデータを1回ダンプするのは、何千もの更新を処理するよりも高速です)。しかし、スケーリングについてはどうですか?サーバーあたり最大1kユーザーを処理する予定です。RethinkDBは何千もの変更フィードを処理できるように準備されていますが、それぞれが本質的にgetAllというクエリですか?これらのチェンジ・フィードの実際の活動は非常に低く、私が心配している数字です。

RethinkDBマニュアルはそれを言って、changefeedスケーリングについて少し簡潔である:彼らはスケールとして、彼らはそれぞれのオープンフィード接続を備えたサーバの数に比例して、余分なクラスタ内のメッセージを作成するが、

Changefeedsは、うまく実行します書きます。

ソリューション#2はさらに多くのフィードを作成しますが、オープンフィード接続のサーバーの数は実際には両方のソリューションで同じです。そして、「スケールフィーリングがうまくいくと性能が変わる」というのは十分ではありません:-)

私は、サーバーの再起動/アップグレードと切断を処理するための推奨される方法について知りたいと考えています。再接続後にクライアントがRethinkDBに何か問題が発生した場合、クライアントは完全なデータロード(includeInitialを使用)を実行する必要があります。これは、ダウンタイム中にどのような変更が失われたかを知る方法がないためです。それは人々がしていることですか?

答えて

6

RethinkDBは、合理的なハードウェア上にあれば何千ものチェンジフィードをうまく処理できるはずです。その場合、ネットワーク負荷を軽減するには、アプリケーションサーバーと同じマシンにプロキシノードを置き、接続します。プロキシノードはネットワークを介して受信した変更フィードメッセージを重複排除するのに十分な知識があるため、メインクラスタのCPU /メモリ負荷が大きくかかるためです。

現在、クラッシュから回復する唯一の方法は、includeInitialを使用して変更フィードを再起動することです。将来は書き込みタイムスタンプを追加する計画がありますが、その場合は削除処理が複雑です。

+0

ありがとうございました!私はアプローチ#2(1人のユーザーあたり1回の変更)で行くことにしました。私が "重複排除"の意味を理解しているかどうかはわかりません。私のケースでは、ユーザーデータセット間に重複はないので、各クエリーは異なる変更フィードを生成します。私は、ネットワーク上を移動する可能性のある「複製」が何であるか分かりません。 –

+2

あなたのケースには何もないかもしれません。多くの場合、複数のユーザーが同じ変更を受け取ります。たとえば、 'messages'テーブルの各ユーザーに変更フィードがあり、複数のユーザーにメッセージが送信された場合などです。 – mlucy

関連する問題