The Autobahn guys still show ReconnectingClientFactory in their docs,

Where did you find that? That would be a doc bug, but in the _docs_, there is no reference to ReconnectingClientFactory

(cpy372_3) oberstet@intel-nuci7:~$ find ~/scm/crossbario/autobahn-python/docs/ -type f -exec grep -Hi "ReconnectingClientFactory" {} \;
(cpy372_3) oberstet@intel-nuci7:~$

We do have some example code using ReconnectingClientFactory though:

(cpy372_3) oberstet@intel-nuci7:~$ find ~/scm/crossbario/autobahn-python/examples/ -type f -exec grep -Hi "ReconnectingClientFactory" {} \; | wc -l
8

and I remember looking at this before and ending up going with ReconnectingClientFactory because it works and didn't look like it'd need much effort to integrated into an existing code base.

Let me count the ways.

 1. ReconnectingClientFactory is destined for deprecation, eventually.
      You should just adopt the "new" thing now so that if we get more
    energy to cycle the APIs and delete the old stuff, you'll have less
    hassle to deal with.  ("New" is in quotes here since it's been
    around for well over 3 years at this point; Autobahn should update
    too, not just you.)

Autobahn will automatically use

twisted.application.internet.ClientService

for auto-reconnect when on Twisted 16.1.0+

https://github.com/crossbario/autobahn-python/blob/master/autobahn/twisted/wamp.py#L349

 2. ClientService works with endpoints, which means you can use it with
    /any/ kind of transport, like SSH transports, subprocesses, etc.
      Most practically, it works with HostnameEndpoint which is a much
    better way to get TLS than connectSSL; ReconnectingClientFactory
    works, kind of accidentally, with TLS since connectSSL is on the
    reactor, but it won't use happy eyeballs and it won't connect over
    IPv6, so connections will be slower and less reliable.
 3. Conceptually, ClientService has a much clearer and more useful
    responsibility: its job is to /maintain a state/ (i.e.: that there
    is a single connection, that it is connected) rather than to /do a
    thing/.  For example,
     1. if you want to shut down a ReconnectingClientFactory:
         1. you have to call stopTrying, then uh...
         2. find the last protocol it built with buildProtocol, then
         3. grab its transport (hope it's saving that transport as
            '.transport', because it doesn't actually have to)
         4. call loseConnection
         5. remember to trap connectionLost so you can see when its done.
     2. if you want to shut down a ClientService
         1. call stopService
         2. wait for the Deferred that it returned to fire
 4. ClientService is (mostly) implemented using composition rather than
    inheritance, so much less of the guts of the internal implementation
    is hanging around where you might accidentally twiddle it and break
    its assumptions, so you can trust its guarantees more.

++1

(note: Autobahn is a culprit to the overuse of inheritance vs composition too .. but the so-called "new API" (for WAMP) is following composition + observer pattern, while the "old API" (that is inheriting from ApplicationSession) is still pretty much around. we have some legacy already ..)

     1. other benefits of composition: you don't have to override
        attributes of your Protocol and thereby indulge in subclassing
        yourself to get notifications; consider 'prepareConnection',
        'whenConnected'.
     2. the retry policy mechanics are better documented and much easier
        to customize
     3. it's backed by a formal state machine - not that I'm aware of
        any specific bugs in ReconnectingClientFactory but do you think
        it got /all/ of these state transitions correct:
        https://gist.github.com/glyph/614be03151556333efe04b849fa05930
 5. It's more testable because it just takes its clock and reactor as
    constructor parameters, rather than requiring post-hoc
    poorly-documented attribute patching to become testable.


Hopefully at least some of this is convincing :)

all and each of them is convincing;)


-g

_______________________________________________
Twisted-Python mailing list
Twisted-Python@twistedmatrix.com
https://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python



--

Tobias Oberstein - phone +49 176 2375 2055 - tobias.oberst...@crossbario.com
Crossbar.io GmbH - Waldstrasse 18 - 91054 Erlangen
HRB 15870 - Amtsgericht Fuerth - Geschäftsfuehrer/CEO - Tobias Oberstein

https://crossbar.io
https://crossbario.com

_______________________________________________
Twisted-Python mailing list
Twisted-Python@twistedmatrix.com
https://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python

Reply via email to