NetScaler

用例1:SMPP负载均衡

通过使用短消息点对点(SMPP)协议,每天在个人和增值服务提供商(如银行、广告商和目录服务)之间交换数百万条短消息。通常,消息传递会延迟,因为服务器过载,并且在服务器之间没有最佳地分配流量。NetScaler支持SMPP负载平衡,并提供跨服务器的最佳消息分发,防止性能差和中断。

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

通过NetScaler实现SMPP消息的负载均衡,可以获得以下好处:

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

SMPP简介

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

移动网络中的SMPP实体(esme、re和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可以发送submit_sm或data_sm消息、接收deliver_sm或data_sm消息,或者发送和接收这些类型的消息中的任何一种,这取决于ESME绑定到MC的模式。ESME还可以发送辅助消息,如query_sm、replace_sm和cancel_sm,以查询先前消息传递的状态、用新消息替换先前消息或取消未传递的消息。

如果由于ESME不可用或移动用户未在线而导致消息未发送,则消息将进入队列。稍后,当MC检测到移动用户现在可达时,它通过接收器或收发器会话向ESME发送一个alert_notification PDU,请求传递任何排队的消息。

每个请求PDU都有一个唯一的序列号。响应PDU具有与原始请求相同的序列号。由于SMPP上的消息交换可以采用异步模式,因此ESME或MC可以一次发送多个请求。序列号在同一SMPP会话中返回响应时起着至关重要的作用。换句话说,序列号使请求和响应匹配成为可能。

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

trafficflow

限制:

NetScaler设备不支持出站操作。也就是说,消息中心不能通过NetScaler设备与ESME发起SMPP会话。

SMPP负载均衡如何在NetScaler上工作

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

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

来自esme的消息

每个ESME都需要在NetScaler上添加一个用户进行认证。客户端通过发送绑定请求与ADC上配置的SMPP虚拟服务器建立TCP连接。ADC对客户端进行身份验证,如果成功,则解析绑定消息。然后,ADC将请求发送到由配置的负载平衡方法选择的消息中心。如果到消息中心的连接不可用于重用,那么ADC将通过向消息中心发送新的绑定请求来打开与消息中心的TCP连接。

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

在最初的绑定请求中,客户端指定它可以服务的地址范围。该范围用于从消息中心向客户端转发deliver_sm或data_sm消息。

来自消息中心的消息

可以处理特定地址范围的esme被分组到一个集群中。集群中的所有节点都提供相同的凭据。在集群内,只使用轮循方式进行负载均衡。消息中心向NetScaler发送一个deliver_sm消息,用于发送MO (mobile originated)消息。如果可以为目标地址范围(例如,以998开头的数字)提供服务的集群绑定到ADC,那么它将选择该集群,然后在该集群中的ESME节点之间对消息进行负载平衡。

如果可以为地址范围提供deliver_sm消息的ESME未绑定到ADC,并且启用了消息队列,则该消息将被排队,直到该客户端以接收或收发模式绑定到ADC。您可以指定队列的大小。

下图展示了esme、NetScaler和消息中心之间的pdu内部流。为简单起见,只显示了两个esme和两个消息中心。

埃斯米

消息流(pdu):

  1. ESME1向NetScaler发送绑定请求
  2. NetScaler向MC1发送绑定请求
  3. MC1向NetScaler发送绑定响应
  4. NetScaler向ESME1发送绑定响应
  5. ESME1向NetScaler发送submit_sm(1)
  6. ESME1向NetScaler发送submit_sm(2)
  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向NetScaler发送submit_sm(3)
  18. NetScaler将submit_sm(3)转发给MC1
  19. MC2向NetScaler发送deliver_sm (ESME2提供消息中指定的地址范围)
  20. MC1向NetScaler发送submit_sm_resp(3)
  21. NetScaler将submit_sm_resp(3)转发给ESME2
  22. NetScaler将deliver_sm转发给ESME2
  23. ESME2向NetScaler发送deliver_sm_resp
  24. MC1向NetScaler发送alert_notification (ESME1提供消息中指定的地址范围)
  25. NetScaler将deliver_sm_resp转发给MC2
  26. NetScaler将alert_notification转发给ESME1

消息中心的运行状况监视

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

消息中心的内容切换

消息中心可以接受来自esme的多个连接(或绑定请求)。您可以配置NetScaler根据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将选择特定的消息中心。VMS代表语音邮件系统。

例子:

SMPP.BINDINFO.SYSTEM_TYPE.EQ(“虚拟机”)

  • 根据ESME的号码类型(TON):在以下示例表达式中,如果TON = 1(1表示国际号码),ADC将选择特定的消息中心。

例子:

SMPP.BINDINFO.ADDR_TON.EQ (1)

  • 根据ESME的NPI (number plan indicator):在以下示例表达式中,如果NPI = 0(0表示未知连接),ADC将选择特定的消息中心。

例子:

SMPP.BINDINFO.ADDR_NPI.EQ (0)

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

例子:

SMPP.BINDINFO.TYPE.EQ(收发)

串联消息处理

一条短信的最大容量为140字节。较长的消息必须分解成较小的部分。如果目的地手机有能力,这些消息将被合并并作为一条长SMS发送。NetScaler将消息的片段转发到同一个消息中心。每条消息包含一个引用号、一个序列号和片段总数。长消息的每个片段的引用号是相同的。序列号指定了特定片段在完整消息中的位置。接收到所有的片段后,ESME将这些片段组合成一条长消息,并将该消息发送给移动用户。

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

限制

不支持来自消息中心的大于59字节的消息id。如果消息中心返回的消息ID长度超过59字节,辅助操作将失败,NetScaler将返回错误消息。

在NetScaler上配置SMPP负载均衡

为了在ADC上配置SMPP负载分担,需要执行以下任务:

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

使用命令行方式配置SMPP负载分担

在命令提示符下,输入:

add smpp user  -password  add service   smpp  -customserverID  add lb vserver   smpp  bind lb vserver   set smpp param 

例子

add smpp user smppclient1 -password c03ebb540695b6110eb31172f32245a1 -encrypted -encryptmethod encmthd2 add smpp user smppclient2 -password c03ebb540695b6110eb31172f32245a1 -encrypted -encryptmethod encmthd2 add service smmpsvc 10.102.84.140 smpp 2775 -gslb NONE -maxReq 0 -cip DISABLED -usip NO -useproxyport YES -sp ON -cltTimeout 180 -svrTimeout 360 -CustomServerID ab -CKA NO -TCPB NO -CMP NO添加服务smmpsvc 10.102.81.175 smpp 2775 -gslb NONE -maxClient 0 -maxReq 0 -cipDISABLED -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 - addresrange "d*" 

使用配置实用工具配置SMPP负载均衡

  1. 进入“System > User Administration > SMPP Users”,添加SMPP用户。
  2. 进入“流量管理>负载均衡>配置SMPP参数”界面,根据实际部署情况设置相关参数。
  3. 在“流量管理>负载均衡>虚拟服务器”中,添加SMPP类型的虚拟服务器。
  4. 2 .单击“服务”区域中的,新建服务类型为“SMPP”的服务,并指定“服务器ID”。