一 Lotus的任務前端
Lotus是一個消息通知服務,topic和subscription是多對多的關係。後面我加了一個發送自定義郵件和自定義短信的功能。sql
產品裏面有個監控報警和通知列表。監控報警裏建立alarm時會讓選通知給誰。供選擇的就是topic。若是alarm被觸發,就會發通知給和該alarm綁定的topic,topic再查找它的全部subscription,都發通知。數據庫
二 Lotus代碼分析api
1.lotus的兩個進程restful
lotus-apiapp
lotus-dbsync函數
2. lotus-dbsyncpost
數據流程:url
/usr/local/bin/lotus-dbsync啓動,會去調用/lotus/cmd/manage.py的main函數。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 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的綁定