Lotus分析

Lotus的任務前端

Lotus是一個消息通知服務,topicsubscription是多對多的關係。後面我加了一個發送自定義郵件和自定義短信的功能。sql


產品裏面有個監控報警和通知列表。監控報警裏建立alarm時會讓選通知給誰。供選擇的就是topic。若是alarm被觸發,就會發通知給和該alarm綁定的topictopic再查找它的全部subscription,都發通知。數據庫



Lotus代碼分析api

 

1.lotus的兩個進程restful

lotus-apiapp

lotus-dbsync函數


2. lotus-dbsyncpost

數據流程:url

/usr/local/bin/lotus-dbsync啓動,會去調用/lotus/cmd/manage.pymain函數。spa

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 controllerstatisticstopicssubscriptionspublish

1statistics:主要用來建立metric

 

2topicsTopicsController裏面有個lookup,能夠根據topic_id路由到TopicController

TopicsController裏面有兩個提供給前端用的接口postget_all

post是建立一個topic

TopicControllergetdeleteputpublish

get:獲取一個topic(topic_id指定)的詳細信息

delete:刪除一個topic(topic_id指定)

put:修改一個topic(topic_id指定)

publish:topic(topic_id指定)的全部subscriptionalarm信息

都是對單個topic的操做。

因此我懷疑是否將TopicsController裏面的post移到TopicController裏面會更合適?

 

3subscriptions

一級SubsController, 二級是ConfirmController SubController

url查找到SubController後會根據sub_id lookupSubController

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

這一部分主要是訂閱topic,確認等內容。subscription裏面最重要的一個參數是endpoint。由於消息是發送到這個endpoint,能夠是郵箱或短信方式。這裏共兩種protocol:email和sms。

 

4publish

自定義發送郵件和短信。這部分是我寫的,比較簡單。

Publish.py 裏面有嚴重的瑕疵,我本身形成的。

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

L23-L24 8,9致使這SMS() Email() 嚴重不規範。


 

. DB

全部的服務都是基於數據。

lotus過小,目前只有三個tableTopicSubscriptionTopic_Sub

Topic存儲topic相關字段

Subscription存儲 subscription相關字段

Topic_Sub存儲topicsubscription的綁定

相關文章
相關標籤/搜索