王宏明,寧 博,金 云,聶 超
(通號萬全信號設備有限公司,杭州 310000)
城市化水平的不斷提高,人們對公共交通的出行需求越來越多。現代有軌電車因投資少、建設周期短、節能環保等特點,也被越來越多的中小城市、旅游城市采用。隨著技術的發展,運營管理水平的提高,也對現代有軌電車系統提出更高的要求,比如智能化、綜合化等要求。作為現代有軌電車系統中的核心子系統——信號系統,也要求與各種各樣的子系統進行溝通交互,功能越來越復雜、接口格式也多種多樣。
現代社會中,隨著互聯網技術的蓬勃發展,一種面向服務的體系架構(SOA)也在互聯網技術的實踐中越來越成熟。同時,由于互聯網系統的大用戶、大數據、高并發等特點,又催生了云服務等技術。各種技術的融合運用,產生了微服務架構。微服務架構是一項在云中部署應用和服務的新技術,使用輕量級機制通信,通常是HTTP API,這些服務基于業務能力構建,能夠通過自動化部署機制來獨立部署,這些服務使用不同的編程語言,以及不同數據存儲技術來實現,并保持最低限度的集中式管理。
在有軌電車行業中,很多軟件是運行于資源受限設備上,比如各種各樣的嵌入式設備,使用MCU 的各種板卡。受限于資源、安全需求、歷史原因等無法使用HTTP 等協議,照搬互聯網行業的微服務架構是不可能的,但微服務的理念在功能越來越復雜的有軌電車行業中大有用武之地。微服務有以下幾項優勢,可以很好地運用于有軌電車控制系統的開發運營。第一是敏捷性,微服務的功能比較獨立,可以更快速、更獨立地進行開發,縮短開發周期。第二是擴展性,通過微服務,可以獨立擴展各項服務以滿足支持其他子系統的功能需求。第三是輕松部署,微服務支持持續繼承和持續交付,可以輕松嘗試新想法。當有新的子系統需求出現的時候,可以開發一個新的微服務,而不影響現有的信號控制系統。技術自由、可重復使用的代碼、彈性等微服務的優勢,也可以很好地運用于有軌電車行業中。
完整的現代有軌電車信號系統主要由各子系統和設備組成為:1)綜合調度子系統;2)正線軌旁控制子系統;3)路口優先控制子系統;4)車載控制子系統;5)數據通信子系統;6)車輛段控制子系統;7)維護監測子系統;8)其他需要信號信息的子系統。整體系統構成如圖1 所示。
綜合調度系統以行車指揮和運行計劃為核心,它的主要功能為:1)行車信息顯示;2)列車識別號、跟蹤功能;3)運行圖編制及管理;4)進路自動控制;5)信號設備控制;6)操作與數據記錄、輸出及統計處理;7)列車運用、派班計劃及車輛管理;8)與其他系統交換信息。

根據微服務的理念,可以對其進行功能切割,分為多個獨立的微服務。行車信息顯示功能需要顯示全線的線路車站布局、軌旁設備的狀態(信號機、區段、進路、道岔等),列車信息(位置、速度、識別號、早晚點信息、扣車信息、目的地、前后車距離等),路口信息(信號機、紅綠燈時間)。這是一個綜合性的信息顯示,需要各個微服務提供各種信息。列車識別號及跟蹤功能,可以分為車輛信息微服務,列車識別號管理微服務,列車正線跟蹤微服務,列車車輛段跟蹤微服務。運行圖編制為離線編制,可以單獨作為一個程序運行。運行圖的實時顯示需要列車的位置信息,可以使用運行圖數據微服務來提取運行圖顯示的數據。進路的自動控制功能、信號設備的控制功能都需要和軌旁、聯鎖系統進行交互,可以分為自動進路微服務、軌旁微服務、聯鎖微服務。列車運用、排班計劃等可以劃分為單獨微服務。其他系統,如乘客信息系統(PIS)、公共廣播系統(PA)、自動售檢票系統(AFC)、無線調度系統(LTE)、車輛段檢修管理系統也需要列車的位置信息,每個單獨的系統接口需求都可以作為微服務提供。整理完成的微服務架構綜合調度系統組成如圖2 所示。

圖2 微服務架構Fig.2 Microservice architecture
考慮HTTP 協議在有軌電車控制系統中的使用狀況,在本系統中不適用HTTP 形式的API 來提供服務,系統使用數據池的數據共享方式來實現信息的流轉。同時,因為需要下達命令等功能需要,系統需要一個既能提供消息隊列功能,又能提供快速數據訪問的高可用性的中間件。Redis 的以下幾個特性很好地符合此需求。
1)內存數據庫,速度快、開源
Redis 是一個開源的使用 ANSI C 語言編寫、支持網絡、可基于內存亦可持久化的Key-Value 數據庫。它把所有數據放在內存中,因此性能極高,讀的速度是10 萬次/秒,寫的速度是8 萬次/秒。
2)操作的原子性、支持事務
Redis 的所有操作都是原子性的,同時還支持事務。不需要特別考慮各個系統之間的數據互鎖等,降低程序的同步復雜性。
3)發布訂閱功能
Redis 提供發布訂閱功能,可以用來實現消息隊列系統。
4)高可用和分布式
Redis 提供高可用的特性Sentinel,能在某個Redis 接點故障時實現自動轉移。它也提供了分布式的實現Redis Cluster,提供高可用性、讀寫和容量的擴展性。
5)簡單穩定
簡單性主要表現在Redis 的源碼很少,而且開源;Redis 使用單線程模型,處理模型簡單;Redis獨立實現事件處理的相關功能,不需要依賴于操作系統中的類庫。
基于以上的特點,系統使用Redis 作為各個微服務的數據池,各微服務處理完成的信息以Key-Value 的方式放在Redis 中,便于其他系統使用。
在微服務架構應用以前,單進程的綜合調度系統架構如圖3 所示。

圖3 單進程架構Fig.3 Single process architecture
在單進程的架構中,如果需要添加一個新的第三方接口功能,比如需要給路口程序發送車輛位置信息的功能。雖然此功能相對比較獨立,但所需信息都在一個程序內,無法以一個單獨的程序來實現,研發人員就需要在本來就復雜的程序中,再添加一個新的功能模塊來處理與路口的信息交互。此時,因為核心的程序進行了變動,所以需要測試的范圍除了新功能的需求以外,還需要對原有的功能進行測試,以確認在原有的功能模塊中沒有引入新的問題。
在引入微服務的架構后,實現上述的功能,研發人員只需要從數據池中獲取微服務產生的車輛信息,然后再使用另一微服務產生的列車計劃、列車識別號等信息,將兩個信息結合進行處理,將處理結果發送給第三方接口即可。這樣開發一個程序,功能相對簡單,需求明確,因而開發、測試所需的工作量也可控制,而且是新的獨立程序,不會影響原有的程序,減少了測試的工作量。
在軌道交通信號領域中,一方面是通信信號領域的安全性要求使然,另一方面則是由于長久以來信號領域的技術壟斷,所以一些新技術、新編程語言的應用比較少。但是在安全性要求較高的領域,使用C/C++語言同樣可以在不改動原有設備的情況下,引入一些新技術、新理念達成較好的效果,提高開發效率、降低成本。自主研發的微服務架構的有軌電車車載系統已在云南某地實際項目中實施運行,取得了良好的效果。證明一些新技術、新理念在通信信號領域的產品研發及應用中是可行的。