Openstack MQ基本流程和消息样例

作者 Billy 日期 2017-03-19
Openstack MQ基本流程和消息样例

Openstack MQ基本流程和消息样例

下图为一般openstack内部交互的MQ基本流程,是根据oslo-messaging模块中的代码理解的,因为openstack中几乎所有模块都使用了oslo-messaging的代码,所以下面的流程基本可以涵盖所有MQ的交互。

下面是port更新的队列消息:

{
  "oslo.message": {
    "_context_roles": [
      "admin"
    ],
    "_msg_id": "a52069f6e2f14154b72931703323bf63",
    "args": {...}
    },
    "_context_request_id": "req-f17b602f-d6ed-465e-b170-e980b71340f5",
    "_context_domain_id": "default",
    "_unique_id": "53d520d165c94672943119f8fc01f27d",
    "_context_domain_name": "Default",
    "_context_auth_token": "c66e3c59813f4115aabe9d2f7d52e087",
    "_reply_q": "reply_a2fe3e49dbf043109c390f861f7a501a",
    "_context_show_deleted": false,
    "_context_tenant": "services",
    "_context_is_public_api": false,
    "_context_is_admin": true,
    "version": "1.13",
    "_context_read_only": false,
    "_context_user": "ironic",
    "method": "update_port"
  },
  "oslo.version": "2.0"
}

由此可见:oslo消息基本格式:

_msg_id为回复消息中须传回的值,来定位生产者一直监听的消息;
_reply_q为回复消息应该在的队列名;(该队列名由生产者缓存)
_unique_id为此队列消息的唯一id;
_method为调用的方法;
args为调用的消息内容
...

以上是我们在业务层面关心的字段。

下面是回复消息:

{
  "oslo.message": {
    "_msg_id": "49083340b9c9481087f7e0b0219e0615",
    "failure": null,
    "_unique_id": "4bae2fe3c1c641d39721132580d3d43a",
    "result": {...},
    "ending": true
  },
  "oslo.version": "2.0"
}

由此可见回复消息的基本格式:

_msg_id为消息id,须与发送的消息一致;
failure为是否失败,值为true||false;
_unique_id为此队列消息的唯一id;
ending应该是分页用的;
result为回复消息内容

我们在开发过程中,需要仿照回复消息的格式,去在指定队列中生产message,让ironic-api的监听程序得到相应,从而达到模仿ironic-conductor的目的。