OpenStack通知事件处理库。

winchester的Python项目详细描述


Winchester是一个基于持久流的OpenStack通知事件处理库。


事件表示为简单的python字典。
它们应该是平面字典(不嵌套),至少有三个键:

"消息id":此事件的唯一标识符,如uuid。
"事件类型":标识事件类型的字符串。通常是一个类似"foo.bar.baz"
"timestamp"的分层虚线名称:事件发生的时间(python日期时间,以utc表示)


事件字典的各个键称为*traits*,可以是字符串、整数、浮点数或日期时间。为了处理OpenStack发出的(通常是较大的)
通知,Winchester使用
[StackDistiller库](https://github.com/stackTach/stackDistiller)从通知中提取扁平事件,只包含您实际需要处理的数据。


winchester的处理是通过*trigger s*和*pipelines*完成的。


*trigger*由*match_criteria*组成,就像一个
持久查询,将要处理的事件收集到一个
persistent*流*(存储在SQL数据库中)、一组可区分的
特征,这些特征可以将事件列表分隔成不同的流、
类似于SQL查询中的**GROUP BY**子句和*FIRE U条件*,
指定要触发的指定*流*必须匹配的条件。当它这样做时,*stream*中的事件被发送到
a*pipeline*作为*fire_pipeline*列出作为批处理。
还列出了一个*expire_timestamp*。如果此时给定流不符合
触发条件*,则该流将过期,并可以发送到
过期管道*,以进行备用处理。*fire_pipeline*
和*expire_pipeline*都是可选的,但必须至少指定其中一个


a*pipeline*只是简单的*处理程序*的列表。管道中的每个*处理程序*依次接收给定流中按时间戳排序的事件列表。*处理程序*可以从列表中筛选事件,
或向其中添加新事件。这些变化将由*处理程序*进一步
看到。*处理程序*应避免具有副作用的操作,
而不是修改事件列表,因为如果出现错误,可以稍后重新尝试管道处理。相反,如果所有处理程序都在不引发异常的情况下处理
事件列表,则会对每个处理程序进行*commit*调用,使其有机会执行操作,例如向外部系统发送数据。*处理程序*很容易编写,几乎任何实现适当的*handle_events*、*commit*和
*rollback*方法的对象都可以是*handler*

安装和运行。

winchster可以作为一个简单的python包安装。
并且在
*winchester.yaml*配置文件(示例包含在*etc*目录中)中指定了相应的数据库url,
您可以使用以下命令创建相应的数据库架构:

winchester-db-c<;path\u your配置文件>;/winchester.yaml upgrade head

如果您需要手动运行SQL,或者只想查看模式,
下面的命令将打印出相应的表创建SQL:

winchester DB-c<;path_your_config_files>;/winchester.yaml upgrade--sql head

您可以通过调用Winchester的TriggerManager的*add_event*方法将事件
添加到系统中。
如果您正在处理OpenStack通知,则可以调用*add_notification*,
这将用stackdistiller将通知缩减为一个事件,然后用它调用*add_event*。如果要从rabbitmq队列的
读取openstack通知,则有一个
[yagi](https://github.com/rackerlabs/yagi)通知处理器的插件,该插件包含在
winchester中。只需将"winchester.yagi\u handler.winchesterhandler"添加到您的*yagi.conf*部分中要侦听的队列的"apps"行中,然后添加一个:

[winchester]
config\u file=<;path\u to your配置文件>;/winchester.yaml

作为后台
后台进程运行。


Winchester在数据库中使用乐观的锁定方案来协调流的触发、过期和处理,因此您可以运行尽可能多的进程(如
Yagi的*Yagi Event*后台进程)来处理
传入的事件,以及处理结果
处理负载所需的尽可能多的*pipeline\u worker*s,水平缩放系统。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java将Scanner对象作为构造函数参数传递给UserInterface类   spring未能启动bean“subtocolWebSocketHandler”;嵌套的例外是java。lang.IllegalArgumentException:没有处理程序   Java EE应用程序中后台服务的多线程Java线程(设置守护进程和优先级)?   java Pull to refresh返回列表的第一个位置   无法将comparator类转换为java。可比的   java将json从servlet传递到dojo   JavaHibernate:将子类实例转换为超类实例   java警告调用servlet类时非法反射访问   java静态变量值   java@Entity和@embeddeble之间有什么区别   java将作业配置导入公共作业配置类(注释配置)   sql公共表表达式(以values语句开头)在java中给出错误   java在ImageJ中使用ImageProcessor   java PostgreSQL executeBatch()会随着时间的推移而变慢   java在安卓中以表格形式排列sqllite表数据?   java中SVG的swing定制呈现   java删除与另一个实体映射的实体   java何时/如何添加ListView适配器,使用back按钮恢复它?(片段)   java为什么IBinder和Binder之间的类型转换不是非法的?   java在方法参数列表中使用ArrayList或List