从前端发起一个控制消息,到后台MN(Managementnode)接受处理,中间经历了哪些流程,消息是怎样一步步传输的?这篇博客,我们就以创建虚拟机为例,看看消息是怎么一步步处理的。

Zstack的消息都是通过消息中间件RabbitMQ来进行的传递。前端发起了http请求,实际上是通过RabbitMQ进行的实际的转发。发送到后台MN部分,由RabbitMQ接受解析,从而进行处理。

基本的大的步骤,肯定是先Dashboard发起一个控制消息,然后Managementnode接收到这个消息,然后具体地去做处理。最后返回处理结果给Dashboard。我们接下来一个个去梳理。

场景:前端发起创建虚拟机VM的请求

第一部分:Dashboard发起请求

创建虚拟机的消息名称是:APICreateVmInstanceMsg。首先是Dashboard向MN发起请求。那么是怎么发送过去的呢?是直接通过RESTful形式请求吗?其实不是的,是通过消息中间件RabbitMQ传输的。

可以在dashboard/web.py中查看发送远程消息请求代码:

   def send(self, msg):
        if self.STATUS_READY != self._status:
            raise Exception('the rabbitmq connection is not ready yet')

        try:
            with kombu.producers[self.conn].acquire(block=True) as producer:
                producer.publish(msg, exchange=self.P2P_EXCHANGE, routing_key=self.API_SERVICE_ID)
        except Exception as ce:
            if self._is_connection_error(ce):
                log.warn('lost connection to %s, %s' % (self._current_url, str(ce)))
                self._do_initalize_in_thread()
                raise

可以看到这里是一个producer生成者向MQ发送了一个消息。那这个消息格式长什么样呢?Here you are:
这里写图片描述

这个消息是一个创建虚拟机的消息。这是发送的Message的主体部分。可以看出这是一个符合json格式的消息,包含了创建一个虚拟机所需要的所有信息。当后台在收到这个消息的时候会根据这个消息进行虚拟机创建。那么后台是怎么收到的呢?

其实在发送消息的时候,因为是发送给RabbitMQ的,因此需要指定消息的label(RabbitMQ的知识)。在发送消息的时候,在dashboard工程下的web.py(335)行的send方法可以看到,发送给RabbitMQ消息的label是serviceID。这个serviceID是每种类别的消息,可以从api_messages.py里面看到有哪些类别。同一个类别的消息会发给该类对应的消息分发器去分发处理消息。
因此这里由于我们是创建虚拟机消息,可以看到label是header,因此这里我们猜测,Managementnode在启动时,会创建队列名叫“header”的queue。这样前台把消息传个RabbitMQ的时候,就可以直接转到对应的队列里面去了。

那后台是如我们猜想的那样吗?

第二部分:Managementnode接受请求

Updating

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐