1). cassandra任何一个节点都可以被客户端访问。
2). 对cassandra某个节点的访问是通过调用org.apache.cassandra.service.Cassandra的内部类Client的相应接口实现的。
3). 2)中的Cassandra这个类包含了很多内部类和一个接口(Iface)。其中的Client和Processor两个内部类都是对Iface的实现,这保证了他们的内部的所有方法是一一对应的。
4). 当Client这个内部类中的某个方法被调用的时候,该方法会用他内部的send_开头的方法发送消息,并且用recv_开头的方法接收返回的内容,容,返回的内容可能是我们想要的数据,也可能是个异常的消息,如果是异常的消息,则会在客户端生成一个相应的异常并抛出,
5). Client端send_和recv_方法同目标节点的交互是分别通过oprot和iprot的实例完成的,这两个实例是负责输入输出的,具体的功能的实现在libthrift.jar中。
6). 节点和客户端通信的连接是由libthrift.jar中的TThreadPoolServer的实例实现的,这个实例在该节点最初启动的时候被生成,并且该实例内部还保有一个2)中提到的Processor实例。TThreadPoolServer实例给Processor实例提供了输入输出实例iprot和oprot,并且通过调用Processor的processprocess(TProtocol iprot, TProtocol oprot)接口来进一步的向内传递消息。
7). 节点最初启动的初始话过程是在org.apache.cassandra.service.CassandraDaemon的setup()中完成的。
8). 在Processor的processprocess(TProtocol iprot, TProtocol oprot)会解析iprot中传入的客户端的请求,并首先解析出要调用函数的函数名字,然后通过查询processMap_来决定究竟由那个ProcessFunction实例来接收处理消息,相应的ProcessFunction实例的process(int seqid, TProtocol iprot, TProtocol oprot)被激活并开始全权负责消息的处理和反馈。
9). 相应的的ProcessFunction的实例主要负责三件事:i,进一步处理iprot传入的消息 ii,将详细的信息转发给iface的相应方法处理 iii,将得到的反馈通过oprot返回给客户端。这里的iface实例实际上是org.apache.cassandra.service.CassandraServer的一个实例,在Processor的实例创建的时候(节点启动的时候)被装入了Processor实例,但是由于ProcessFunction类是Processor的内部类,所以ProcessFunction的实例也能直接访问。
10)以上可知,最终客户端的信息是交给CassandraServer的相应方法来处理的,而thrift的相关功能只是负责了客户端和节点间的交互(9160端口),而节点之间的交互并没有使用thrift的资源。