快速构建 DMS Web 应用程序之利刃: Flask + Celery + Redis + Cloudant(2)
- UID
- 1066743
|
快速构建 DMS Web 应用程序之利刃: Flask + Celery + Redis + Cloudant(2)
相关技术简介FlaskFlask 是一个基于 Python 的轻量级 Web 框架,WSGI 工具箱采用 Werkzeug,模板引擎使用 Jinja2。由于其不依赖于特殊的工具或库,并且没有数据抽象层、表单验证或是其他任何已有多种库可以胜任的功能,从而保持核心简单、易于扩展,而被定义为"微"框架。但是,Flask 可以通过扩展来添加应用功能。并且 Flask 具有自带开发用服务器和 debugger、集成单元测试和 RESTful 请求调度 (request dispatching)、支持 secure cookie 的特点。
Jinja2 是基于 Python 的模版引擎,支持 Unicode,具有集成的沙箱执行环境并支持选择自动转义。Jinja2 拥有强大的自动 HTML 转移系统,可以有效的阻止跨站脚本攻击;通过模版继承机制,对所有模版使用相似布局;通过在第一次加载时将源码转化为 Python 字节码从而加快模版执行时间。
RedisRedis 是一个使用 ANSIC 语言编写、遵守 BSD 协议、Key-Value 的存储系统。拥有支持数据持久化、支持 string、map、list、set、sorted set 等数据结构和支持数据备份的特点。
Redis 会周期性地把更新的数据写入磁盘或把修改操作写入追加的记录文件,并且在此基础上实现主从(master-slave)同步,因此数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。而且由于 Redis 完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。
MQMQ 消息队列是一种应用程序的通信方法,应用程序可通过读写出入对立的消息进行通信。MQ 是一种消费者-生产者 (Producer-Customer)模式的实现。生产者-消费者模式由生产者、消费者和缓存区三个模块构成。缓存区作为一个中介的存在,生产者将数据放入缓存区,消费者从缓存区取出数据。本系统中,Flask 作为生产者,Salesforce 作为消费者,而 MQ 则是中间的缓存区。应用生产者-消费者模式能够有效的降低两者之间的耦合,减少互相之间的依赖;由于缓存区的存在,消费者无需直接从生产者处获取数据,能够支持并发任务、减少阻塞。
RabbitMQ 则是由 erlang 开发的 AMQP(高级消息队列协议)的开源实现,作为一个消息队列管理工具与 Celery 集成后,负责处理服务器之间的通信任务。RabbitMQ 的使用过程如下:
- 客端连接到消息队列服务器并打开一个 channel。
- 客户端声明一个 exchange、一个 queue,并分别设置相关属性。
- 客户端使用 routing key 在 exchange 与 queue 之间绑定好关系。
- 客户端投递消息到 exchange,exchange 根据消息的 key 和设置好的 binding,将消息投递到队列中。
RabbitMQ 常用的 Exchange Type 有以下三种:
- Fanout:能够将所有发送到该 exchange 的消息投递到所有与它绑定的队列中。
- Direct:把消息投递到那些 binding key 与 routing key 完全匹配的队列中。
- Topic:将消息路由到 binding key 与 routing key 模式匹配的队列中。
CeleryCelery 是一个基于 Python 的分布式异步消息任务队列,通过它可以实现任务的异步处理,支持使用任务队列的方式在分布的机器、进程、线程上执行任务调度。并且 Celery 拥有任务失败或执行中断时自动尝试重新执行任务的高可用性以及处理任务的高效性。Celery 的架构是由消息中间件、任务执行单元和任务执行结果存储三部分构成的,所以在执行时需要配合一个消息中间件(Broker)来实现接收和发送任务消息,本文中消息中间件由 Redis + RabbitMQ 共同实现,RabbitMQ 作为 Broker,Redis 作为 Backend。图 2 是 Celery 的工作流程图:
图 2. Celery 工作流程图
CloudantIBM Cloudant NoSQL Database for Bluemix(简称 Cloudant)在整个系统中作为数据库存在,是以 Apache CouchDB 为基础开发的多租户、独立、安装的服务。Cloudant 是一个 NoSQL 数据库即服务(DBaaS)。该服务是一个运营数据存储,用于存储 JSON 文档并对其建立索引,并且可以处理并行的读写操作。客户可以通过 HTTP API 从应用程序获取(get)、放置(put),查询(query)JSON 文档并对其建立索引(index)。
PicklePickle 是 Python 的标准模块之一,无需单独安装,主要有以下两类接口:
- 序列化:此操作能够将程序中运行的对象信息保存到文件中,并永久存储。
- 反序列化:此操作能够从文件中创建上一次程序保存的对象。
模块化后的对象以二进制的形式保存在文件中,后缀为 .pkl。 |
|
|
|
|
|