跳到主要内容

OmniSCP 操作指南

目录

  1. 组件概述
  2. 3GPP 角色和规范参考
  3. SBI 端点
  4. 配置参考
  5. 关键程序
  6. 可观察性
  7. 已知限制
  8. 故障排除

组件概述

OmniSCP 实现了 3GPP TS 29.500 和 TS 23.501 中定义的服务通信代理 (SCP) 网络功能。SCP 在 5G 基于服务的架构 (SBA) 中充当 NF 消费者和 NF 生产者之间的 HTTP 反向代理。它提供委托的 NRF 发现、NF 生产者实例之间的负载均衡、失败重试和 NRF 发现结果缓存。

路由模式

SCP 支持三种路由模式,在每个传入请求中按优先顺序进行评估:

  1. 直接转发 — 存在 3gpp-Sbi-Target-apiRoot 头。��求直接转发到指定的基本 URI,而不进行 NRF 查找。
  2. 委托发现 — 存在 3gpp-Sbi-Discovery-target-nf-type3gpp-Sbi-Discovery-service-names 头。SCP 查询 NRF(或命中缓存)并通过配置的负载均衡策略选择一个实例。
  3. 基于路径的推断 — 没有路由头。SCP 从路径前缀推断目标 NF 类型(例如,/nudm- → UDM)并执行委托发现。

3GPP 角色和规范参考

项目参考
SCP NF 定义3GPP TS 23.501 第 7.3 节
SCP 间接通信模型3GPP TS 29.500 第 6.10 节
3gpp-Sbi-Discovery-* 头3GPP TS 29.500 第 6.10.3 节
3gpp-Sbi-Target-apiRoot 头3GPP TS 29.500 第 6.10.3.2 节
3gpp-Sbi-Producer-Id 头3GPP TS 29.500 第 6.10.3.3 节
SCP 负载均衡3GPP TS 29.500 第 6.10.4 节
NF 发现服务3GPP TS 29.510 第 6.2 节
NRF NF 状态通知3GPP TS 29.510 第 6.3 节
SBI 通用框架3GPP TS 29.500

SBI 端点

OmniSCP 作为透明代理运行。只有一个本地处理的端点;所有其他路径都被代理到适当的 NF 生产者。

方法路径本地处理描述
POST/nnrf-nfm/v1/nf-status-notify接收 NRF NF 状态变化通知。在 NF_DEREGISTEREDNF_PROFILE_CHANGED 事件时,��效整个发现缓存。返回 204 无内容。
*/*(所有其他路径)否 — 代理任何不匹配上述的方式和路径都根据活动路由模式代理到解析的 NF 生产者。

代理错误响应

当 SCP 无法完成代理操作时,它会根据 TS 29.500 返回 ProblemDetails 主体。

HTTP 状态原因条件
400 错误请求MANDATORY_IE_MISSING没有可用的路由信息:没有 3gpp-Sbi-Target-apiRoot,没有发现头,且路径无法映射到已知服务。
502 错误网关TARGET_NF_NOT_REACHABLE所有选定的 NF 生产者实例在重试后返回 5xx 或连接错误,或无法解析发现实例的 SBI URI。
504 网关超时NF_DISCOVERY_FAILURENRF 发现返回零个 NF 实例。
500 内部服务器错误SYSTEM_FAILURESCP 代理中的意外内部错误。

消耗的 3gpp-Sbi 头

描述
3gpp-Sbi-Target-apiRoot直接路由目标。在转发之前被剥离。
3gpp-Sbi-Discovery-target-nf-type要发现的 NF 类型(例如,UDM)。用于委托发现。在转发之前被剥离。
3gpp-Sbi-Discovery-service-names以逗号分隔的服务名称列表。第一个值用作主要值。在转发之前被剥离。
3gpp-Sbi-Discovery-requester-nf-typeNRF 查询范围的请求者 NF 类型。在转发之前被剥离。
3gpp-Sbi-Discovery-target-plmn-list目标 PLMN 列表。传递给 NRF 发现。在转发之前被剥离。
3gpp-Sbi-Discovery-requester-snssai-list请求者 S-NSSAI 列表。传递给 NRF 发现。在转发之前被剥离。
3gpp-Sbi-Discovery-nf-set-id用于发现的 NF 集 ID 过滤器。在转发之前被剥离。
3gpp-Sbi-Discovery-target-nf-instance-id要针对的特定 NF 实例 ID。在转发之前被剥离。
3gpp-Sbi-Discovery-requester-nf-instance-id请求者实例 ID。在转发之前被剥离。

产生的 3gpp-Sbi 头

描述
3gpp-Sbi-Producer-Id添加到每个代理响应中。包含处理请求的 NF 生产者的 nfInstanceId,使消费者与生产者的绑定得以实现,依据 TS 29.500 第 6.10.3.3 节。

配置参考

所有参数通过应用环境设置(通常是 config/runtime.exs)。

config :omniscp,
sbi_scheme: "http",
sbi_addr: "127.0.0.200",
sbi_port: 7777,
nrf_uri: "http://127.0.0.10:7777",
mcc: "999",
mnc: "70",
heartbeat_interval: 10_000,
discovery_cache_ttl: 60_000,
lb_strategy: :round_robin,
max_retries: 1,
upstream_timeout: 5_000

参数表

参数默认值类型描述
sbi_scheme"http"字符串SBI 监听器的传输方案。
sbi_addr"127.0.0.200"字符串SBI HTTP 服务器绑定的 IP 地址。NF 消费者必须将 SBI 流量路由到此地址。
sbi_port7777整数SBI HTTP 服务器监听的 TCP 端口。
nrf_uri"http://127.0.0.10:7777"字符串NRF 的基本 URI。用于 NF 注册、心跳和代表消费者的 NF 发现查询。
mcc"999"字符串移动国家代码。包含在注册到 NRF 的 SCP NF 配置文件中。
mnc"70"字符串移动网络代码。包含在注册到 NRF 的 SCP NF 配置文件中。
heartbeat_interval10_000整数(毫秒)NRF 心跳请求之间的间隔。
discovery_cache_ttl60_000整数(毫秒)NRF 发现缓存条目的生存时间,按 {target_nf_type, service_name} 键入。过期条目在查找时懒惰地驱逐,并由后台清理任务每 30 秒执行一次。对于稳定的部署,增加此值;当 NF 配置文件频繁变化时,减少此值。
lb_strategy:round_robin原子NF 生产者选择的负载均衡策略。有效值::round_robin:weighted:priority。有关语义,请参见负载均衡部分。
max_retries1整数当 NF 生产者返回 5xx 或连接错误时的最大重试次数。值为 1 表示一次原始尝试加一次重试。设置为 0 以禁用重试。
upstream_timeout5_000整数(毫秒)对 NF 生产者的上游 HTTP 请求的超时(接收超时)。超过此超时的请求将被视为失败,并可能触发重试。

负载均衡策略

策略描述
:round_robin按顺序循环遍历健康实例。状态在每个 {nf_type, service_name} 对中维护。这是默认的推荐策略,适用于均匀的 NF 部署。
:weighted选择具有最低 load - capacity 分数的实例。使用来自 NRF NF 配置文件的 loadcapacity 字段。优先选择容量高且当前负载低的实例。
:priority选择具有最低 priority 值(最高优先级)的实例。适用于主动/备用部署。

在连续 3 次失败后,实例被标记为不健康,并在 30 秒冷却后自动恢复。当所有实例都不健康时,负载均衡器会回退到完整的实例列表。


关键程序

直接转发(模式 1)

委托发现和转发(模式 2)

NRF 状态通知(缓存失效)

基于路径的服务推断(模式 3)

当没有路由头���,SCP 从请求路径前缀提取服务名称,并使用以下内置表将其映射到 NF 类型:

路径前缀NF 类型
nudm-UDM
nausf-AUSF
namf-AMF
nsmf-SMF
npcf-PCF
nudr-UDR
nnssf-NSSF
nbsf-BSF
nnrf-NRF

注意:nchf-nnef-naf- 前缀不在内置映射中(限制 SCP-L1)。对 CHF、NEF 或 AF 服务的请求在使用模式 3 时需要显式的发现头。


可观察性

监测事件

事件测量标签描述
[:omniscp, :proxy, :requests]count, duration_mstarget_nf_type, result每个请求的代理结果
[:omniscp, :proxy, :result]count, duration_mstarget_nf_type, result用于分布直方图的相同事件
[:omniscp, :discovery, :cache]hits, missestarget_nf_type, service_name每个服务的缓存命中/未命中
[:omniscp, :cache, :hit]count聚合缓存命中计数器
[:omniscp, :cache, :miss]count聚合缓存未命中计数器
[:omniscp, :associations, :active]count测量:活动代理关联
[:omni5g, :nrf, :registration]statusnf_typeNRF 注册状态(1=已注册,0=未注册)

结果标签值��success(2xx/3xx)、client_error(4xx)、server_error(5xx)、error(连接/超时)。

Prometheus 指标

SCP 代理指标

指标类型标签描述
omni_scp.proxy.requests.countcountertarget_nf_type, result每个请求的代理计数
omni_scp.proxy.requests.duration_mssummarytarget_nf_type每个请求的代理持续时间
omni_scp.proxy_requests.totalcountertarget_nf_type, result总代理请求
omni_scp.proxy_request.duration_msdistributiontarget_nf_type代理请求持续时间(桶:1、5、10、25、50、100、250、500、1000)
omni_scp.active_associations.countgauge--活动 NF 关联的数量

缓存指标

指标类型标签描述
omni_scp.discovery.cache.hitscountertarget_nf_type, service_name每个服务的缓存命中
omni_scp.discovery.cache.missescountertarget_nf_type, service_name每个服务的缓存未命中
omni_scp.cache_hits.totalcounter--聚合缓存命中计数器
omni_scp.cache_misses.totalcounter--聚合缓存未命中计数器

NRF 指标

指标类型标签描述
omni_scp.nrf.registration.statusgaugenf_typeNRF 注册状态(1=已注册,0=未注册)

BEAM VM 指标

指标类型描述
beam.memory.totalgauge总 BEAM 内存(字节)
beam.memory.processesgaugeErlang 进程使用的内存
beam.memory.processes_usedgauge进程实际使用的内存
beam.memory.systemgauge系统内存
beam.memory.atomgauge总原子内存
beam.memory.atom_usedgauge使用的原子内存
beam.memory.binarygauge二进制内存
beam.memory.codegauge代码内存
beam.memory.etsgaugeETS 表内存
beam.processes.countgaugeErlang 进程数量
beam.ports.countgaugeErlang 端口数量
beam.atom.countgauge原子数量
beam.vm.uptimegaugeVM 运行时间(秒)

日志模式

级别模式意义
infoReceived NRF status notification收到 NF 状态通知
infoNRF notification: event=<E> nf=<URI>解析的通知事件
debugSCP direct forward: <METHOD> <URL>模式 1 转发
debugSCP delegated forward: <METHOD> <URL> (attempt <N>)模式 2/3 转发尝试
warningSCP retrying after <STATUS> from <ID>...由于 5xx 触发的重试
warningSCP retrying after error from <ID>...由于连接错误触发的重试
warningSCP cannot determine target for <METHOD> <PATH>模式 3 路径不在服务映射中
warningNRF discovery returned no instances for <NF>/<SVC>发现返回空列表
warningAll NF instances unhealthy, falling back to full listLB 健康回退
errorNRF discovery failed: ...NRF 查询错误
errorSCP proxy error: ...意外的代理失败
infoNF instance <ID> recovered after cooldown实例健康恢复

已知限制

ID严重性描述
SCP-H4ECIES SUCI 解密未在底层 Omni5gEx 共享库中实现。需要 SCP 在转发之前解密 SUCI 的请求(在某些 AUSF/UDM 的间接通信模型中使用)将被转发而不进行解密。这不影响大多数 SBA 部署,因为解密由 AUSF 完成。
SCP-M1过载控制未实现。未生成或消耗 3gpp-Sbi-Oci(过载控制信息)头。在过载场景中,SCP 将继续转发请求,而不会减轻负载或对消费者施加压力。
SCP-M2负载控制指示未实现。未生成 3gpp-Sbi-Lci(负载控制信息)头。消费者无法使用 OmniSCP 获��� NF 负载提示以进行自己的负载控制决策。
SCP-L1基于路径的服务推断映射(模式 3)缺少 nchf-(CHF)、nnef-(NEF)和 naf-(AF)前缀条目。对这些服务的请求在没有显式发现头时将收到 400 错误请求,原因是 MANDATORY_IE_MISSING。解决方法:配置消费者为这些服务发送 3gpp-Sbi-Discovery-* 头。
SCP-L3事件为 NF_DEREGISTEREDNF_PROFILE_CHANGED 的 NRF 状态通知会清除整个发现缓存,而不仅仅是受影响的 {nf_type, service_name} 条目。在 NF 配置文件频繁变化的部署中,这会导致 NRF 重新发现查询的激增。

故障排除

400 错误请求 — MANDATORY_IE_MISSING

SCP 无法确定路由目标。检查:

  1. 消费者是否发送了 3gpp-Sbi-Target-apiRoot 或同时发送了 3gpp-Sbi-Discovery-target-nf-type3gpp-Sbi-Discovery-service-names
  2. 如果依赖于基于路径的推断(模式 3),路径前缀是否出现在内置服务映射中?注意 nchf-nnef-naf- 缺失(SCP-L1)。为这些服务添加显式头。

504 网关超时 — NF_DISCOVERY_FAILURE

NRF 返回了没有 NF 实例。检查:

  1. NRF 是否可以从 OmniSCP 访问?验证 nrf_uri 和网络连接。
  2. 目标 NF 类型是否在 NRF 中注册?直接查询 NRF:GET {nrf_uri}/nnrf-disc/v1/nf-instances?target-nf-type=<TYPE>
  3. 检查是否刚刚有 NRF 状态通知清除了缓存(NF_DEREGISTERED 事件),并且 NF 尚未重新注册。

502 错误网关 — TARGET_NF_NOT_REACHABLE

所有 NF 生产者实例失败。检查:

  1. NF 生产者是否正在运行并且可以在其 NRF 配置文件中报告的 SBI 地址上访问?
  2. 检查 upstream_timeout。如果 NF 生产者响应缓慢,请增加此值。
  3. 查看 max_retries。如果设置为 0,则单个失败将立即变为 502。
  4. 检查日志中的负载均衡器健康状态:查找 NF instance <ID> marked unhealthy after N failures

发现缓存导致过时路由

如果 NF 生产者在没有适当的 NRF 注销的情况下更改地址或重启,缓存可能会保留过时的 SBI URI,直到 TTL 过期。选项:

  1. 减少 discovery_cache_ttl 以限制过时窗口。
  2. 确保 NF 生产者在关闭时从 NRF 注销;这会触发 NRF 状态通知,清除 OmniSCP 缓存。
  3. OmniSCP 的进程重启会清除所有缓存状态。

高代理延迟

  1. 检查 omni_scp.proxy_request.duration_ms 直方图以获取延迟分布。
  2. 比较缓存命中率(omni_scp.cache_hits.totalomni_scp.cache_misses.total)。高未命中率意味着频繁的 NRF 查询。增加 discovery_cache_ttl
  3. 检查 upstream_timeout — 超时的请求在触发重试之前会将整个超时持续时间添加到延迟中。

NRF 注册未维护

检查 omni_scp.nrf.registration.status 指标。如果它读取为 0:

  1. 验证 nrf_uri 是否正确且 NRF 可访问。
  2. 检查 mccmnc 是否与 NRF PLMN 配置匹配。
  3. 在应用程序启动时查看 NRF 注册错误的日志。