I am raising an issue with regards to a support case number 10276834.
Our client has observed an issue with data being significantly delayed. The data is captured by our application which uses the RFA .NET library to subscribe to many thousands of RICs and process responses. We use Elektron with EZD tool to open the tunnel. We have been on several calls with Elektron backend team who have ruled out delay issues with Elektron distributing the messages. There are also no connection issues. What we are seeing is slow processing of responses for subscribed RICs.
What we have left to look at is the RFA library inside our application. We suspect that there is potentially an issue with the rate of processing received messages. We use the ProcessEvent delegate method to process received messages and also use the EventQueue via the Create method. I see that there are several Register methods in the EventQueue class which we don't use. In particular the RegisterHighThresholdNotificationClient method.
Are you able to advise:
1. If there are any limits/issues around throughput rates of received messages in this library?
2. If we can change any of the configuration to improve throughput
3. Would it be possible to organise a call to assist/review our use of this library
4. You have been made aware of similar issues in the past
5. Should we be using any of the HighThreshold methods of EventQueue
Could you please let us know the following information?
This issue may be a slow consumer problem ( i.e. the application cannot keep up with the update rate and the messages are filing up in the RFA event queue). You can find more detail regarding a slow consumer problem via the following old posts:
No noticeable memory growth issues.
\Connections\Connection_RSSL\connectionType = "RSSL"
\Connections\Connection_RSSL\rsslPort = "14002"
\Connections\Connection_RSSL\hostName = "127.0.0.1"
\Logger\AppLogger\fileLoggerEnabled = true
\Logger\AppLogger\windowsLoggerEnabled = false
\Logger\ComponentLoggers\Connections\messageFile = "RFA8_Connections"
\Logger\ComponentLoggers\RSSL_Adapter\messageFile = "RFA8_RSSL_Adapter"
\Logger\ComponentLoggers\RSSL_Cons_Adapter\messageFile = "RFA8_RSSL_Cons_Adapter"
\Logger\ComponentLoggers\RSSL_Prov_Adapter\messageFile = "RFA8_RSSL_Prov_Adapter"
\Logger\ComponentLoggers\SessionCore\messageFile = "RFA8_SessionLayer"
\Logger\ComponentLoggers\Static\messageFile = "RFA8_MsgFile"
\Sessions\Session1\connectionList = "Connection_RSSL"
I will look at creating a secondary queue to deal with all responses and to remove all processing logic from the ProcessEvent method.
This indeed looked like a slow consumer issue.
Our new implementation is handling this much better now.
As a suggestion, it might be worthwhile to create an explicit code example that is high performant in the examples section so to avoid these kind of questions in the future.