I’m working for Siemens on an evaluation of WAMP, the Autobahn libraries and the Crossbar.io Router. Doing so, I ran into some trouble with a test setup using AutobahnPython for the implementation of my clients and the Crossbar.io Router.
The test setup consists of one client who is calling a remote procedure at another client (once every 120 milliseconds at most). The RPC takes some time (about 4 milliseconds) to process. The Crossbar.io Router connects both clients, using WebSocket transport.
The first thing I noticed was that, after some time, the callee reported “session leaving ‘wamp.close.transport_lost’”, the router reported that the callee didn’t respond to a ping in time and the caller complained, that the callee left. After disabling the Ping in the Router Configuration the problem disappeared, so it seems that the callee can’t respond to a ping while it’s processing the Remote Procedure Call, at least not the way I implemented my callee. Is there a way I can implement my callee using Autobahn Python and still have WebSocket Pings?
I also observed another strange behavior, while testing my setup with disabled WebSocket Pings. After some time the callee took a very long time (up to 30 seconds) to process RPCs. I tried to reproduce the behavior and get as much information as possible and I came up with the following trace:
the caller calls the remote procedure (once every 120ms at most)
the Router forwards the call without any serious delay, I got this from the logfile of the Router
the callee takes a very long time until the actual user written RPC gets executed, I measured the execution time of the user written code and it didn’t change (still 4ms)
when the callee yields the result and reports that it finished executing the user written RPC, the Router forwards it without any serious delay
Could it be that this problem occurs when a remote procedure call is performed, while the result of a previous RPC wasn’t yet provided? Because my trace also showed that after the delay, multiple results of outstanding RPCs were yielded in a very short time period, almost like the client “queued them to execute them all at once and then send the results back”. I implemented a callee with the same behavior using AutobahnCpp and RawSocket communication and it works. I also ran my setup on different hardware devices to rule out other factors.
Is there a logical explanation for this behavior or could there be something wrong with my implementation after all? If you want to reproduce the error or have a look at my implementation, just let me know and I will put together a minimal example and publish it here.
Any help is very much appreciated, thanks!