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的目的。