Python Twisted:将ClientFactory连接重新连接到不同的服务器
我有一个twisted ReconnectingClientFactory,我可以成功地连接到此工厂的给定ip和端口耦合。而且效果很好 reactor.connectTCP(ip、端口、MyHandsomereConnectionClientFactory) 在这种情况下,当服务器离开时,MyHandsomereConnectionClientFactory会尝试连接相同的ip和端口(如预期的那样) 我的目标是,当服务于给定ip和端口对的服务器消失时,连接到备份服务器(具有不同的ip和端口)Python Twisted:将ClientFactory连接重新连接到不同的服务器,python,python-2.7,twisted,failover,Python,Python 2.7,Twisted,Failover,我有一个twisted ReconnectingClientFactory,我可以成功地连接到此工厂的给定ip和端口耦合。而且效果很好 reactor.connectTCP(ip、端口、MyHandsomereConnectionClientFactory) 在这种情况下,当服务器离开时,MyHandsomereConnectionClientFactory会尝试连接相同的ip和端口(如预期的那样) 我的目标是,当服务于给定ip和端口对的服务器消失时,连接到备份服务器(具有不同的ip和端口) 如
如果您对如何实现此目标有任何想法/意见,我们将不胜感激。
重新连接ClientFactory
不具备此功能。您可以构建自己的工厂来实现这种重新连接逻辑,主要是通过挂接到clientConnectionFailed
factory方法。调用此函数时,如果您认为原因是切换服务器(例如,twisted.internet.error.connectionseeded
),请选择列表中的下一个地址,并使用相应的reactor.connectXYZ
方法尝试连接到该地址
您也可以尝试将其构造为端点(这是一些人首选的较新的高级连接设置API),但处理与端点的重新连接还不是一个文档化的主题。Id尝试以下内容:
class myHandsomeReconnectingClientFactory(protocol.ReconnectingClientFactory):
def __init_(self, hosts):
# hosts should be a list of tuples (host, port)
self._hosts = hosts
def clientConnectionFailed(self, connector, reason):
if self.continueTrying:
self._try_next_host(connector)
def clientConnectionLost(self, connector, unused_reason):
if self.continueTrying:
self._try_next_host(connector)
def _try_next_host(self, connector):
# round robing of servers
to_try = self._hosts.pop(0)
self._hosts.append(to_try)
connector.host, connector.port = to_try
self.connector = connector
self.retry()
我还没有实际测试过它,但至少它应该给你一个好的起点。好运气
host
和port
都不是IConnector
的公共属性。由于Twisted未来版本中允许的兼容更改,此解决方案可能会失败。