c++ - Thrift - 每个套接字都有不同的 Handler 实例

标签 c++ sockets cassandra thrift

我正在 Thrift 中开发“代理”服务器。我的问题是,每个连接到代理的连接都使用相同的处理程序实例。代理的客户端实现在 Handler 中,因此所有客户端都通过相同的连接与终端服务器进行通信。

我有:n 个客户端 -> n 个套接字 -> 1 个处理程序 -> 1 个套接字 -> 1 个服务器 我想要实现的是:n 个客户端 -> n 个套接字 -> n 个处理程序 -> n 个套接字 -> 1 个服务器

现在的问题是,如果客户端更改服务器上的“本地”参数(为每个客户端独立定义的参数),其他客户端也将在更改后的环境中工作。

shared_ptr<CassProxyHandler> handler(new CassProxyHandler(adr_s,port_s,keyspace));
shared_ptr<TProcessor> processor(new CassandraProcessor(handler));
shared_ptr<TServerTransport> serverTransport(new TServerSocket(port));
shared_ptr<TTransportFactory> transportFactory(new TFramedTransportFactory());
shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory());
TThreadedServer server(processor, serverTransport, transportFactory, protocolFactory);
server.serve();

有没有办法实现一个服务器,为每个服务器套接字创建一个新的处理程序实例,而不是使用相同的处理程序?

感谢您的任何建议或帮助, @

最佳答案

我已经设法解决了这个问题。已经有一个用 Java 实现的解决方案。我使用了相同的想法并在 C++ 中实现了它。

我做的第一件事是创建了一个 TProcessorFactory 而不是 TTransport 类。这会处理每个连接的 TProcessors。它里面有一个map结构,所以它的get函数为每个TTransport返回对应的TProcessor。每个客户端对应的(唯一的)TProcessor。

我必须创建一个新的 TServer,因此它会接受新创建的参数 TProcessorFactory 而不是 TProcessor。在 TServer 中还需要更改几个函数调用。您的 getProcessor 函数将不再返回 TProcessor,而是返回 TProcessorFactory(因此更改返回类型并重命名)。

您要做的最后一件事是实现一个允许实例化的服务器,即 TServer 的派生类。我建议使用 TNonblockingServer(实现更改有点困难)或 TThreadPoolServer。您必须更改几个函数调用。在 TProcessorFactory 上使用带有 TTransport 参数的 get 函数在需要的地方获取 TProcessor。 TTransport 参数对于每个线程都是唯一的,每个客户端连接都由一个线程处理。

还要确保删除旧的 TProcessors,因为 thrift 重用(至少使用 TNonblockingServer)TTransport,所以如果你不删除它们并且客户端连接,他可能会得到一个不活动的先前 session ,而你可能不会不想要它。如果使用共享指针,只需将它们从 map 结构中移除,当客户端断开连接时,如果 thrift 不再需要它们,它们将被销毁。

我希望这对遇到我遇到的同样问题的任何人有所帮助。如果您不知道 thrift 的内部结构,这里有一个很好的指南:http://diwakergupta.github.com/thrift-missing-guide/

我希望 Thrift 开发人员能够在不久的将来实现类似但更复杂和抽象的解决方案。

@

关于c++ - Thrift - 每个套接字都有不同的 Handler 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6622682/

相关文章:

c++ - 有没有一种标准的方法来捕获在 linux 和 windows 的 c++ 应用程序中工作的键盘输入?

java - Java 中的 getHostAddress() 和 getInetAddress()

java - JAVA如何让给定长度的字节数组由其他给定长度的字节数组组成

python - 为什么 python Cassandra 驱动程序在声明为类字段时会失败?

elasticsearch - 如何将Elastic search与cassandra集成?

C++ 在类变量赋值中使用大括号

c++ - 在 Eclipse 中获取临时地址时出错

c++ - 递归划分图像并并行处理

c++ - Linux套接字编程: read data by SIGIO

Python Cassandra 驱动程序仅插入一条记录