0

私は以下のアーキテクチャ上の質問があります。私のアプリケーションのバックエンドはJavaとクライアント側でAngularJSで書かれています。今すぐ私は、アプリケーションのURLを共有してブックマークし、このURLで状態を復元できるように、ユーザー入力をページに保存する必要があります。ElasticsearchはJSON文書としてユーザ入力を格納します

私は、ページ上のデータと条件を選択してユーザーがアプリケーションとやりとりするたびに、複雑なJSONドキュメントですべての入力を収集し、このドキュメントをElasticsearchに保存します。 ESからのこのドキュメントのキークライアントアプリケーション(AngularJS)に送り返し、このキーに基づいてページのURLを更新します。

234532453455は、ES内の文書の鍵となる
http://example.com/some-page/analysis/234532453455 

:私は次のようにこのURLを更新しますサーバからのキーに基づいて

http://example.com/some-page 

:たとえば、元のURLは次のようになります。

ユーザーが次のURLにアクセスしようとするたびに - http://example.com/some-page/analysis/234532453455 AngularJSアプリケーションは、JavaバックエンドRESTエンドポイント経由でキー(234532453455)で保存状態を取得しようとします。

正常に機能しますか?

また、私は現在、ESでのドキュメントの重複を防ぐ方法を疑っています。今私はESの経験がないので、この目的のためにどのようなアプローチをESから利用できるのか分かりません。

たとえば、各JSONドキュメントのハッシュコードを計算し、このハッシュコードをドキュメントのキーとして保存することをお勧めします。新しいドキュメントを保存する前に、古いドキュメントをハッシュコードでチェックすることができます。また、パフォーマンスは私にとって非常に重要ですので、これも考慮してください。

答えて

1

私にとっては、キャッシュを実装しようとしているようです。

はい、これを行うことはできますが、このソリューションにのみESを使用する場合は、redisまたはmemcachedをよく調べてください。

私はESがこれに対して悪い解決策だとは言えませんが、ESにはnear realtime searchのように覚えておく必要があるいくつかの秘訣があります。データを索引付けした後はすぐに検索することはできませんが、構成に応じて数秒かかる(ただし、_refreshも呼び出すことができますが、データの索引付けを頻繁に行うとパフォーマンスについてはわかりません)。

ハッシュ:使用する理由がわかりませんが、正しいIDを作成する方が良いでしょう。だから、IDごとにユーザごとのレポートのタイプがある場合、"reporttype_ {userid}"になる可能性があります。ハッシュをIDとして使用すると、新しいオブジェクトはそれぞれ新しいIDを持ち、書き換えの代わりに多くのそのユーザーの古いデータのコピー。パターンreporttype_ {userid}を使用すると、ユーザーが新しいデータでレポートを再生成するたびに、それを上書きします。あなたがそのオプションフィールドに追加することができます。オプションとして

あなたはクリーンアップが報告書を期限切れになる仕事をしている可能性がありますが、これはあなたがするので、ESで行く場合にのみ有効です。例えばユーザーIDと将来のクリーンアップのためのexpireat、 redisとmemcachedには、データを保存するときに有効期限を設定するオプションがあります。

+0

詳細な回答ありがとうございます。私は「技術的な動物園」を避けるためにESについて考えていました..これは私のプロジェクトの検索エンジンとしてESを使用するためです。 "近リアルタイム検索"機能を考慮に入れて、私はレディスがこのような種類のキャッシュに適していると考えています。 – alexanoid

+0

また、データやプロジェクトの性質上、実際には "レポートタイプ"や "ユーザーID"データキー私はユーザーのCRC32(JSON文字列のために計算される)を私の文書のキーとして使用します。 – alexanoid

+0

そして、今の主な基準 - 私は自分自身(私が提供する)IDでセット/ゲット操作のために非常に高速なストレージが必要です。私はレディスがこの目的のために良い選択になることを願っています。 – alexanoid

関連する問題