您的位置:首页 > 运维架构

OpenStack通用技术——消息总线

2016-05-22 10:13 281 查看
opestack遵循这样的设计原则:

项目之间通过RESTful进行通行

项目内部,不同服务进程之间的通信,则必须要通过消息总线

这样的设计保证了项目对外提供服务的接口可以被不同类型的客户端高效支持,同时也保证了内部通信接口的可扩展性和可靠性。openstack olso.messaging库实现了以下两种发方式来完成项目内部各服务进程之间的通信:

1. 远程调度RPC:

通过远程调度,一个服务进程可以调用其他远程服务进程的方法,两种调度方式:call和cast。其中call方法会被同步执行,调用者会被阻塞直到结果返回。cast方式,会被异步执行,并不会立刻返回,调用者也也不会被阻塞,调用者需要用其他方式查询这次远程调用的结果。

2. 事件通知:

服务进程将时间通知发送到消息总线上,总线上所有堆此类事件感兴趣的服务进程都可以对此进行进一步的处理,但是处理结果并不会直接回给事件的发送者。

## AMQP ##

openstack所支持的高级消息队列中大多是基于AMQP。传递消息的中间件(server/broker),消息的生产者将消息发送server,他会根据不同的条件将消息传递个不同的消费者。
上述操作由Exchange和queue来实现。其中Exchange不会存储消息,会根据不同的条件将消息发送个不同的Queue。所谓的条件就是Binding,每一个发送的消息会有一个routingkey,同样每一个Queue也会有一个bindingkey,当两者相匹配就会发送到改消息队列(Queue)。


Direct bindingkey与routingkey相匹配

Topic 可以通过通配符“*”来进行迷糊匹配

Fanout 将消息传递到所有绑定的队列上

## 基于AMQP实现RPC##

客户端发送一个请求消息个Exchange,指定routing key位”op_queue“,同时指明一个消息队列名来获取响应”res_queue“

Exchange将消息发送给 op_queue

op_queue把消息推送给服务端,服务端执行RPC调用相应的服务,结束后将结果发给消息队列,指明routing为”res_queue“

Exchange将消息转发给res_queue

客户端从消息队列res_queue中获取响应
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  openstack