2013-01-10 2 views
4

У меня есть скрученный ReconnectingClientFactory, и я могу успешно подключиться к данным ip и портовой паре с этой фабрикой. И это работает хорошо.Twisted: ReconnectingClientFactory подключение к различным серверам

reactor.connectTCP (IP, порт, myHandsomeReconnectingClientFactory)

В этой ситуации, когда сервер ушел, myHandsomeReconnectingClientFactory пытается соединиться же IP и порт (как и ожидалось).

Моя цель заключается в том, что сервер, обслуживающий данную пару ip и порт, ушел, подключившись к резервному серверу (у которого разные ip и порт).

Любые идеи/комментарии о том, как достичь этой цели, будут оценены.

ответ

3

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() 

Я на самом деле не проверял, но, по крайней мере, это должно дать вам хорошую отправную точку. Хороший урок.

+0

Ни 'host', ни' port' не являются публичными атрибутами 'IConnector'. Это решение, скорее всего, потерпит неудачу из-за разрешенных совместимых изменений в будущей версии Twisted. –

2

ReconnectingClientFactory не имеет этой возможности. Вы можете построить свою собственную фабрику, которая реализует подобную логику пересоединения, главным образом путем подключения к фабричному методу clientConnectionFailed. Когда это вызывается, и причина кажется вам подобной, оправдывает коммутирующие серверы (например, twisted.internet.error.ConnectionRefused), выберите следующий адрес в своем списке и используйте соответствующий метод reactor.connectXYZ, чтобы попробовать подключиться к нему.

Вы также можете попробовать построить это как конечную точку (это новый API настройки соединения высокого уровня, который предпочтительнее некоторых), но обработка пересоединения с конечными точками еще не является хорошо документированной темой.

Смежные вопросы