我正在 Thrift 中开发一个“代理”服务器。我的问题是,传入代理的每个连接都使用相同的处理程序实例。代理的客户端实现位于处理程序中,因此所有客户端都通过同一连接与终端服务器进行通信。
我有: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,所以如果你不删除它们并且客户端连接,他可能会得到一个不活动的先前会话,而你可能不想要它。如果使用共享指针,只需将它们从映射结构中删除,当客户端断开连接时,如果thrift不再需要它们,它们将被销毁。
我希望这对遇到我同样问题的人有所帮助。如果您不知道 thrift 的内部结构,这里有一个很好的指南:http://diwakergupta.github.com/thrift-missing-guide/ http://diwakergupta.github.com/thrift-missing-guide/
我希望 Thrift 开发人员能够在不久的将来实现类似但更复杂和抽象的解决方案。
@
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)