目标

class oslo_messaging.Target(exchange=None, topic=None, namespace=None, version=None, server=None, fanout=None, legacy_namespaces=None)

标识消息的目的地。

Target 封装了标识消息应该发送到哪里或服务器正在监听哪些消息的所有信息。

Target 对象中封装的不同信息子集与 API 的各个方面相关

RPC 服务器的目标

需要 topic 和 server;exchange 是可选的

RPC 端点的目标

namespace 和 version 是可选的

RPC 客户端发送消息

需要 topic,所有其他属性可选

通知服务器的目标

需要 topic,exchange 是可选的;所有其他属性将被忽略

通知器的目标

需要 topic,exchange 是可选的;所有其他属性将被忽略

它的属性是

参数:
  • exchange (str) – 主题的作用域。如果未指定,则默认为 control_exchange 配置选项。

  • topic (str) – 一个名称,用于标识服务器公开的接口集。多个服务器可以监听一个主题,消息将以尽力而为的轮询方式分发给其中一个服务器(除非 fanout 为 True)。

  • namespace (str) – 标识服务器公开的特定 RPC 接口(即方法集)。默认接口没有命名空间标识符,称为空命名空间。

  • version (str) – RPC 接口具有与之关联的主版本号.次版本号。次版本号的增量表示向后兼容的更改,而主版本号的增量表示不兼容的更改。服务器可以实现多个主版本,并且客户端可以指示其消息需要特定的最小次版本。

  • server (str) – RPC 客户端可以请求将消息定向到特定的服务器,而不仅仅是监听主题的服务器池中的一个服务器。

  • fanout (bool) – 客户端可以通过将 fanout 设置为 True 来请求将消息的副本传递到监听主题的所有服务器,而不仅仅是其中一个服务器。

  • legacy_namespaces (list of strings) – 服务器始终接受通过“namespace”参数指定的消息,并且还可以接受通过此参数定义的的消息。应使用此选项在滚动升级期间安全地切换命名空间。

目标版本

目标版本号采用主版本号.次版本号的形式。对于版本为 X.Y 的给定消息,服务器必须标记为能够处理版本为 A.B 的消息,其中 A == X 且 B >= Y。

对于几乎全新的 API,应增加主版本号。对于现有 API 的向后兼容更改,应增加次版本号。向后兼容的更改可能是添加新方法、添加现有方法的参数(但不要求它)或更改现有参数的类型(但仍然处理旧类型)。

如果未指定版本,则默认为“1.0”。

在 RPC 的情况下,如果您希望允许您的服务器接口演进,以便客户端无需与服务器同步更新,则应注意以向后兼容的方式实现服务器更改,并让客户端为每个方法指定所需的接口版本。

将新方法添加到端点是向后兼容的更改,端点的目标版本的次版本号应增加。在客户端,新的 RPC 调用应指定特定的版本,以指示支持该方法所需的最低 API 版本。例如

def get_host_uptime(self, ctxt, host):
    cctxt = self.client.prepare(server=host, version='1.1')
    return cctxt.call(ctxt, 'get_host_uptime')

在这种情况下,版本“1.1”是支持 get_host_uptime() 方法的第一个版本。

将新参数添加到 RPC 方法可以使其向后兼容。服务器侧的端点版本应增加。该方法的实现不必期望参数存在。

def some_remote_method(self, arg1, arg2, newarg=None):
    # The code needs to deal with newarg=None for cases
    # where an older client sends a message without it.
    pass

在客户端,应进行与示例 1 相同的更改。应指定支持新参数的最低版本。