async def _order_book_diff_router(self):
        """
        Route the real-time order book diff messages to the correct order book.
        """
        last_message_timestamp: float = time.time()
        messages_queued: int = 0
        messages_accepted: int = 0
        messages_rejected: int = 0
        address_token_map: Dict[
            str, any] = await self._data_source.get_all_token_info()
        while True:
            try:
                ob_message: BambooRelayOrderBookMessage = await self._order_book_diff_stream.get(
                )
                base_token_address: str = ob_message.content["event"][
                    "baseTokenAddress"]
                quote_token_address: str = ob_message.content["event"][
                    "quoteTokenAddress"]
                base_token_symbol: str = address_token_map[base_token_address][
                    "symbol"]
                quote_token_symbol: str = address_token_map[
                    quote_token_address]['symbol']
                trading_pair_symbol: str = f"{base_token_symbol}-{quote_token_symbol}"

                if trading_pair_symbol not in self._tracking_message_queues:
                    messages_queued += 1
                    # Save diff messages received before snapshots are ready
                    self._saved_message_queues[trading_pair_symbol].append(
                        ob_message)
                    continue
                message_queue: asyncio.Queue = self._tracking_message_queues[
                    trading_pair_symbol]
                # Check the order book's initial update ID. If it's larger, don't bother.
                order_book: BambooRelayOrderBook = self._order_books[
                    trading_pair_symbol]

                if order_book.snapshot_uid > ob_message.update_id:
                    messages_rejected += 1
                    continue
                await message_queue.put(ob_message)

                if ob_message.content[
                        "action"] == "FILL":  # put FILL messages to trade queue
                    trade_type = float(TradeType.BUY.value) if ob_message.content["type"] == "BUY" \
                        else float(TradeType.SELL.value)
                    self._order_book_trade_stream.put_nowait(
                        OrderBookMessage(OrderBookMessageType.TRADE, {
                            "symbol":
                            trading_pair_symbol,
                            "trade_type":
                            trade_type,
                            "trade_id":
                            ob_message.update_id,
                            "update_id":
                            ob_message.timestamp,
                            "price":
                            ob_message.content["order"]["price"],
                            "amount":
                            ob_message.content["order"]
                            ["filledBaseTokenAmount"]
                        },
                                         timestamp=ob_message.timestamp))

                messages_accepted += 1

                # Log some statistics.
                now: float = time.time()
                if int(now / 60.0) > int(last_message_timestamp / 60.0):
                    self.logger().debug(
                        "Diff messages processed: %d, rejected: %d, queued: %d",
                        messages_accepted, messages_rejected, messages_queued)
                    messages_accepted = 0
                    messages_rejected = 0
                    messages_queued = 0

                last_message_timestamp = now
            except asyncio.CancelledError:
                raise
            except Exception:
                self.logger().network(
                    f"Unexpected error routing order book messages.",
                    exc_info=True,
                    app_warning_msg=
                    f"Unexpected error routing order book messages. Retrying after 5 seconds."
                )
                await asyncio.sleep(5.0)
    async def _order_book_diff_router(self):
        """
        Route the real-time order book diff messages to the correct order book.
        """
        last_message_timestamp: float = time.time()
        messages_queued: int = 0
        messages_accepted: int = 0
        messages_rejected: int = 0

        while True:
            try:
                ob_message: IDEXOrderBookMessage = await self._order_book_diff_stream.get(
                )
                trading_pair: str = ob_message.trading_pair

                if trading_pair not in self._tracking_message_queues:
                    messages_queued += 1
                    # Save diff messages received before snapshots are ready
                    self._saved_message_queues[trading_pair].append(ob_message)
                    continue
                message_queue: asyncio.Queue = self._tracking_message_queues[
                    trading_pair]
                # Check the order book's initial update ID. If it's larger, don't bother.
                order_book: IDEXOrderBook = self._order_books[trading_pair]

                if order_book.snapshot_uid > ob_message.update_id:
                    messages_rejected += 1
                    continue
                await message_queue.put(ob_message)

                if ob_message.content[
                        "event"] == "market_trades":  # put trade messages to trade queue
                    trade_type = float(TradeType.BUY.value) if ob_message.content["type"].upper() == "BUY" \
                        else float(TradeType.SELL.value)
                    self._order_book_trade_stream.put_nowait(
                        OrderBookMessage(
                            OrderBookMessageType.TRADE, {
                                "trading_pair": ob_message.content["market"],
                                "trade_type": trade_type,
                                "trade_id": ob_message.content["tid"],
                                "update_id": ob_message.timestamp,
                                "price": ob_message.content["price"],
                                "amount": ob_message.content["amount"]
                            },
                            timestamp=ob_message.timestamp))

                messages_accepted += 1

                # Log some statistics.
                now: float = time.time()
                if int(now / 60.0) > int(last_message_timestamp / 60.0):
                    self.logger().debug(
                        "Diff messages processed: %d, rejected: %d, queued: %d",
                        messages_accepted, messages_rejected, messages_queued)
                    messages_accepted = 0
                    messages_rejected = 0
                    messages_queued = 0

                last_message_timestamp = now
            except asyncio.CancelledError:
                raise
            except Exception:
                self.logger().network(
                    f"Unexpected error routing order book messages.",
                    exc_info=True,
                    app_warning_msg=
                    f"Unexpected error routing order book messages. Retrying after 5 seconds."
                )
                await asyncio.sleep(5.0)
    async def _order_book_diff_router(self):
        """
        Route the real-time order book diff messages to the correct order book.
        """
        last_message_timestamp: float = time.time()
        message_queued: int = 0
        message_accepted: int = 0
        message_rejected: int = 0
        while True:
            try:
                ob_message: BittrexOrderBookMessage = await self._order_book_diff_stream.get(
                )
                trading_pair: str = ob_message.trading_pair
                if trading_pair not in self._tracking_message_queues:
                    message_queued += 1
                    # Save diff messages received before snaphsots are ready
                    self._saved_message_queues[trading_pair].append(ob_message)
                    continue
                message_queue: asyncio.Queue = self._tracking_message_queues[
                    trading_pair]
                # Check the order book's initial update ID. If it's larger, don't bother.
                order_book: BittrexOrderBook = self._order_books[trading_pair]

                if order_book.snapshot_uid > ob_message.update_id:
                    message_rejected += 1
                    continue
                await message_queue.put(ob_message)
                message_accepted += 1

                if len(ob_message.content["f"]) != 0:
                    for trade in ob_message.content["f"]:
                        trade_type = float(TradeType.SELL.value) if trade["OT"].upper() == "SELL" \
                            else float(TradeType.BUY.value)
                        self._order_book_trade_stream.put_nowait(
                            OrderBookMessage(OrderBookMessageType.TRADE, {
                                "trading_pair": ob_message.trading_pair,
                                "trade_type": trade_type,
                                "trade_id": trade["FI"],
                                "update_id": trade["T"],
                                "price": trade["R"],
                                "amount": trade["Q"]
                            },
                                             timestamp=trade["T"]))

                # Log some statistics
                now: float = time.time()
                if int(now / 60.0) > int(last_message_timestamp / 60.0):
                    self.logger().debug(f"Diff message processed: "
                                        f"{message_accepted}, "
                                        f"rejected: {message_rejected}, "
                                        f"queued: {message_queue}")
                    message_accepted = 0
                    message_rejected = 0
                    message_queued = 0

                last_message_timestamp = now

            except asyncio.CancelledError:
                raise

            except Exception:
                self.logger().network(
                    f"Unexpected error routing order book messages.",
                    exc_info=True,
                    app_warning_msg=
                    f"Unexpected error routing order book messages. Retrying after 5 seconds.",
                )
                await asyncio.sleep(5.0)