有没有办法区分cassandra QueryHandler中每个客户端的会话?

时间:2017-11-24 15:05:21

标签: cassandra cassandra-2.1

我的目标是通过编写自定义QueryHandler实现来记录每个会话的唯一查询,因为记录所有查询会导致性能受到影响。

考虑这种情况:如果用户使用java客户端连接到cassandra集群并执行"从id =?"的用户中选择* 100次。 另一个用户从cqlsh连接并执行相同的查询50次。所以我想在这种情况下只记录两个查询。为此,我需要每次登录一个唯一的会话ID。

Cassandra在下面的界面中提供了所有请求,但是没有任何api提供任何sessionId来区分上述情况中描述的两个不同的会话。

org.apache.cassandra.cql3.QueryHandler

注意:我能够获得remoteaddress / port但我想要一些在用户登录时创建的id,并在断开连接时被销毁。

1 个答案:

答案 0 :(得分:1)

queryState.getClientState().getRemoteAddress()中,会话池中每个tcp连接的地址+端口将是唯一的。但是,每个连接上可以有多个并发请求,并且会话可以为每个主机提供多个连接。也不能保证在客户端从一个请求到另一个请求使用相同的tcp连接。

但是,单个会话不能作为2个不同的用户(连接初始化的一部分)连接,因此您所描述的场景不可能从同一个Session对象的角度来看。我认为只要使用地址作为唯一性的关键,就可以了解协议/驱动程序的工作方式。它至少会扣除一些东西。

您实际上正在处理内联日志记录还是正在推迟异步?如果使用logback它应该使用异步appender但是如果你的事件同步发送到另一个服务器,可能更好的方法是将所有事件抛出到队列中并让它在另一个线程中进行重复数据删除,这样你就不会受到延迟的影响。