ADC

用例 1:SMPP 负载平衡

通过使用短消息对等 (SMPP) 协议,个人和增值服务提供商(如银行、广告商和目录服务)之间每天交换数百万条短消息。通常情况下,邮件传递会延迟,因为服务器负载过重,而且流量未在服务器之间以最佳方式分配。Citrix ADC 支持 SMPP 负载平衡,并在服务器之间提供最佳消息分配,从而防止性能不佳和中断。

Citrix ADC 在从客户端接收消息时在服务器端执行负载平衡,并在从服务器接收消息时在客户端执行负载平衡。

Citrix ADC 对 SMPP 消息进行负载平衡具有以下优势:

  • 服务器上更好的负载分配,这意味着对最终用户的响应时间更快
  • 服务器运行状况监视和更好的故障转移功能
  • 快速轻松地添加新服务器(消息中心),无需更改客户端配置
  • 高可用性

SMPP 简介

SMPP 是一种应用层协议,用于通过长期 TCP 连接在外部短消息实体 (ESME)、路由实体 (RE) 和消息中心 (MC) 之间传输短消息。它用于在朋友、联系人和银行(移动银行)、广告商(移动商务)和目录服务等第三方之间发送短信服务(SMS)消息。来自 ESME(非移动实体)的消息到达 MC,后者将这些消息分发给移动电话等短消息实体。SMPP 也被中小型企业用来向第三方发送短信(例如,购买产品、支付账单和资金转账)。这些消息到达 MC 并转发到目标 MC 或 ESME。

下图显示了移动网络中的不同 SMPP 实体:ESMES、RES 和 MC。

体系结构

移动网络中不同 SMPP 实体的架构概述

注意:客户端和 ESME 术语在整个文档中可互换使用。

ESME(客户端)以三种模式之一打开与 MC 的连接:作为发射器、接收器或收发器。作为一个发射器,它只能提交消息进行传递。作为接收者,它只能接收消息。作为收发器,ESME 可以提交和接收消息。ESME 会向 MC 发送三条消息(也称为 PDU)中的一条:bind_transmitter、bind_receiver 或 bind_transceiver。MC 会根据请求的情况使用 bind_transmitter_resp、bind_receiver_resp 或 bind_transceiver_resp 进行响应。

建立连接后,ESME 可以根据其绑定到 MC 的模式,发送 submit_sm or data_sm message 消息,接收 deliver_sm or data_sm 消息,或发送和接收任何这些类型的消息。ESME 还可以发送辅助消息,例如 query_sm、replace_sm 和 cancel_sm,以查询早期邮件传递的状态、用新邮件替换早期邮件或取消未传递的邮件。

如果因 ESME 不可用或移动订阅者未联机而未传递邮件,则该邮件将排队。稍后,当 MC 检测到移动用户现在可以访问时,它会通过接收器或收发器会话向 ESME 发送一个 alert_通知PDU,请求传递任何排队的消息。

每个请求 PDU 都有一个唯一的序列号。响应 PDU 具有与原始请求相同的序列号。由于通过 SMPP 进行的消息交换可以处于异步模式,ESME 或 MC 可以一次发送多个请求。序列号在同一 SMPP 会话中返回响应方面起着关键作用。换句话说,序列号使请求和响应匹配成为可能。

下图显示了 ESME 绑定为收发器时流量如何使用各种 PDU。

交通流量

限制:

Citrix ADC 设备不支持出站操作。也就是说,消息中心无法通过 Citrix ADC 设备启动带 ESME 的 SMPP 会话。

SMPP 负载平衡在 Citrix ADC 上的工作原理

ESME(客户端)发送绑定消息以打开与 Citrix ADC 的连接。ADC 对每个 ESME 进行身份验证,如果成功,则以适当的消息响应。Citrix ADC 与每个消息中心建立连接,并对这些消息中心之间的所有消息进行负载平衡。当 ADC 从客户端接收消息时,它会重新使用与消息中心的打开连接,或者在打开的连接不可用时向消息中心发送绑定请求。

ADC 可以负载平衡来自客户端和服务器的消息。它可以监视消息中心的运行状况并处理连接的消息。它还为消息中心提供内容切换支持。

源自欧洲和微型企业的报文

必须以用户身份在 Citrix ADC 上添加每个 ESME 以进行身份验证。客户端通过发送绑定请求,与 ADC 上配置的 SMPP 虚拟服务器建立 TCP 连接。ADC 对客户端进行身份验证,如果成功,则解析绑定消息。然后,ADC 将请求发送到配置的负载平衡方法选择的消息中心。如果与消息中心的连接无法重复使用,ADC 将通过向消息中心发送新的绑定请求来打开与消息中心的 TCP 连接。

在将响应 (submit_sm_resp 或 data_sm_resp) 从消息中心转发到客户端之前,ADC 会向消息 ID 添加一个自定义服务器 ID,以标识消息中心进行辅助操作(如查询、替换或取消消消息请求)。来自其他客户端的请求以相同的方式进行负载平衡。

在原始绑定请求中,客户端指定它可以提供的地址范围。此范围用于将传递 _sm 或 data_sm 邮件从邮件中心转发到客户端。

来自消息中心的邮件

可以处理特定地址范围的 ESMES 分组到一个群集中。群集中的所有节点都提供相同的凭据。在群集中,只使用轮询方法进行负载平衡。要传递移动源 (MO) 消息,消息中心会向 Citrix ADC 发送一条传递 _sm 消息。如果能够提供目标地址范围(例如,以 998 开头的数字)的群集绑定到 ADC,则会选择该群集,然后在该群集中的 ESME 节点之间负载平衡消息。

如果能够在地址范围内提供传递 _sm 消息的 ESME 未绑定到 ADC,并且消息队列已启用,则消息将排队,直到此类客户端以接收器或收发器模式绑定到 ADC。您可以指定队列的大小。

下图说明了 ESME、Citrix ADC 和消息中心之间 PDU 的内部流程。为简单起见,仅显示两个 ESME 和两个消息中心。

ESME

报文流 (PDU):

  1. ESME1 向 NetScaler 发送绑定请求
  2. NetScaler 将绑定请求发送到 MC1
  3. MC1 将绑定响应发送到 NetScaler
  4. NetScaler 将绑定响应发送到 ESME1
  5. ESME1 向 NetScaler 发送 submit_sm(1)
  6. ESME1 将 submit_sm(2) 发送到 NetScaler
  7. NetScaler 将 submit_sm(1) 转发到 MC1
  8. NetScaler 将绑定请求发送到 MC2
  9. MC2 将绑定响应发送到 NetScaler
  10. NetScaler 将 submit_sm(2) 转发到 MC2
  11. MC1 向 NetScaler 发送 submit_sm_resp(1)
  12. MC2 向 NetScaler 发送 submit_sm_resp(2)
  13. NetScaler 将 submit_sm_resp(1) 转发至 ESME1
  14. NetScaler 将 submit_sm_resp(2) 转发至 ESME1
  15. ESME2 向 NetScaler 发送绑定请求
  16. NetScaler 将绑定响应发送到 ESME2
  17. ESME2 将 submit_sm(3) 发送到 NetScaler
  18. NetScaler 将 submit_sm(3) 转发到 MC1
  19. MC2 将 deliver_sm 发送到 NetScaler(ESME2 提供消息中指定的地址范围)
  20. MC1 向 NetScaler 发送 submit_sm_resp(3)
  21. NetScaler 将 submit_sm_resp(3) 转发至 ESME2
  22. NetScaler 将 deliver_sm 转发至 ESME2
  23. ESME2 将 deliver_sm_resp 发送至 NetScaler
  24. MC1 向 NetScaler 发送 alert_notification(ESME1 提供消息中指定的地址范围)
  25. NetScaler 将 deliver_sm_resp 转发至 MC2
  26. NetScaler 将 alert_notification 转发到 ESME1

消息中心的运行状况监视

默认情况下,TCP_Default 监视器绑定到 SMPP 服务,但您可以绑定类型为 SMPP 的自定义监视器。自定义监视器打开到消息中心的 TCP 连接,并发送一个 enquire_link 数据包。根据探头的成功或失败,服务标记为“向上”或“向下”。

消息中心上的内容切换

消息中心可以接受来自 ESME 的多个连接(或绑定请求)。您可以将 Citrix ADC 配置为根据 SMPP 绑定参数进行内容切换这些请求。以下是一些用于配置方法以选择消息中心的常见表达式:

  • 基于地址范围:在以下示例表达式中,如果地址范围从 988 开始,ADC 会选择特定的消息中心。

示例:

SMPP.BINDINFO.ADDRESS_RANGE.CONTAINS(“^988”)

  • 基于 ESME ID:在以下示例表达式中,如果 ESME ID 等于 ESME1,ADC 会选择特定消息中心。

示例:

SMPP.BINDINFO.SYSTEM_ID.EQ(“ESME1”)

  • 基于 ESME 类型:在以下示例表达式中,如果 ESME 类型为 VMS,ADC 会选择特定消息中心。虚拟机代表语音邮件系统。

示例:

SMPP.BINDINFO.SYSTEM_TYPE.EQ(“VMS”)

  • 基于 ESME 的数字类型 (TON):在以下示例表达式中,如果 TON 等于 1(1 代表国际数字),ADC 会选择特定的消息中心。

示例:

SMPP.BINDINFO.ADDR_TON.EQ(1)

  • 基于 ESME 的数字计划指示器 (NPI):在以下示例表达式中,如果 NPI 等于 0(0 表示未知连接),ADC 会选择特定的消息中心。

示例:

SMPP.BINDINFO.ADDR_NPI.EQ(0)

  • 基于绑定类型:在以下示例表达式中,如果绑定类型为 TransCEVER,ADC 会选择特定的消息中心。(收发器可以发送和接收消息。)

示例:

SMPP.BINDINFO.TYPE.EQ(TRANSCEIVER)

连接消息处理

短信最多可容纳 140 个字节。较长的消息必须分解成较小的部分。如果目标移动设备有能力,则会将消息组合起来并作为一条长短信传递。Citrix ADC 会将消息片段转发到同一消息中心。每条消息都包含参考编号、序列号和片段总数。对于长消息的每个片段,参考编号是相同的。序列号指定特定片段在完整消息中的位置。在收到所有片段后,ESME 将这些片段合并为一条长消息,并将消息传递给移动用户。

如果客户端与活动连接断开连接,则与消息中心的连接不会关闭。它被重复用于来自其他客户端的请求。

限制

不支持来自消息中心的消息 ID 超过 59 字节。如果消息中心返回的消息 ID 长度超过 59 个字节,辅助操作将失败,Citrix ADC 会以错误消息响应。

在 Citrix ADC 上配置 SMPP 负载平衡

执行以下任务以在 ADC 上配置 SMPP 负载平衡:

  1. 添加一个 SMPP 用户。ADC 在接受来自用户的绑定请求之前对用户进行身份验证。用户通常是 ESME。
  2. 添加负载平衡虚拟服务器,将协议指定为 SMPP。
  3. 添加服务,将协议指定为 SMPP,并为每个服务器提供唯一的自定义服务器 ID。将服务绑定到之前创建的负载平衡虚拟服务器。
  4. 或者,创建服务组并将服务添加到服务组。
  5. 或者,添加类型为 SMPP-ECV 的监视器并将其绑定到服务。默认情况下,将绑定 TCP 默认监视器。
  6. 设置 SMPP 参数,如客户端模式和消息队列。

使用命令行配置 SMPP 负载平衡的步骤

在命令提示符下,键入:

add smpp user <username> -password <password>  
add service <name> <IP> SMPP <port> –customserverID <customserverID>  
add lb vserver <name> <IP> SMPP <port>  
bind lb vserver <name> <service name>  
set smpp param  
<!--NeedCopy-->

示例

add smpp user smppclient1 -password c03ebb540695b6110eb31172f32245a1 -encrypted -encryptmethod ENCMTHD_2
add smpp user smppclient2 -password c03ebb540695b6110eb31172f32245a1 -encrypted -encryptmethod ENCMTHD_2
add service smmpsvc 10.102.84.140 SMPP 2775 -gslb NONE -maxClient 0 -maxReq 0 -cip DISABLED -usip NO -useproxyport YES -sp ON -cltTimeout 180 -svrTimeout 360 -CustomServerID ab -CKA NO -TCPB NO -CMP NO
add service smmpsvc2 10.102.81.175 SMPP 2775 -gslb NONE -maxClient 0 -maxReq 0 -cip DISABLED -usip NO -useproxyport YES -sp ON -cltTimeout 180 -svrTimeout 360 -CustomServerID xy -CKA NO -TCPB NO -CMP NO
add lb vserver smppvs SMPP 10.102.239.179 2775 -persistenceType NONE -cltTimeout 180
bind lb vserver smppvs smmpsvc2
bind lb vserver smppvs smmpsvc
set smpp param -addrrange "d*"
<!--NeedCopy-->

使用配置实用程序配置 SMPP 负载平衡

  1. 导航到 “ 系统” > “用户管理” > “SMPP 用户”,然后添加 SMPP 用户。
  2. 导航到 流量管理 > 负载平衡 > 配置 SMPP 参数,然后根据部署的要求设置参数。
  3. 导航到 流量管理 > 负载平衡 > 虚拟服务器,然后添加 SMPP 类型的虚拟服务器。
  4. 在“服务”部分中单击,添加 SMPP 类型的服务,然后指定服务器 ID。