5G 融合计费系统架构设计与实现(一)

  随着5G商用临近,5G的各个子系统也在加紧研发调试,本人有兴全程参与5G中的融合计费系统(CCS)的设计、开发、联调工作。接下来将用几篇文章介绍我们在CCS实现过程遇到的挑战与架构设计的考量。相信这些宝贵的经验可以适用于更广的软件系统,免于重复地陷入软件开发的焦油坑。

  5G系统由3Gpp定制统一的架构和协议规范,这也是电信行业一直以来通行的作法。不同的是,5G以前的规范3Gpp总是喜欢独树一帜,比如最出名的DCC(Diameter Credit Control)协议。虽然二进制的格式封装可以带来极佳的性能,但这个协议应用的范围也十分有限,仅限于电信行业。

  5G规范从一开始,3Gpp就一改以往的风格,极力与目前主流的技术进行匹配,甚至不惜重构整个通信系统。接下来我们会听到很多熟悉的词汇,包括:微服务、注册与发现、Http2、JSON、RESTFul、容器化、微服务编排等等。没错,新5G系统在尽一切可能拥抱最新的技术潮流。正由于这个原因,在设计新的5G CCS时,我们发现以前的技术储备全都用上了。这对于一个新系统来说极大地降低了原始开发的风险,在真正动手写代码之前,我们就已经知道项目一定会成功。这点对于新系统的研发至关重要!

  一切从微服务架构说起……在微服务架构兴起前,大部分应用软件系统都采用单体应用架构。如下图所示,单体应用有他的优势——简单。但也有他的缺点,下面这段引自Introduction to Microservices,作者 Chris Richardson

"迈向单体应用的地狱,不幸的是,这个简单的方法有巨大的限制。成功的应用会随着时间推进,变得越来越大。在每次需求更改或者功能增加时,你的开发团队会实现更多的业务功能,这意味要增加很多行代码。在几年后,你的简单的应用将会成长为一个巨大的单体应用。为了提供一个极其简单的例子,我(指作者)最近和一个开发者进行了交流,这个开发者正在写一个工具来分析他们的应用使用的JAR彼此之间的依赖,但是这个应用竟然有数以百万行的代码,我确信一定很多的开发者经过很多年的辛苦努力才创造出来了这样的巨无霸。

一旦你的应用成为一个巨大的、复杂的单体应用,你的开发团队一定会陷入痛苦的泥淖不能自拔,任何对于敏捷开发和交付的尝试最终都会陷入挣扎之中。一个主要的问题是这个应用过于复杂了。它太大以至于对于任何一个开发者都无法完全理解。结果就是,修复bug和正确地实现新功能变得非常困难,并且会消耗大量的时间。更重要的是,这将会趋向于一个向下的螺旋。如果代码库理解起来很困难,那么也就不会给出恰当的改善方案。你最终会得到一个巨大的、难以理解的big ball of mud."

  单体应用给我带来更直观的感受是当系统规模达到一定程度时,维护这个系统不断更新、接受新需求是一个恶梦。首先系统的稳定性会受到挑战:一个微不足道的错误,就可能导致整个系统瘫痪,对此可能一点办法没有。其次,系统的可扩展性不够:对于一个应用系统,不断接受千奇百怪的新需求是这个系统具有生命力的向征,但对于一个庞大的旧系统而言,这点又是每个程序员的恶梦。你不知道在一个几十万行代码的系统里面改几行的后果会是什么,也许什么事也没有,也许错误从此埋下,等发现的时候已经造成不可挽回的损失。想像一下因为你改的几行代码,给电信带来几百上千万的费用计算错误,并且不可回退。

  解决之道就是微服务架构,同样引用上面同一篇文章的观点:

“微服务架构有很多重要的优点。首先,它解决了复杂性的问题。它将一个本会成为巨大的单体应用分解成一系列服务。在保证整体的功能没有改变的前提下,应用被分成很多的模块或者服务。每个服务都有明确的边界,这种边界是通过远程调用(RPC)或者消息驱动的API来确定的。微服务架构模式强制实行模块化,这种在单体应用中是很难去实现的。结果就是,单个服务开发起来更快、也更容易理解和维护。

第二,这个架构使得每个服务可以被独立地开发。开发者可以自由地选择合适的技术,只要这个服务满足API交互规范。当然,大多数组织想通过限制技术选项来避免过于无拘无束。然而,这种自由意味着开发者没必要在开始新工程时继续使用过时的技术。当开发一个新的服务时,他们可以选择使用当前的技术。另外,因为服务相对来说很小,那么使用当前的技术重写旧的服务会更加可行。

第三,微服务架构模式使得每个微服务可以被独立部署。当本地的服务发生变化时,开发者不再需要协调这种变化引起的部署问题。只要被测试通过,这些变化就可以被部署。UI团队可以执行AB测试,并且可以快速地迭代UI的变化。微服务架构模式使得持续部署成为可能。

最后,微服务架构模式使得每个服务可以被独立地扩展。为了满足吞吐量和可用性,你可以对每个服务部署任意的实例数量。另外,你可以使用最能满足服务资源要求的硬件。例如,你可以部署CPU密集型图像处理服务到EC2 Compute Optimized instances,部署内存数据库到EC2 Memory-optimized instances。”

  总结下微服务架构几点要素:注册与发现、API Gateway、服务间通讯……

  3Gpp制定的5G架构规范也是采用微服务的模式。下图是5G系统的总体架构图。5G系统被拆分为许多个F(Function),你问为啥不叫Service,哈哈,3Gpp还是要保持自己的个性的吧,我猜。其中NRF(Network Resource Function)负责各个服务的注册与发现。标红的是我们要实现的服务CHF(Charging Function),与我们打交道的是SMF。各个服务通过定好的协议进行交互,如:NRF的接口协议就叫Nnrf,CHF的接口协议就叫Nchf。

    不止于5G的整体架构是微服务架构,每个子服务的内部也都是按微服务的架构重新设计实现的。容器化、微服务架构、服务编排是这两年我们系统的改造重点。相信也是其它子服务的改造重点。5G核心网未来要满足网络切片的要求,NFV和微服务化,服务编排都是实现这一切的基础。

5G 融合计费系统架构设计与实现(一)的更多相关文章

  1. 【TEGer 在全球架构师峰会】 : 腾讯海外计费系统架构演进

    欢迎大家前往云加社区,获取更多腾讯海量技术实践干货哦~ 作者简介:abllen,2008年加入腾讯,一直专注于腾讯计费平台建设,主导参与了腾讯充值中心.计费开放平台.统一计费米大师等项目,见证了米大师 ...

  2. PetShop的系统架构设计

    <解剖PetShop>系列 一.PetShop的系统架构设计 http://www.cnblogs.com/wayfarer/archive/2007/03/23/375382.html ...

  3. petshop4.0 具体解释之中的一个(系统架构设计)

    前言:PetShop是一个范例,微软用它来展示.Net企业系统开发的能力.业界有很多.Net与J2EE之争,很多数据是从微软的PetShop和Sun的PetStore而来.这样的争论不可避免带有浓厚的 ...

  4. NET ERP系统架构设计

    解析大型.NET ERP系统架构设计 Framework+ Application 设计模式 我对大型系统的理解,从数量上面来讲,源代码超过百万行以上,系统有超过300个以上的功能,从质量上来讲系统应 ...

  5. 基于Struts2,Spring4,Hibernate4框架的系统架构设计与示例系统实现

    笔者在大学中迷迷糊糊地度过了四年的光景,心中有那么一点目标,但总感觉找不到发力的方向. 在四年间,尝试写过代码结构糟糕,没有意义的课程设计,尝试捣鼓过Android开发,尝试探索过软件工程在实际开发中 ...

  6. Unity3D手游开发日记(2) - 技能系统架构设计

    我想把技能做的比较牛逼,所以项目一开始我就在思考,是否需要一个灵活自由的技能系统架构设计,传统的技能设计,做法都是填excel表,技能需要什么,都填表里,很死板,比如有的技能只需要1个特效,有的要10 ...

  7. 图数据库 Nebula Graph 的数据模型和系统架构设计

    Nebula Graph:一个开源的分布式图数据库.作为唯一能够存储万亿个带属性的节点和边的在线图数据库,Nebula Graph 不仅能够在高并发场景下满足毫秒级的低时延查询要求,而且能够提供极高的 ...

  8. [转]【转】大型高性能ASP.NET系统架构设计

    大型高性能ASP.NET系统架构设计 大型动态应用系统平台主要是针对于大流量.高并发网站建立的底层系统架构.大型网站的运行需要一个可靠.安全.可扩展.易维护的应用系统平台做为支撑,以保证网站应用的平稳 ...

  9. 万级TPS亿级流水-中台账户系统架构设计

    万级TPS亿级流水-中台账户系统架构设计 标签:高并发 万级TPS 亿级流水 账户系统 背景 业务模型 应用层设计 数据层设计 日切对账 背景 我们需要给所有前台业务提供统一的账户系统,用来支撑所有前 ...

随机推荐

  1. 错误排查:Cloudera Manager Agent 的 Parcel 目录位于可用空间小于 10.0 吉字节 的文件系统上。 /opt/cloudera/parcels

    临时解决办法: 点击右上角的抑制,选中抑制复选框,然后重启服务即可.

  2. Java 之 HashSet 集合

    一.概述 java.util.HashSet  是 Set 接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的(即存取顺序不一致). java.util.HashSet 底层的实现是一个 ...

  3. JavaScript 之 取消 a 标签的默认行为

    方式一 语法格式: <a href="javascript:;">百度</a> javascript: 是一个伪协议,其他的伪协议还有 mail:  tel ...

  4. FreeRTOS 任务通知

    可以替代队列.二值信号量.计数型信号量和事件标志组 发送任务通知 获取任务通知 FreeRTOS 任务通知模拟二值信号量 FreeRTOS 任务通知模拟计数型信号量 FreeRTOS 任务通知模拟消息 ...

  5. SparkStreaming之checkpoint检查点

    一.简介 流应用程序必须保证7*24全天候运行,因此必须能够适应与程序逻辑无关的故障[例如:系统故障.JVM崩溃等].为了实现这一点,SparkStreaming需要将足够的信息保存到容错存储系统中, ...

  6. MySql操作命令创建学生管理系统

    1.创建学生管理系统数据库xscj create detabase 数据库名: 2.打开数据库 use 数据库名: //创建数据库之后,该数据库不会自动成为当前数据库需要用use来指定 3.创建表名 ...

  7. 网络空间安全基础篇(1)----nmap的使用

    nmap工具通俗一点说,就是利用nmap工具来对靶机的所有端口及其开启的服务进行扫描,以便于黑客入侵靶机时,知道用什么漏洞去攻击. nmap常用的命令集(标为红色的一般为常用参数): sV 扫描版本O ...

  8. reset.css文件下载及剖析

    @charset "utf-8"; /* http://meyerweb.com/eric/tools/css/reset/ v2.0-modified | 20110126 Li ...

  9. 《快活帮》第九次团队作业:Beta冲刺与验收准备

    项目 内容 这个作业属于哪个课程 2016计算机科学与工程学院软件工程(西北师范大学) 这个作业的要求在哪里 实验十三 团队作业9:BETA冲刺与团队项目验收 团队名称 快活帮 作业学习目标 (1)掌 ...

  10. php怎样应对高并发

    高并发下的数据安全 我们知道在多线程写入同一个文件的时候,会出现“线程安全”的问题(多个线程同时运行同一段代码,如果每次运行结果和单线程运行的结果是一样的,结果和预期相同,就是线程安全的). 如果是M ...