王宏明,宁 博,金 云,聂 超
(通号万全信号设备有限公司,杭州 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++语言同样可以在不改动原有设备的情况下,引入一些新技术、新理念达成较好的效果,提高开发效率、降低成本。自主研发的微服务架构的有轨电车车载系统已在云南某地实际项目中实施运行,取得了良好的效果。证明一些新技术、新理念在通信信号领域的产品研发及应用中是可行的。