好的,我们继续深入。
深度解析 3GPP TS 29.531:6.2 Nnssf_NSSAIAvailability Service API (订阅-通知式API详解)
本文技术原理深度参考了3GPP TS 29.531 V18.8.0 (2024-09) Release 18规范中,关于“Chapter 6.2 Nnssf_NSSAIAvailability Service API”的核心章节。本文将从开发者的视角,对NSSF的“订阅-通知”服务API进行一次完整的、代码级的深度解剖。
在上一篇对Nnssf_NSSelection Service API的剖析中,我们已经掌握了如何作为AMF开发者,向NSSF的“问询处”发起一次精确的GET请求,并解析其返回的决策结果。这套“请求-响应”机制解决了网络中的静态决策问题。然而,5G网络的真正魅力在于其动态性与智能化,而这正是Nnssf_NSSAIAvailability服务的舞台。
这项服务将AMF与NSSF的关系,从一次性的“客户与问询处”,升级为持续的“订阅者与新闻台”。它赋予了AMF“顺风耳”的能力,能够实时感知网络切片资源的动态变化,从而做出更敏捷、更高效的响应。
今天,我们将继续扮演小杰公司的开发者小李的角色。他的新任务是在公司的AMF产品中,实现对NSSF切片可用性变化的订阅和通知处理功能。这项任务的复杂性远超之前的GET请求,它涉及能力上报、订阅创建、异步回调、状态维护等一系列高级API交互。我们将跟随小李,攻克Nnssf_NSSAIAvailability API的每一个技术难点。
1. API的“新大陆”:API URI (Clause 6.2.1)
与Nnssf_NSSelection服务一样,我们的探索之旅始于“地址”——API URI。
规范原文引用 (Clause 6.2.1 API URI):
The Nnssf_NSSAIAvailability service shall use the Nnssf_ NSSAIAvailability API. The API URI of the Nnssf_NSSAIAvailability API shall be:
{apiRoot}/nnssf-nssaiavailability/<apiVersion>with the following components:
- The
{apiRoot}shall be set as described in 3GPP TS 29.501.- The
shall be “v1”.
这个URI结构与Nnssf_NSSelection非常相似,但有几个关键区别:
| URI组件 | Nnssf_NSSelection | Nnssf_NSSAIAvailability | 解读 |
|---|---|---|---|
"nnssf-nsselection" | "nnssf-nssaiavailability" | API名称清晰地区分了两种服务,确保了URI的唯一性和可读性。 | |
"v2" | "v1" | 注意:在当前规范版本中,NSSAIAvailability服务的API版本是v1。这提醒开发者,即使在同一个NF(NSSF)上,不同的服务也可能有独立的版本演进路线。 |
因此,小李在代码中将要访问的API基础路径是:{apiRoot}/nnssf-nssaiavailability/v1。所有与该服务相关的资源,都将在这个路径之下展开。
2. “沟通”的升级:Usage of HTTP (Clause 6.2.2)
Nnssf_NSSAIAvailability服务在HTTP的使用上,引入了一个重要的新成员:JSON Patch。
规范原文引用 (Clause 6.2.2.2.2 Content type):
The following content types shall be supported:
- JSON, as defined in IETF RFC 8259…
- The Problem Details JSON Object (IETF RFC 9457)…
- JSON Patch (IETF RFC 6902). The use of the JSON Patch format in a HTTP request body shall be signalled by the content type “application/json-patch+json”.
| HTTP特性 | 规范要求 | 对开发者的意义 |
|---|---|---|
| 协议版本 | HTTP/2 | 保持不变,继续享受HTTP/2的高性能。 |
| 数据格式 | JSON | 仍然是主要的数据交换格式。 |
| 错误格式 | Problem Details JSON Object | 保持不变,提供结构化的错误信息。 |
| 新增内容类型 | JSON Patch (application/json-patch+json) | [核心升级点] 这是为PATCH方法量身定做的。当AMF只需要更新其在NSSF处登记信息的一小部分时(例如,只增加一个TA),它无需发送完整的JSON对象(PUT),而是可以发送一个轻量级的PATCH请求,其内容就是JSON Patch格式的“补丁”,描述了要进行的修改。这极大地节省了网络带宽和处理开销。 |
场景:小李的技术选型
为了支持PATCH方法,小李需要在项目中引入一个能够生成和应用JSON Patch(RFC 6902)的库。例如,他会编写一个函数,当检测到AMF管辖的TA列表发生微小变化时,自动生成类似以下的JSON Patch请求体,而不是重新序列化整个NssaiAvailabilityInfo对象:
[
{ "op": "add", "path": "/supportedNssaiAvailabilityData/0/taiList/-", "value": {"plmnId": ..., "tac": ...} }
]这个“补丁”的含义是:“在第一个supportedNssaiAvailabilityData元素的taiList数组末尾,追加一个新的TA对象”。
3. 复杂的“行政版图”:Resources (Clause 6.2.3)
Nnssf_NSSAIAvailability服务的资源模型比Nnssf_NSSelection要复杂得多,它体现了“集合”与“个体”的层级关系,完美地映射了“所有AMF的能力信息集合”、“某个AMF的能力信息”、“某个AMF的所有订阅集合”、“某个特定的订阅”这四层逻辑。
3.1 资源URI结构概览 (Clause 6.2.3.1)
规范原文图重绘 (Figure 6.2.3.1-1: Resource URI structure of the Nnssf_NSSAIAvailability API)
//{apiRoot}/nnssf-nssaiavailability/<apiVersion> | ||
| └─ /nssai-availability | (NSSAI Availability Store) | |
| └─ /{nfId} | ||
| └─ /subscriptions | ||
这个层次清晰的树状结构,是RESTful API设计的典范。
规范原文表重绘 (Table 6.2.3.1-1: Resources and methods overview)
| 资源名称 | 资源URI | HTTP方法 | 核心功能 |
|---|---|---|---|
| NSSAI Availability Store | /nssai-availability | OPTIONS | 发现NSSF支持的通信选项 |
| NSSAI Availability Document | /nssai-availability/{nfId} | PUT, PATCH, DELETE | AMF能力管理:创建/替换、修改、删除某个AMF在NSSF上的能力信息 |
| NSSAI Availability Notification Subscriptions Collection | /nssai-availability/subscriptions | POST | 订阅创建:为AMF创建一个新的事件订阅 |
| Individual NSSAI Availability Notification Subscription | /nssai-availability/subscriptions/{subscriptionId} | PATCH, DELETE | 订阅管理:修改、删除一个已存在的订阅 |
接下来,我们将逐一攻克这些资源和它们支持的方法。
3.2 资源NSSAI Availability Document:AMF的“户籍”管理
这个资源代表了单个AMF(由nfId标识)在NSSF中的“档案”或“户籍”。
场景:园区新AMF(amf-b)的生命周期
-
上线报到 (PUT):
- 动作: 新上线的AMF-B向
.../nssai-availability/amf-b发起PUT请求。 - 请求体:
NssaiAvailabilityInfo对象,包含了AMF-B支持的全部TA和S-NSSAI信息。 - 响应:
204 No Content或200 OK(若NSSF返回了授权信息)。 - 效果: NSSF创建了
amf-b的档案。
- 动作: 新上线的AMF-B向
-
辖区微调 (PATCH):
- 动作: 园区网络优化,AMF-B的管辖范围增加了一个新的TA。AMF-B向
.../nssai-availability/amf-b发起PATCH请求。 - 请求体:
PatchDocument(JSON Patch),只包含“增加一个TA”的指令。 - 响应:
204 No Content或200 OK。 - 效果: NSSF在
amf-b的档案中追加了新信息,高效完成了更新。
- 动作: 园区网络优化,AMF-B的管辖范围增加了一个新的TA。AMF-B向
-
下线注销 (DELETE):
- 动作: AMF-B计划下线,向
.../nssai-availability/amf-b发起DELETE请求。 - 响应:
204 No Content。 - 效果: NSSF彻底删除了
amf-b的档案及其所有关联的订阅,完成了资源清理。
- 动作: AMF-B计划下线,向
3.3 资源...Subscriptions Collection与Individual...Subscription:订阅的生命周期管理
这两个资源共同构成了订阅功能的完整生命周期。
场景:AMF-B订阅园区动态
-
创建订阅 (POST to
/nssai-availability/subscriptions):- 动作: AMF-B想要接收园区所有TA的切片状态变化通知。它向
/subscriptions这个集合资源发起POST请求。 - 请求体:
NssfEventSubscriptionCreateData对象,其中最关键的是:nfNssaiAvailabilityUri: AMF-B的回调地址,如http://amf-b.core.net/nssf-notify。taiList: 园区所有TA的列表。event:SNSSAI_STATUS_CHANGE_REPORT。
- 响应:
201 Created。响应头的Location字段包含新订阅的URI,如.../subscriptions/sub12345。 - 效果: NSSF创建了一个ID为
sub12345的订阅,并将其与AMF-B关联。
- 动作: AMF-B想要接收园区所有TA的切片状态变化通知。它向
-
修改订阅 (PATCH to
.../subscriptions/sub12345):- 动作: AMF-B的策略改变,现在它还想额外订阅切片替换事件
SNSSAI_REPLACEMENT_REPORT。它向之前获得的单个订阅资源URI发起PATCH请求。 - 请求体: JSON Patch,指令为“在event_list中增加一个新事件”。
- 响应:
200 OK。 - 效果: 订阅
sub12345现在会同时推送两种事件的通知。
- 动作: AMF-B的策略改变,现在它还想额外订阅切片替换事件
-
取消订阅 (DELETE to
.../subscriptions/sub12345):- 动作: 园区活动结束,AMF-B不再需要这些通知。它向单个订阅资源URI发起
DELETE请求。 - 响应:
204 No Content。 - 效果: 订阅
sub12345被成功删除。
- 动作: 园区活动结束,AMF-B不再需要这些通知。它向单个订阅资源URI发起
4. “推送”的艺术:Notifications (Clause 6.2.5)
这是整个服务的高潮部分——NSSF的主动通知。这并不是一个由消费者调用的资源,而是NSSF作为客户端,向AMF在订阅时提供的回调URI发起的HTTP POST请求。
4.1 通知流程
规范原文图重绘 (Table 6.2.5.2.2-1: Resources and methods overview for Callback) (该图在规范中是以表格形式描述回调的)
| 资源/回调名称 | 回调URI | HTTP方法 | 描述 |
|---|---|---|---|
| NSSAI Availability Notification Callback | {nfNssaiAvailabilityUri} | POST | NSSF使用此回调URI来更新AMF的受限S-NSSAI信息,或通知网络切片替换/实例替换事件。 |
场景:园区动态启用“无人机巡检”切片
- 网络变化: 运营商通过OAM在NSSF中为园区TA启用了一个新的S-NSSAI。
- NSSF触发通知: NSSF检测到数据变化,并找到了订阅了该TA变化的订阅
sub12345(属于AMF-B)。 - NSSF发起POST: NSSF向
sub12345中记录的回调地址http://amf-b.core.net/nssf-notify发起一次POST请求。 - 请求体:
NssfEventNotification对象。这是AMF开发者小李需要重点解析的数据结构。
4.2 核心数据结构解析 (Clause 6.2.6)
要实现完整的Nnssf_NSSAIAvailability服务,小李必须精确掌握以下几个核心数据模型的结构。
NssaiAvailabilityInfo (AMF上报能力 PUT 请求体)
| 关键属性 | 数据类型 | 描述 |
|---|---|---|
supportedNssaiAvailabilityData | array | 核心。一个数组,每个元素代表一个或一组TA,并列出这些TA所支持的S-NSSAI列表。 |
amfSetId | string | 可选。AMF所属的AMF Set ID。 |
NssfEventSubscriptionCreateData (创建订阅 POST 请求体)
| 关键属性 | 数据类型 | 描述 |
|---|---|---|
nfNssaiAvailabilityUri | Uri | 必须。AMF的回调地址,用于接收通知。 |
event | NssfEventType | 必须。订阅的第一个事件类型。 |
additionalEvents | array(NssfEventType) | 可选。额外订阅的其他事件类型。 |
taiList / taiRangeList | array | 订阅的TA列表或TA范围列表。 |
expiry | DateTime | 可选。建议的订阅过期时间。 |
nsrpSubscribeInfo | SnssaiReplacementSubscribeInfo | 可选。订阅切片替换事件的详细信息。 |
NssfEventNotification (NSSF通知 POST 请求体)
| 关键属性 | 数据类型 | 描述 |
|---|---|---|
subscriptionId | string | 必须。指明是哪个订阅触发了此通知。 |
authorizedNssaiAvailabilityData | array | 核心产出。当SNSSAI_STATUS_CHANGE_REPORT事件触发时携带。包含了发生变化的TA的最新、完整的授权切片信息。AMF应使用此信息完全替换本地缓存的旧信息。 |
altNssai | array(SnssaiReplaceInfo) | 当SNSSAI_REPLACEMENT_REPORT事件触发时携带。包含了被替换的S-NSSAI和用于替换它的备用S-NSSAI。 |
unavailableNsiList | array(Nsild) | 当NSI_UNAVAILABILITY_REPORT事件触发时携带。包含了变为不可用的网络切片实例ID列表。 |
nssaiValidityTimeInfo | map | 当切片有效期变化事件触发时携带,key是S-NSSAI,value是新的有效期。 |
5. 总结:从静态查询到动态同步的飞跃
通过对6.2节Nnssf_NSSAIAvailability Service API的深度解剖,我们完成了从“请求-响应”到“订阅-通知”的认知飞跃。这套复杂的API,虽然比单一的GET请求实现起来更具挑战,但它为5G网络带来了无可比拟的敏捷性和效率。
对于开发者小李来说,他的工作清单包括:
- 实现客户端逻辑: 能够构建并发送
PUT,PATCH,POST,DELETE等多种方法的请求。 - 实现服务端逻辑: AMF需要开放一个HTTP端点(回调URI),作为一个服务端来接收和处理来自NSSF的异步
POST通知。 - 实现状态管理: AMF需要在内存或数据库中维护从NSSF同步来的切片可用性信息,并保证其线程安全。
- 实现生命周期管理: AMF需要在启动时进行能力上报和订阅,在关闭时进行清理,并处理订阅的续订。
这套API的设计,完美体现了现代云原生、事件驱动的架构思想。它将NSSF塑造成了网络切片状态的“单一事实来源(Single Source of Truth)”,并通过高效的推送机制,将这种“事实”实时同步到网络的每一个角落,确保了整个系统在动态变化的环境中,依然能够协调一致、高效运行。
至此,我们已经完成了对NSSF两大核心服务API的全面解读。接下来的文章,我们将继续深入规范的后续章节,探索更多高级特性,如安全、重定向、特性协商等。
FAQ环节
Q1:为什么在Nnssf_NSSAIAvailability中,AMF是客户端(发起请求),但在接收通知时又变成了服务端?
A1:这正是异步回调(Webhook)模式的典型特征。在整个服务交互中,AMF和NSSF同时扮演了客户端和服务端的角色:
- AMF作为客户端: 当它需要上报能力、创建/管理订阅时,它主动向NSSF这个服务端发起请求。
- AMF作为服务端: 它必须暴露一个API端点(回调URI),等待NSSF在未来某个不确定的时间点,作为客户端来调用它,以推送通知。 这种双重角色的架构是实现事件驱动和异步通信的基础,它避免了AMF需要不断轮询NSSF的低效模式。
Q2:JSON Patch (PATCH) 相比于 PUT,在实际网络中能带来多大的性能提升?
A2:提升是显著的,尤其是在大规模网络中。一个AMF可能管理着数百个TA,其NssaiAvailabilityInfo对象可能非常大。
- 使用
PUT: 每次哪怕只变更一个TA,AMF都需要序列化并发送整个(可能几十KB甚至更大)JSON对象。NSSF也需要解析整个对象并全量更新。 - 使用
PATCH: AMF只需要发送一个几十字节的JSON Patch“补丁”。NSSF也只需要解析这个小补丁并进行增量更新。 在大规模网络中,成百上千的AMF可能频繁地进行微小变更,使用PATCH可以指数级地降低核心网内部的信令负载和NF的处理压力。
Q3:NSSF在发送通知失败时(比如AMF回调地址不通),会如何处理?
A3:3GPP TS 29.500对SBI的通用机制有所规定。通常,NSSF会实现一套重试机制。
- 临时性错误 (如网络抖动,AMF暂时不可达返回5xx错误): NSSF会根据预设的策略(如指数退避算法)进行数次重试。
- 永久性错误 (如AMF明确返回404 Not Found,表示回调地址已失效): NSSF在重试几次后,可能会将该订阅标记为“失效”或直接删除,并记录日志告警。
- 订阅有效期: 最终的保障机制是订阅的
expiry时间。即使重试全部失败,过期的订阅最终也会被清理。
Q4:NssaiAvailabilityInfo中的supportedNssaiAvailabilityData和NssfEventNotification中的authorizedNssaiAvailabilityData有什么区别?
A4:这是一个非常关键的区别,涉及到“支持(Support)”和“授权(Authorize)”两个概念。
supported...Data(AMF → NSSF): 这是AMF上报的信息,它描述的是一种“物理/配置”能力。AMF在说:“根据我的配置和与我连接的RAN的信息,我支持在这些TA上处理这些S-NSSAI的信令”。这只是一个事实陈述。authorized...Data(NSSF → AMF): 这是NSSF下发的信息,它描述的是一种“策略/许可”。NSSF在说:“基于你的上报、全网的策略以及用户的签约,我授权在这些TA上可以使用这些S-NSSAI”。 NSSF返回的authorized...Data通常是AMF上报的supported...Data的子集,因为它叠加了更上层的网络策略。
Q5:如果网络变化非常频繁,NSSF会不会产生大量的通知,从而形成“通知风暴”?
A5:有可能,规范的设计考虑了这一点。
- 聚合与节流 (Throttling): NSSF的实现可以(并且应该)包含聚合和节流逻辑。例如,如果在1秒内连续收到了对同一个TA的3次变更,NSSF可以聚合这些变更,只在1秒结束时发送一次最终状态的通知,而不是发送3次。
- 订阅粒度: AMF可以按需订阅,只订阅自己关心的TA和事件类型,避免接收不必要的信息。
- 网络设计: 运营商在规划网络变更时,也会尽量避免在短时间内进行大量、频繁的自动变更,通常会设置变更窗口和变更速率限制。 通过实现逻辑、订阅策略和网络规划的结合,可以有效地控制通知的频率,避免“通知风暴”。