OpenStack nofitier 示例

本文详细介绍了OpenStack中通知系统的运作原理。通知侦听器如何处理来自不同客户端的通知消息,包括消息的订阅、接收和处理流程。同时,还讨论了通知过滤器的作用以及如何通过池名称来控制通知的分发。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://docs.openstack.org/oslo.messaging/latest/reference/notification_listener.html

通知侦听器用于处理使用messaging驱动程序的通知程序发送的通知消息

通知监听器在提供的目标中订阅该主题 - 并且可选地交换 - 。通知程序客户端发送到目标主题/交换的通知消息由侦听器接收。

果多个侦听器订阅相同的目标,则通知将仅由其中一个侦听器接收。使用尽力而为的循环算法从组中选择接收侦听器。

通过指定侦听器的池名称可以稍微改变此传送模式。具有相同池名称的听众表现得像订阅相同话题/交换的听众组中的一个小组。监听器的每个子组都将收到要由小组的一个成员使用的通知的副本。因此,将传递通知的多个副本 - 一个传递给没有池名称(如果存在)的侦听器组,以及一个侦听器的每个子组共享相同的池名称。

请注意,并非所有传输驱动程序都已实现对侦听器池的支持。如果池名称指定为get_notification_listener(),那些不支持池的驱动程序将引发NotImplementedError。

通知侦听器公开了许多端点,每个端点都包含一组方法。每个方法的名称对应于通知的优先级。当收到通知时,它将被分派到名为通知优先级的方法 - 例如info通知被分派到info()方法等。

可选地,通知端点可以定义一个NotificationFilter。不符合过滤器规则的通知消息不会传递到端点的方法。

端点方法的参数是:客户端提供的请求上下文,通知消息的publisher_id,event_type,有效负载和元数据。元数据参数是包含唯一message_id和时间戳的映射。

端点方法可以明确返回oslo_messaging.NotificationResult.HANDLED来确认消息或oslo_messaging.NotificationResult.REQUEUE来重新发送消息。请注意,并非所有的传输驱动程序都支持重新进行请求。为了使用此功能,应用程序应该通过将allow_requeue = True传递给get_notification_listener()来声明该功能是可用的。如果驱动程序不支持requeueing,则会在此时引发NotImplementedError。

仅当所有端点返回oslo_messaging.NotificationResult.HANDLED或None时才会确认该消息。

每个通知监听器都与一个执行程序相关联,该执行程序控制着将如何接收和分派传入通知消息。有关其他类型的执行程序的说明,请参阅Executor文档。

注意:如果使用“eventlet”执行程序,则需要对线程和时间库进行monkeypatched。

通知侦听器具有start(),stop()和wait()消息以开始处理请求,停止处理请求并在侦听器停止后等待所有进程内请求完成。

要创建通知侦听器,您需要提供传输,目标列表和端点列表。

只需调用get_notification_transport()方法即可获得传输方式:

#notification_listener.py
from oslo_config import cfg
import oslo_messaging as messaging

class NotificationEndPoint(object):
    def warn(self, ctxt, publisher_id, event_type, payload, metadata):
        #do_something(payload)
        print 'warn'

class ErrorEndpoint(object):
    def error(self, ctxt, publisher_id, event_type, payload, metadata):
        #do_something(payload)
        print 'publisher_id=%s, event_type=%s, payload=%s, metadata=%s' %(publisher_id,event_type,payload,metadata)


transport = messaging.get_transport(cfg.CONF)
targets = [
    messaging.Target(topic='notifications'),
    messaging.Target(topic='notifications_bis')
]
endpoints = [
    NotificationEndPoint(),
    ErrorEndpoint(),
]
listener = messaging.get_notification_listener(transport,
                                               targets,
                                               endpoints)

listener.start()
listener.wait()
#notification_send.py
from oslo_config import cfg 
import oslo_messaging as messaging 
transport = messaging.get_transport(cfg.CONF) 
notifier = messaging.Notifier(transport, driver='messaging', topic='notifications') 

notifier2 = notifier.prepare(publisher_id='compute') 

notifier2.error(ctxt={}, event_type='my_type', payload={'content': 'error occurred'})

notifier2.warn(ctxt={}, event_type='my_type', payload={'content': 'error occurred'})
启动了多个notification_listener,使用notification_send发送,每次只有一个notification_listener,收到消息,符合官方解释的notification_filter。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值