2017-11-24 23 views
0

私の目的は、カスタムQueryHandler実装を記述することでセッションごとにユニークなクエリを記録することです。cassandra QueryHandlerで各クライアントのセッションを区別する方法はありますか?

ケースを検討する:ユーザがJavaクライアントでcassandraクラスタに接続し、「select * from users where id =?」を実行すると、 100回。 他のユーザーがcqlshから接続し、同じクエリを50回実行しました。だから私はこの場合2つのクエリだけを記録したい。そのためには、ログインごとに固有のセッションIDが必要です。

Cassandraは、すべてのリクエストが上がるが、そのapiのいずれも上記の2つの異なるセッションを区別するためのsessionIdを提供しないインターフェースを提供する。

org.apache.cassandra.cql3.QueryHandler 

注:私は[リモート/ポートを取得することができるが、私は、ユーザーがログインしたときに作成され、彼は切断時に破壊され得るいくつかのidをしたいです。

答えて

1

queryState.getClientState().getRemoteAddress()では、address + portは、セッションプール内のTCP接続ごとに一意になります。各接続で複数の同時リクエストが存在する可能性があり、セッションはホストごとに複数の接続を持つことができます。同じtcp接続がクライアント側のある要求から別の要求に使用されるという保証もありません。

ただし、1つのセッションを2人の異なるユーザー(接続の初期化の一部)として接続することはできません。そのため、説明したシナリオは同じセッションオブジェクトの観点からは不可能です。一意性の鍵としてアドレスを使用することは、プロトコル/ドライバがどのように動作するかを考えれば可能です。それは少なくとも物事を少しだけ控除します。

あなたは実際にログインをインラインで処理していますか、非同期でオフにしていますか? logbackを使用している場合は、非同期アペンダを使用する必要がありますが、投稿したイベントが別のサーバと同期している場合は、すべてのイベントをキューに投げて、別のスレッドで重複排除を実行して待ち時間を傷つけないようにしてください。

+0

こんにちはクリス、返信いただきありがとうございます。私はgetRemoteAddress()はホストと同じマシンからのcassandraに接続している別のクライアントがあり、ポートがすべて同じである場合に区別しません。現在、私はアインシュンアペンダーを使用していませんでしたが、私もそれを試みます。 asynch appenderにはメモリとCPU使用率に関していくつかの欠点もあります。その点を念頭に置いて設定する必要があります。最初は、同期アペンダーだけでパフォーマンスをテストする予定でした。 – Laxmikant

+0

ポートは同じではなく、宛先ポートは9042ですが、各tcp接続には固有の送信元ポートがあり、カーネルはどの接続に接続するかを区別できます。しかし、セッションは接続のプールを表しているので、複数のセッションにまたがることができますが、セッションは開始になります。私は非同期をお勧めします。メモリーの問題は、そのバッファ可能なキュー(これはC *はエグゼキュータをトレースするためのものです)にすることでカバーできます。 –

+0

https://issues.apache.org/jira/browse/CASSANDRA-13983(https://github.com/apache/cassandra/pull/169)はあなたにとって興味深いかもしれません –

関連する問題