Python Twisted:将ClientFactory连接重新连接到不同的服务器

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和端口) 如

我有一个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未来版本中允许的兼容更改,此解决方案可能会失败。