public void Subscribe(string topic, Action <MPSMessage> handler)
        {
            // Mock testing of subscription.
            for (int i = 1; i <= 1500; i++)
            {
                Trade T = new Trade();
                if (i % 3 == 1)
                {
                    T.Type = TradeType.EQ;
                }
                else if (i % 3 == 2)
                {
                    T.Type = TradeType.FX;
                }
                else
                {
                    T.Type = TradeType.Opt;
                }
                T.TradeID = i;

                TradeMessageHeader header = new TradeMessageHeader()
                {
                    MessageKey = i, MessageType = TradeMessageType.Added, SequenceNumber = i
                };

                MPSMessage message = new MPSMessage()
                {
                    Header = header, Payload = T
                };
                handler.Invoke(message);
            }
        }
        public void MPSMessageHander(MPSMessage message)
        {
            // pre-checks
            // Push message to the queue
            // Optional ACK. This would mean local resilience would be required for processing queue.
            TradeMessageHeader header = message.Header as TradeMessageHeader;
            ITrade             trade  = message.Payload as ITrade;

            if (header == null)
            {
                logger.Error($"Failed to parse message with header key: {message.Header.MessageKey}");
                return;
            }

            if (trade == null)
            {
                logger.Error($"Failed to parse message with header key: {header.MessageKey} and sequence no: {header.SequenceNumber}");
                return;
            }

            TradeMessage tradeMessage = new TradeMessage()
            {
                Header = header, Trade = trade
            };

            try
            {
                AddMessage(tradeMessage);
            }
            catch (Exception ex)
            {
                logger.Warn(ex, $"Error while adding message with sequence number {tradeMessage.Header.SequenceNumber} to queue. Retrying ...");
                if (!RetryHandler(AddMessage, tradeMessage))
                {
                    logger.Error($"Retries failed for sequence number : {tradeMessage.Header.SequenceNumber}");
                }
            }
        }