2017-11-24 14 views
0

내 목표는 모든 쿼리가 우리의 경우에 성능에 영향을 미치지 않도록 로깅을 사용자 정의 QueryHandler 구현을 작성하여 세션 당 고유 쿼리를 기록하는 것입니다.cassandra QueryHandler에서 각 클라이언트의 세션을 구분할 수있는 방법이 있습니까?

사례를 고려하십시오 : 사용자가 Java 클라이언트로 cassandra 클러스터에 연결하고 "select * from users where id =?" 100 번. 그리고 다른 사용자가 cqlsh에서 연결되어 동일한 쿼리를 50 번 수행했습니다. 그래서이 경우에는 두 개의 쿼리 만 기록하려고합니다. 이를 위해 로그인 당 고유 한 세션 ID가 필요합니다.

카산드라는 모든 요청을 처리하지만 api 중 어느 것도 위의 경우에 설명 된 두 개의 서로 다른 세션을 구분할 수있는 세션 ID를 제공하지 않는 인터페이스를 아래에 제공합니다.

org.apache.cassandra.cql3.QueryHandler 

참고 : 나는 remoteaddress/포트를 얻을 수 있어요하지만 난 사용자가 로그인 그는 끊 때 파괴받을 때 생성되는 몇 가지 ID를 원한다.

답변

1

queryState.getClientState().getRemoteAddress()에서 주소 + 포트는 세션 풀의 TCP 연결마다 고유합니다. 각 연결을 통해 여러 개의 동시 요청이있을 수 있으며 세션은 호스트 당 여러 개의 연결을 가질 수 있습니다. 클라이언트 측에서 한 요청에서 다른 요청으로 동일한 tcp 연결이 사용된다는 보장이 없습니다.

그러나 하나의 세션을 두 명의 다른 사용자 (연결 초기화의 일부)로 연결할 수 없으므로 설명 된 시나리오는 동일한 세션 객체 관점에서 불가능합니다. 고유성을위한 열쇠로 주소를 사용하는 것은 프로토콜/드라이버가 작동하는 방식으로 할 수있는 모든 것입니다. 그것은 최소한 것들을 조금씩 삭제할 것입니다.

실제로 로그인을 처리하고 있습니까? 아니면 비동기 해제하고 있습니까? Logback을 사용하는 경우 비동기식 appender를 사용해야하지만 게시 이벤트가 다른 서버와 동 기적으로 발생하는 경우 모든 이벤트를 대기열에 던져서 다른 스레드에서 중복 제거를 수행하면 지연 시간을 해치지 않아도됩니다.

+0

안녕하세요, Chris, 답장을 보내 주셔서 감사합니다. 난 getRemoteAddress() 다른 호스트가 동일한 기계에서 cassandra에 연결하는 다른 클라이언트가 있으며 포트가 모두 동일합니다 구별 못해. 현재 나는 asynch appender를 사용하지 않았지만 나는 그것을 시도 할 것이다. asynch appender는 또한 메모리와 CPU 활용 측면에서 약간의 단점을 가지고 있습니다. 그래서 나는 그러한 점들을 마음에두고 유지할 필요가 있습니다. 처음에는 동기화 appender 만 사용하여 성능을 테스트 할 계획이었습니다. – Laxmikant

+0

포트가 같지 않을 것이며 대상 포트는 9042가되지만 각 TCP 연결은 고유 한 소스 포트를 가지므로 커널이 어느 연결을 구별 할 수 있습니다. 그러나 세션은 연결 풀을 나타내며 여러 연결을 확장 할 수 있지만 시작일 수 있습니다. 나는 비동기를 권하고 싶다. 메모리 문제는 그것을 droppable 큐로 만들 수있다. (이것은 C *가 executor를 추적하는 것과 같다). –

+0

https://issues.apache.org/jira/browse/CASSANDRA-13983 (https://github.com/apache/cassandra/pull/169)이 관심있어 할 수도 있습니다 –