async def METHOD_NAME(self, topic: str, callback):
    """
    Subscribe to the given topic and register a callback to
    invoke when a message is received.
    Args:
        topic: str
        callback: func
    """
    if not self._nats_client.is_connected:
        raise TTransportException(TTransportExceptionType.NOT_OPEN,
                                  'Nats is not connected')
    if self.is_subscribed():
        raise TTransportException(TTransportExceptionType.ALREADY_OPEN,
                                  'Already subscribed to nats topic')
    async def nats_callback(message):
        ret = callback(TMemoryBuffer(message.data[4:]))
        if inspect.iscoroutine(ret):
            ret = await ret
        return ret
    self._subscription = await self._nats_client.METHOD_NAME(
        'frugal.{0}'.format(topic),
        queue=self._queue,
        cb=nats_callback,
    )
    self._is_subscribed = True