“Don’t Reinvent the Wheel”
1. 消息总线
OpenStack遵循的设计原则:
- 项目之间通过RESTful API通信
- 项目内部,不同的服务进程的通信,必须通过消息总线
这样既可以保证各项目对外提供服务的接口可以被不同的客户端高效支持,
又可以保证项目内部通信接口的可扩展性和可靠性,
以支持大规模的部署。
Openstack oslo.messaging库
实现了两种方式来完成项目内部各服务进程之间的通信
远程过程调用(RPC,Remote Procedure Call)
一个服务进程可以调用其他远程服务进程的方法
- call:远程方法会被同步执行,调用者会被阻塞直到结果返回
- cast:远程方法被异步执行,结果不会立即返回,调用者也不会阻塞,但是调用结果需要调用者通过其他方式查询
事件通知(Event Notification)
- 某个服务进程可以把事件通知发送到消息总线上
- 消息总线上所有对此事件感兴趣的服务进程都可以货值此事件通知,并可以进行进一步处理,处理结果并不会返回给事件发送者
- 这种通信方式,不但可以在同一个项目内部的各个服务进程中发送通知,也可以实现跨项目之间的通知发送。
2. SQLAlchemy和数据库
SQLAlchemy是Python语言对数据库操作的一个库。
提供了SQL工具包以及对象关系映射器(Object Relation Mapper,ORM)。
SQLAlchemy库包括两部分,core 和ORM
SQLAlchemy Core
包括SQL语言表达式、数据引擎、连接池等。用于链接不通类型的后台数据库、提交查询和更新SQL请求去后台执行、定义数据库数据类型和定义Schema等。
SQLAlchemy ORM
提供数据映射模式,吧程序语言的对象数据映射成数据库中的关系数据,或者把关系数据映射成对象数据
- 在openstack中,有大量的数据需要后台数据库保存维护,比如虚机的状态和各种监控数据;MySQL和Postgresql等多种数据库都可以作为openstack后台数据库,操作数据库的类封装都用到了SQLAlchemy,代码都保存在各个项目的
db
目录下。