李洪昌+周磊
摘 要:針對目前傳統媒體發布形式制作成本高、內容模式固化,且市場上已有的多媒體發布系統性能單一,維護成本高,無法統一發布并規范管理的弱點,文中采用Python語言和Django框架開發了一套具有實時監控和精準推送的多媒體信息發布系統,充分利用了Python簡潔、易擴展和Django方便、快速的特點,較好地改進了傳統媒體的弊端。通過線上部署實際使用,證明了本系統在一萬臺以上設備同時在線的高并發情況下依然能夠實現終端精確監控和視頻精準推送。
關鍵詞:終端監控;Django;Python;精準推送
中圖分類號:TP393 文獻標識碼:A 文章編號:2095-1302(2018)02-00-03
0 引 言
隨著多媒體技術的不斷發展,各行各業都受到了沖擊,傳媒行業亦如此。將多媒體技術應用于廣告播放的多媒體系統應運而生,這種用于播放視頻廣告的多媒體機現已廣泛應用于各大賣場,直觀地向人們傳遞需要的信息。然而,現有的媒體發布系統主要仍以本地存儲和離線系統為主[1,2],無法由后臺進行實時遠程管理,維護成本高。
針對目前主流媒體廣告機在使用中存在的缺點,基于Python的Django框架設計實現了一種多媒體發布系統,只要能訪問互聯網,就可以直接對分布在全國各地的終端進行監控、管理和多媒體精準推送,實現集中、實時的精確管理。
本系統采用Python語言和Django框架搭建了一個完整的Web平臺。Python是目前最流行的編程語言之一。Django是Python語言編寫的最優秀的Web框架之一,采用的MVC框架模式[3]具有易開發,便于更新維護,移植性好等優點。
1 系統總體設計
1.1 Django框架
Django使用Python語言編寫,遵循MVC的設計架構,但在具體實現上,會以自己特有的MTV模式體現出來,即Models(模型),Template(模板),View(視圖)。
Django的項目結構主要由Urls.py,Views.py,Models.py組成,其中Urls.py為整個項目的路由表,當使用者訪問特定的url時,Urls.py將請求指向Views.py(視圖函數)中特定的函數,在視圖函數中與數據模型進行一系列交互操作來響應用戶的請求。Urls.py和Views.py可由MVC中的控制器即Controller來描述[4]。
Django的模式如圖1所示。
1.2 系統結構設計
系統采用分層設計,可分為表示層,業務邏輯層和數據訪問層,如圖2所示。分層設計使得系統具有高內聚,低耦合的特點,當改變針對用戶的表現層設計時,不會影響底層的業務邏輯和數據訪問,同樣,當改變底層結構時,只要提供給上層的JSON數據接口不變,則不會對表現層產生任何影響。三層結構使得系統的各模塊獨立性比較強,有利于系統的維護、升級,易于資源的分配,降低了開發和運維成本。Django層使得整個App應用獨立于項目,可隨時移植[4]。
1.3 系統功能需求
通過分析市面上的多媒體機功能,考慮合作公司的需求后,將系統功能需求分為6部分,分別為設備使用者的信息管理,終端設備的管理,媒體文件的上傳管理,節目的精準推送,播放數據統計,系統使用者信息管理。在功能設計方面,每部分又可分為多個子模塊。
1.4 系統功能設計
根據多媒體發布系統的功能需求分析,該系統由6個功能模塊組成。分別為客戶管理、終端設備管理、媒體管理、節目單管理、媒體播放數據統計、賬戶管理,系統功能如圖3所示。
客戶管理分為客戶信息管理、商店管理、代理商管理三個子模塊,客戶、代理商和商店具有上下級關系,即一個客戶有多個代理商,一個代理商有多個商店。每個子模塊分別負責該模塊信息的錄入、修改、刪除以及查詢下屬組織的信息。
終端管理分為終端信息管理、設備監控、地圖模式、數據上傳四個子模塊,是系統的核心之一。終端信息管理模塊負責終端信息的添加、修改、刪除以及終端的初始化與該終端下的節目信息查詢;數據上傳模塊可以上傳表格文件在系統批量生成終端信息;設備監控模塊和地圖模式分別以不同的方式使管理員直觀看到全網的設備狀況。
媒體管理分為媒體上傳和媒體管理兩個子模塊,媒體的制作和管理是媒體發布的重要環節。
節目單管理分為四個子模塊,分別為添加節目單、節目單管理、定點推送與默認節目單,其中定點推送與默認節目單是媒體發布的核心之一。
數據統計模塊分為終端數據統計、客戶數據統計、詳細數據統計三個子模塊,分別為不同層次的媒體播放數據統計。
賬戶管理模塊分為添加用戶和用戶管理兩個子模塊,為系統添加除管理員外的其他用戶和賦予其相應的權限。
2 系統詳細實現
系統的核心設計主要分為終端監控部分和視頻推送部分。其核心設計主要包括業務邏輯實現、前端界面實現和數據庫設計。業務邏輯基于Django框架,采用Python語言編寫。Python是一種面向對象的解釋型語言,具有豐富強大的庫,可以方便調用其他語言寫成的模塊(如C/C++),并將其他語言的優勢集中起來。
前端展示界面采用jQuery和Bootstrap。jQuery是一個快速、簡潔的JavaScript框架,Bootstrap是一個CSS/HTML框架,他們使用方便,效果多樣,結合Ajax技術便能夠營造出一個完美的用戶體驗界面,大大方便了用戶和系統的交互。
數據庫采用MySQL。MySQL是目前最流行的關系型數據庫管理系統之一,關系型數據庫用不同的二維表來存儲數據,增加了存儲速度并提高了靈活性。MySQL體積小、速度快、源碼開放,已成為中小型網站的不二選擇。在Django中用MySQLdb模塊來驅動MySQL,在項目中編寫Python類,使用ORM映射來操作數據庫表。endprint
2.1 終端監控實現
在整個媒體發布系統中,有成千上萬臺終端在運行,一旦終端發生故障,那么后果不可預料,將對使用者和供應商造成不可避免的損失,因此需要對所有終端進行有效的監控。如圖4所示,終端監控在系統中處于核心環節。
系統采取心跳機制以保障監控終端順暢運行,即終端每隔5 s便發一次請求表明自己的狀態,但由于系統中運行的設備數量龐大,如此高頻度的請求對服務器造成了巨大的壓力,因此利用Python善于處理數據的優勢,將數據信息存儲在內存中,自定義Sync函數,通過Linux系統的Crontab機制每30 min調用一次Sync函數將內存中的數據寫進數據庫。查詢終端的狀況時,如果從內存中查到該終端信息,則渲染到前端,否則,從數據庫中取出數據。
終端設備向服務器發送的心跳請求以Http傳輸,接口協議為自定義的JSON格式。系統接到請求后,在項目中構建一個Python類TerminalManager,所有與終端監控相關的方法均定義在該類中。該類基于Python的基類Object,在構造函數中定義了一個字典對象terminal_heartbeat_dict和一個成員變量heartbeat_lock:
Self.terminal_heartbeat_dict = {}
Self.heartbeat_lock = threading.Lock()
Python中的字典對象是一種類似于哈希表的映射類型對象,是一種可變的容器類型,由多個鍵值對(key,value)組成。用Threading.Lock()生成一個線程互斥鎖[5-7]。當有設備發來請求時,經URLConf調配后,調用TerminalManager類的heartbeat方法,該方法接受一個terminalid(終端編號)參數,每調用一次便將終端編號和當前時間作為一個字典的item存到terminal_heartbear_dict中:
With self.heartbeat_lock:
Self.terminal_heartbeat_dict[terminalid] = now_datetime
在Python中,With語句可以在執行時自動進入和退出With后所跟的上下文管理器對象,常用于對文件的操作和鎖機制等。當系統接收到一次請求時便對線程加鎖,避免同一時刻對共享資源進行操作引起沖突,更新字典中的值,操作完成后釋放鎖。
2.2 節目推送實現
媒體發布系統中所有設備的媒體播放都依賴于系統調度,系統調度需要精確到某個商店的某臺設備,從而實現精準推送。因此,節目推送也是系統中至關重要的一環。
基于媒體播放系統的實際需求,客戶、商店、設備之間都是多對一的關系,節目推送是在視頻的基礎上生成節目單后再推送,因此視頻與節目單為多對多的關系,如圖5所示。按照需求,節目單和客戶、商店、設備之間又是多對多的關系,數據之間的關系十分復雜,若自己編寫數據關系,不僅難以實現,而且容易耦合,更不易于系統的升級與維護。
在Django中,使用ORM技術來操作數據庫,開發者通過編寫Python類的方式實現數據模型,該數據模型以框架底層作為支撐,映射到數據庫中的每張表,類中的屬性則對應表中的每個字段[8]。此外,Django還提供了三種最常見的數據庫關系,即多對多(many-to-many),多對一(many-to-one),一對一(one-to-one)。直接操作框架中提供的基于Python類的管理器即可實現對數據庫的增、刪、改、查操作。
以節目推送到設備為例,節目單和設備是多對多的關系。推送時,將節目單的數據庫主鍵id(itemid)和設備的數據庫主鍵id(terminal_id)傳到后臺,Django通過id獲取類的實例,即數據庫中的一條數據:
item = Item.objects.get(id=itemid)
terminal = Terminal.objects.get(id=terminal_id)
其中,objects是Django內部封裝的類管理器,通過該管理器可以操作類實現數據庫層面的增、刪、改、查、操作,Django模型操作接口見表1所列。
后臺獲取到節目單和終端實例后,調用Django的反向查詢方法獲取該終端下已存在的所有節目單:
Terminalist = terminal.item_set.all()
若節目單item已存在Terminallist中,則忽略;否則調用Django的多對多反向增加方法在數據庫中生成第三張表,分別存儲節目單id和終端id,見表2所列。
推送完成之后,該終端向服務器發送請求,按照事先約定的協議返回該終端名下所有的視頻信息:
{"items":[{"videos":[...],"itemid":"itemid",}],"userid":"terminal_id","respound":"登錄成功"}
設備按照解析的數據[9],經由服務器訪問靜態數據,即可實現定點推送,定點播放。
3 系統部署與應用
在實際生產環境的部署過程中,采用Nginx反向代理uWSGI方式,靜態文件由Nginx處理,具體的動態業務邏輯由uWSGI的Django處理。系統的部署結構如圖6所示。
系統運行時,前端請求發送到反向代理服務器Nginx,如果請求的是靜態文件,則Nginx服務器直接訪問服務器磁盤[10,11];如果是動態數據,則把請求代理到Web服務器uWSGI,uWSGI服務器調用Django應用,經過Django中一系列邏輯處理后與MySQL交互數據,然后將處理結果返回給前端展示,實現Web請求。
4 結 語
本文基于Python的Django框架設計實現了一種多媒體發布系統,與現有的媒體發布方式相比,本系統不僅實現了對所有終端設備的實時監控和精確定位,同時還能夠實現對單個設備播放內容的精確實時推送。除此之外,采用的Django框架開發,方便后續對系統的自動化維護和升級。
目前該系統上線運行以來,已經在北京、上海、杭州、南京等城市部署安裝了一萬余臺,充分證明了該系統媒體發布的高效性和穩定性。
參考文獻
[1]張秋,魏成光.多媒體信息發布系統在大學圖書館的設計與應用——以清華大學人文社科圖書館為例[J].圖書館學研究,2011(20):38-41.
[2]陳艷,葉德建.營銷類多媒體信息發布系統終端自動化運維[J].微型電腦應用,2016,32(1):25-29.
[3]白文秀,吳瑞苗.基于Django的運維自動化系統設計[J].智能計算機與應用,2016,6(3):95-97.
[4]楊澤,鄭立華,李民贊,等.基于Django的植保無人機飛行監視系統[J].農業網絡信息,2016(9):41-47.
[5]陳忠菊.一種基于多線程的高并發任務實現[J].電腦編程技巧與維護,2015(5):41.
[6]肖明魁.Python語言多進程與多線程設計探究[J].計算機光盤軟件與應用,2014(15):66-67.
[7]謝紅.Python多線程機制初探[J].電腦知識與技術,2011,7(19):4739-4740.
[8]陳紅茜,孟超英,邱小彬,等.基于Django的高校合同制人員管理系統[J].華東師范大學學報(自然科學版),2015(S1):464-470.
[9]范文星.基于Django的網絡運維管理系統的設計與實現[J].計算機科學,2012,39(S2):175-177.
[10]馮貴蘭,李正楠.Nginx反向代理在高校網站系統中的應用研究[J].網絡安全技術與應用,2017(6):111-120.
[11]汪文君.基于Nginx服務器集群負載均衡方案的研究和改進[J].電子世界,2017(2):179-181.endprint