一 Lotus的任务

Lotus是一个消息通知服务,topic和subscription是多对多的关系。后面我加了一个发送自定义邮件和自定义短信的功能。

产品里面有个监控报警和通知列表。监控报警里创建alarm时会让选通知给谁。供选择的就是topic。如果alarm被触发,就会发通知给和该alarm绑定的topic,topic再查找它的所有subscription,都发通知。


Lotus代码分析

1.lotus的两个进程

lotus-api

lotus-dbsync

2. lotus-dbsync

数据流程:

/usr/local/bin/lotus-dbsync启动,会去调用/lotus/cmd/manage.py的main函数。

main里会调用/lotus/db/migration.py里的dbsync函数。

migration.py里的dbsync调用了/lotus/common/utils里的LazyPluggable来动态获取backend以实现升级或降低到指定版本。

sqlalchemy='lotus.db.sqlalchemy.migration'作为LazyPluggable的第四个参数,会在
lotus.db.sqlalchemy.migration里进行版本比较来实现升级或降级。

最底层的升级或降级或在migrate这个第三方库里实现,这里只调用接口即可。

这个进程的任务是对数据库的升级或降级。取决于指定的版本号。不过一般用来升级到最新。

3. lotus-api

lotus-api可以理解成跑在simple_server上的一个pecan
app。它的任务是给前端提供restful
api。

用的是pecan的路由规则。

比如:v1/topics,就会到v1这个目录里找topics.py,然后在根据是什么方法(POST/PUT等)或参数(topic_id)来确定具体调用哪个API。

目前只有有四个root
controller:statistics,topics,subscriptions,publish

(1)statistics:主要用来创建metric

(2)
topics:TopicsController里面有个lookup,可以根据topic_id路由到TopicController

TopicsController里面有两个提供给前端用的接口post和get_all。

post是创建一个topic。

TopicController:get,delete,put,publish

get:获取一个topic(由topic_id指定)的详细信息

delete:删除一个topic(由topic_id指定)

put:修改一个topic(由topic_id指定)

publish:给topic(topic_id指定)的所有subscription发alarm信息

都是对单个topic的操作。

所以我怀疑是否将TopicsController里面的post移到TopicController里面会更合适?

(3)
subscriptions:

一级SubsController,
二级是ConfirmController 和SubController。

url查找到SubController后会根据sub_id
lookup到SubController。

而ConfirmController的路由是由SubsController里面confirm
= ConfirmController()指定。

这一部分主要是订阅topic,确认等内容。subscription里面最重要的一个参数是endpoint。因为消息是发送到这个endpoint,可以是邮箱或短信方式。这里共两种protocol:email和sms。

(4)publish:

自定义发送邮件和短信。这部分是我写的,比较简单。

Publish.py
里面有严重的瑕疵,我自己造成的。

L8-L9 只能import
module(PEP8规定)

L23-L24 8,9导致这SMS()
Email() 严重不规范。

三.
DB

所有的服务都是基于数据。

lotus太小,目前只有三个table:Topic,Subscription,Topic_Sub

Topic存储topic相关字段

Subscription存储
subscription相关字段

Topic_Sub存储topic和subscription的绑定

Lotus分析的更多相关文章

  1. Lotus Blossom 行动分析

    1 漏洞介绍 1.1 代号 - Lotus Blossom行动 漏洞利用率很高 从2012 -2015或者说最近都还在使用 CVE-2012-0158 Lotus Blossom--莲花: 描述了对东 ...

  2. b2c项目基础架构分析(二)前端框架 以及补漏的第一篇名词解释

    继续上篇,上篇里忘记了也很重要的前端部分,今天的网站基本上是以一个启示页,然后少量的整页切换,大量的浏览器后台调用web服务局部.动态更新页面显示状态这种方式在运作的,从若干年前简单的ajax流行起来 ...

  3. b2c项目基础架构分析(一)b2c 大型站点方案简述 已补充名词解释

    我最近一直在找适合将来用于公司大型bs,b2b b2c的基础架构. 实际情况是要建立一个bs架构b2b.b2c的网站,当然还包括wap站点.手机app站点. 一.现有公司技术人员现状: 1.熟悉asp ...

  4. Lotus 迁移到Exchange 2010 之准备使用Transport 同步Lotus 相关信息!

    这里我们先来分析下Lotus迁移到Exchange2010 的一些原理,由于存在一定周期的共存时间,因此在共存期间必须来实现相应的同步计划,整个同步计划包含了如下的同步计划:

  5. 使用awstats分析iis站点的日志

    环境:win7 + iis7 + perl(ActivePerl-5.20.1.2000) + awstats 7.3 一.找到iis日志所在目录 建议全部都打勾 二.安装perl AWStats是p ...

  6. Nmon 性能:分析 AIX 和 Linux 性能的免费工具

    原文摘自: http://www.ibm.com/developerworks/cn/aix/library/analyze_aix/ 官网:http://www.ibm.com/developerw ...

  7. 52. 模版和设计元素——Lotus Notes的代码重用

    不论是理论上还是实用上,代码重用都是编程的一个重要议题.可以从两个角度来讨论代码重用. 一是逻辑上代码以怎样的方式被重用.既可以通过面向对象的思想普及以来耳熟能详的继承的方式.比如先建了一个车的基类, ...

  8. NSA Fuzzbunch分析与利用案例

    Shadow Brokers泄露出一份震惊世界的机密文档,其中包含了多个 Windows 远程漏洞利用工具.本文主要介绍了其中一款工具Fuzzbunch的分析与利用案例 1 整体目录介绍 解压EQGR ...

  9. BestCoder Round #91 1002 Lotus and Horticulture

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6012 题意: 这几天Lotus对培养盆栽很感兴趣,于是她想搭建一个温室来满足她的研究欲望. Lotus ...

随机推荐

  1. C3p0/元数据/内省-Bean/自定义查询封装类/查询/分页

    c3p0连接池(C3p0连接池,只有当用户获取连接时,才会包装Connection.) 第一步:导入c3p0 第二步:在classpath目录下,创建一个c3p0-config.xml 第三步:创建工 ...

  2. Android 签名(6)编译时源码的签名

    1,使用源码中的默认签名 在源码中编译一般都使用默认签名的,在某源码目录中用运行下面命令能看到签名命令. $ mm showcommands Android提供了签名的程序signapk.jar,用法 ...

  3. C# 第三方DLL,可以实现PDF转图片,支持32位系统、64位系统

    itextsharp.dll,是一个开源的在C#中用来生成PDF文档的库文件,不少C#爱好者用它制作出了PDF文档生成器.使用时只需在你的C#项目中添加引入此组件即可,使用方法网上有很多,自己查阅一下 ...

  4. C#中保留2位小数

    public static void Method() { double a = 1.991; a = Math.Round(a); Console.WriteLine("a = {0}&q ...

  5. js createElement

      http://www.w3schools.com/js/js_htmldom_nodes.asp var child = document.getElementById("p1" ...

  6. bzoj1098 1301

    这两题很类似,都是在补图上搜索 但是由于补图太大我们不能建出来 考虑先从一个点搜,每次搜可以搜的点, 然后维护一个链表,记录当前还没有搜过的点,搜过之后从链表中删除即可 type node=recor ...

  7. POJ 3436 ACM Computer Factory (拆点+输出解)

    [题意]每台计算机由P个零件组成,工厂里有n台机器,每台机器针对P个零件有不同的输入输出规格,现在给出每台机器每小时的产量,问如何建立流水线(连接各机器)使得每小时生产的计算机最多. 网络流的建图真的 ...

  8. gulp入门

    gulp是基于Nodejs的自动化任务工具,类似java中的ant,结合相关插件可方便的完成javascript/coffee/sass/less/html/image/css等文件的的测试.检查.合 ...

  9. 安装ejabberd2并配置MySQL为其数据库

    以前用过openfire做为服务器,但是openfire的集群支持不是很好,所以改用Ejabberd,由于它是用Erlang语言开发的,其并发率与分布式的功能都是很强悍的,在此我记录一下我的安装与配置 ...

  10. Discuz!NT中的Redis架构设计

    在之前的Discuz!NT缓存的架构方案中,曾说过Discuz!NT采用了两级缓存方式,即本地缓存+memcached方式.在近半年多的实际运行环境下,该方案经受住了检验.现在为了提供多样式的解决方案 ...