发明内容
为至少在一定程度上克服相关技术中存在的问题,本申请提供一种短信发送的通道选择方法和装置。
根据本申请实施例的第一方面,提供一种短信发送的通道选择方法,包括:
根据目标号码确定待发送短信的逻辑队列序号,所述目标号码为接收所述待发送短信的手机号码;
根据所述逻辑队列序号和预设的存储结构信息,将所述待发送短信放入指定的物理队列;
根据多个发送通道与多个物理队列之间的对应关系,通过指定的发送通道将所述待发送短信取出并进行发送。
进一步地,所述根据目标号码确定待发送短信的逻辑队列序号,包括:
确定逻辑队列总数;
根据所述目标号码和所述逻辑队列总数确定待发送短信的逻辑队列序号。
进一步地,所述根据所述目标号码和所述逻辑队列总数确定待发送短信的逻辑队列序号,包括:
将所述目标号码通过映射函数转换为序列码;
根据所述序列码和所述逻辑队列总数计算出逻辑队列序号。
进一步地,所述根据所述序列码和所述逻辑队列总数计算出逻辑队列序号,包括:
所述逻辑队列序号LogicIndex=hash(mobile)%LogicSum;
其中,mobile为所述目标号码,hash()为映射函数,LogicSum为所述逻辑队列总数。
进一步地,所述将所述待发送短信放入指定的物理队列,包括:
根据所述逻辑队列序号和存储结构信息,确定所述待发送短信的物理队列;
将所述待发送短信添加到确定出的物理队列中。
进一步地,所述存储结构信息包括:分片的数量、每个分片中的物理队列数量;
相应地,所述确定所述待发送短信的物理队列,包括:
根据分片的数量确定每个分片对应的逻辑队列区间;
根据每个分片对应的逻辑队列区间和每个分片中的物理队列数量,确定每个分片中的每个物理队列所对应的逻辑队列区间;
根据所述逻辑队列序号和每个物理队列所对应的逻辑队列区间,确定所述待发送短信的物理队列。
进一步地,所述根据分片的数量确定每个分片对应的逻辑队列区间,包括:
根据分片的数量和逻辑队列总数计算最大分区队列数量;
按照最大分区队列数量,将逻辑队列依次分配到每个分片中;
其中,所述逻辑队列是预先配置的,所述逻辑队列总数为固定值。
进一步地,所述根据多个发送通道与多个物理队列之间的对应关系,包括:
确定各发送通道的权重;
根据权重确定各发送通道对应的逻辑队列区间;
根据每个物理队列所对应的逻辑队列区间,确定多个发送通道与多个物理队列之间的对应关系。
进一步地,所述根据权重确定各发送通道对应的逻辑队列区间,包括:
将各发送通道的权重相加得到总权重;
根据各发送通道的权重占所述总权重的比例,确定分配给各发送通道的逻辑队列的数量;
根据分配结果确定各发送通道对应的逻辑队列区间。
进一步地,所述通过指定的发送通道将所述待发送短信取出并进行发送,包括:
令指定的发送通道遍历其对应的所有物理队列;
从遍历的物理队列上取出所有的待发送短信并进行发送。
根据本申请实施例的第二方面,提供一种短信发送的通道选择装置,包括:
确定模块,用于根据目标号码确定待发送短信的逻辑队列序号,所述目标号码为接收所述待发送短信的手机号码;
存放模块,用于根据所述逻辑队列序号和预设的存储结构信息,将所述待发送短信放入指定的物理队列;
发送模块,用于根据多个发送通道与多个物理队列之间的对应关系,通过指定的发送通道将所述待发送短信取出并进行发送。
根据本申请实施例的第三方面,提供一种计算设备,所述计算设备包括:处理器和存储器;
所述存储器用于存储计算机程序指令;
所述计算设备运行时,所述处理器执行所述存储器中的计算机程序指令,以执行如上所述的任意一种方法的操作步骤。
本申请的实施例提供的技术方案具备以下有益效果:
本申请的方案能够在签名商户配置有多个发送通道的情况下,确保一个号码始终由一个固定的发送通道来发送短信,从而保证用户收到的同一签名商户的短信来自同一个号码,用户体验好;并且不需要维护用户、签名商户、发送通道之间的映射关系,成本较低。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本申请。
具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本申请相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本申请的一些方面相一致的方法和装置的例子。
图1是根据一示例性实施例示出的一种短信发送的通道选择方法的流程图。该方法可以应用于短信服务提供商的短信发送设备,包括以下步骤:
步骤S1:根据目标号码确定待发送短信的逻辑队列序号,所述目标号码为接收所述待发送短信的手机号码;
步骤S2:根据所述逻辑队列序号和预设的存储结构信息,将所述待发送短信放入指定的物理队列;
步骤S3:根据多个发送通道与多个物理队列之间的对应关系,通过指定的发送通道将所述待发送短信取出并进行发送。
本申请的方案能够在签名商户配置有多个发送通道的情况下,确保一个号码始终由一个固定的发送通道来发送短信,从而保证用户收到的同一签名商户的短信来自同一个号码,用户体验好;并且不需要维护用户、签名商户、发送通道之间的映射关系,成本较低。
参照图2,同一签名商户发送短信时,采用本申请方案的短信发送流程需要经过通道路由选择模块Route和通道发送模块Kernel两大模板完成。
流程说明:(1)签名商户调用短信服务提供商短信网关API完成短信发送;(2)Route从短信网关API获取到待发送短信;(3)Route基于权重的用户粘性算法算出待发送redis逻辑队列;(4)Route根据存储的静态路由信息算出实际待发送redis物理队列;(5)Kernel根据静态路由信息获取当前机器负责的运营商通道,进而获取发往该通道的短信数据进行发送。
其中与本专利相关的最重要的是两个算法:(一)静态路由算法;(二) 基于权重的用户粘性算法。下面讲解这两个算法。
静态路由算法:
根据通道权重算出总权重TotalWgt,如某通道组Group(i)中通道权重为: Wgt1、Wgt2、…、Wgtn,总权重TotalWgt=Wgt1+Wgt2+…+Wgtn
需要说明的是,通道权重是短信服务提供商给用户设置的,是预先设定的值。可以针对不同用户配置不同的通道组,通道组包含若干通道,根据通道质量和通道价格配置不同权重。
根据Redis集群中分片(Shard)的数量ShardSize,逻辑队列总数LoginSum,算出每个逻辑分区最大队列数量:
LogicItemSum=ceil(LogicSum/ShardSize),
最后得到每个Shard上逻辑队列区间:
LogicSection(shard(num))=[LogicSection(shard(num-1))+1,min(LogicSum,LogicSection(shard(num-1))+1+LogicItemSum)]
根据权重算出各通道逻辑队列区间LogicSection(way(j)):
LogicMin(way(j)(num))=LogicMax(way(j)(num-1))+1
LogicMax(way(j)(num))=ceil(LogicMax(way(j)(num-1))+1+(Wgt(way(num))/TotalWgt*LoginSum))
LogicSection(way(j)(num))=[LogicMin(way(j)(num),min(LogicMax(way(j)( num)),LogicSum)]
根据每个shard上每个通道最多物理队列数physicsItemSum,则1个物理队列最多对应ceil(LogicItemSum/physicsItemSum)个逻辑队列,进而算出物理队列区间:PhysicsSection(way(j)(num))
得到静态路由表逻辑队列、Shard、通道、物理队列的对应关系:
Group(i):
LogicSection(shard(num)):shard(num):way(j):PhysicsSection(way(j)(num))
基于权重的用户粘性算法:
Route根据手机号hashCode与逻辑队列总数LogicSum取模获取逻辑队列序号LogicIndex=hash(mobile)%LogicSum,同时也定位出了redis shard name=ShardName{ceil((hash(mobile)%LogicSum)/LogicItemSum)}
由LogicIndex和shardName根据静态路由算法算出的静态路由获取逻辑队列对应的物理队列PhysicsSection(way(j)(k)),由route生成待发送数据放入该shardName的物理队列上
Kernel根据当前机器运行的通道Way(index),反向获取通道组Group(i),再根据静态路由表获取所有关联的shard和物理队列。再遍历获取的所有shard 和物理队列,获取到数据后处理发送。
一些实施例中,所述根据目标号码确定待发送短信的逻辑队列序号,包括:
确定逻辑队列总数;
根据所述目标号码和所述逻辑队列总数确定待发送短信的逻辑队列序号。
需要说明的是,所述逻辑队列是预先配置的,所述逻辑队列总数为固定值。
一些实施例中,所述根据所述目标号码和所述逻辑队列总数确定待发送短信的逻辑队列序号,包括:
将所述目标号码通过映射函数转换为序列码;
根据所述序列码和所述逻辑队列总数计算出逻辑队列序号。
一些实施例中,所述根据所述序列码和所述逻辑队列总数计算出逻辑队列序号,包括:
所述逻辑队列序号LogicIndex=hash(mobile)%LogicSum;
其中,mobile为所述目标号码,hash()为映射函数,LogicSum为所述逻辑队列总数。
一些实施例中,所述将所述待发送短信放入指定的物理队列,包括:
根据所述逻辑队列序号和存储结构信息,确定所述待发送短信的物理队列;
将所述待发送短信添加到确定出的物理队列中。
一些实施例中,所述存储结构信息包括:分片的数量、每个分片中的物理队列数量;
相应地,所述确定所述待发送短信的物理队列,包括:
根据分片的数量确定每个分片对应的逻辑队列区间;
根据每个分片对应的逻辑队列区间和每个分片中的物理队列数量,确定每个分片中的每个物理队列所对应的逻辑队列区间;
根据所述逻辑队列序号和每个物理队列所对应的逻辑队列区间,确定所述待发送短信的物理队列。
一些实施例中,所述根据分片的数量确定每个分片对应的逻辑队列区间,包括:
根据分片的数量和逻辑队列总数计算最大分区队列数量;
按照最大分区队列数量,将逻辑队列依次分配到每个分片中。
其中,所述逻辑队列是预先配置的,所述逻辑队列总数为固定值。
一些实施例中,所述根据多个发送通道与多个物理队列之间的对应关系,包括:
确定各发送通道的权重;
根据权重确定各发送通道对应的逻辑队列区间;
根据每个物理队列所对应的逻辑队列区间,确定多个发送通道与多个物理队列之间的对应关系。
需要说明的是,所述发送通道的权重,是根据通道质量和通道价格配置预先设置好的。
一些实施例中,所述根据权重确定各发送通道对应的逻辑队列区间,包括:
将各发送通道的权重相加得到总权重;
根据各发送通道的权重占所述总权重的比例,确定分配给各发送通道的逻辑队列的数量;
根据分配结果确定各发送通道对应的逻辑队列区间。
一些实施例中,所述通过指定的发送通道将所述待发送短信取出并进行发送,包括:
令指定的发送通道遍历其对应的所有物理队列;
从遍历的物理队列上取出所有的待发送短信并进行发送。
下面结合具体的应用场景,对本申请的方案进行拓展说明。
参照图3,图中示出了短信发送通道选择的概述图。基于静态路由算法和基于权重的用户粘性算法为例,采用测试数据方式演示本申请的方案。
通道选择概述说明:
(1)签名商户给138******** 手机用户发短信;
(2)Route根据商户发送短信类型等信息获取通道组信息group1;
(3)Route根据手机号138******** 和通道组group1算出逻辑队列序号,进而算出shard4和物理独立序号1,如果图3中①所示;
(4)运行在机器A上的kernel负责往通道way1发送短信,根据通道所属通道组、权重和静态路由表算出way1负责shard3上的待发送队列物理序号 1,进而取出短信内容发送,如图3中②所示。
下面用测试数据详细介绍通道选择过程:
测试元数据如下:通道组为Group1{Way1,Way2,Way3},通道权重为 Wgt{Wgt1=13,Wgt2=1,Wgt3=1},Redis集群总分片数ShardSize=4,shardName 为{shard1,shard2,shard3,shard4},逻辑队列总数LogicSum=60(注意:为演算方便,取较小值60,其实逻辑队列数越大,数据越分散,发生数据倾斜可能性越低),Redis单Shard上单通道对应的物理队列总数physicsItemSum=4。
(一)静态路由算法:
1、通道组Group1中通道权重为:Wgt1=13、Wgt2=1、Wgt3=1,总权重 TotalWgt=(13+1+1)=15;
2、假设Redis集群中shard数shardSize=4,假设逻辑队列总数:LogicSum=60;算出每个逻辑分区最大队列数量: LogicItemSum=ceil(LogicSum/shardSize)=15;
3、得到每个shard上逻辑队列区间LogicSection(shard(num)):
shard1:[1,15]
shard2:[16,30]
shard3:[31,45]
shard4:[46,60]
4、根据权重算出各通道逻辑队列区间LogicSection(way(j)):
way1:[1,ceil(60*13/15)]=[1,52]
way2:[53,52+ceil(60*1/15)]=[53,56]
way3:[57,56+ceil(60*1/15)]=[57,60]
5、根据每个shard上每个通道最多物理队列数physicsItemSum=4,则1 个物理队列最多对应ceil(15/4)=4个逻辑队列,进而算出物理队列区间 PhysicsSection(way(j)(num)):
shard1:way1:[1,4]
shard2:way1:[1,4]
shard3:way1:[1,4]
shard4:way1:[1,2],way2:[3],way3:[4]
6、算出逻辑队列、Shard、通道、物理队列的对应关系:
Group1:
[1,15]:shard1:way1:[1,4]
[16,30]:shard2:way1:[1,4]
[31,45]:shard3:way1:[1,4]
[46,60]:shard4:way1:[1,2],way2:[3],way3:[4]
(二)基于权重的用户粘性算法:
1、路由模块根据手机号mobile=138******** 的hashCode与逻辑队列总数LogicSum取模,获取逻辑队列序号: LogicIndex=hash(mobile)%LogicSum=32,同时也定位出了redis shard name=ShardName{ceil((hash(mobile)%LogicSum)/LogicItemSum)}=shard3。如图4中①所示。
2、由LogicIndex和shardName根据静态路由算法算出的静态路由获取逻辑队列对应的物理队列PhysicsSection(way(j)(k)):
LogicIndex=32→Group1:[31,45]:shard3:way1:[1,4]→shard3:way1[1],如图4中②所示。
根据shard3:way1[1]生成对应的待发送数据,放入算出的待发送物理队列
3、Kernel根据当前机器运行的通道Way1,反向获取通道组Group1,再根据通道权重获取所有shard和逻辑队列区间,然后计算所有shard和物理队列。
Group1:
[1,15]:shard1:way1:[1,4]
[16,30]:shard2:way1:[1,4]
[31,45]:shard3:way1:[1,4]
[46,60]:shard4:way1:[1,2],way2:[3],way3:[4]
再遍历获取的所有shard及shard上的物理队列,获取到数据后处理发送。即如图5所示通道Way1对应的待处理的物理队列。
本申请的方案,针对签名商户分配一组通道,不受单条通道故障影响,保证了通道的高可用,即使一个通道故障时,会自动选择其他通道进行发送。
同一签名商户既能从一组通道中发送短信,又能保证一个用户从同一通道发送。通过通道权重和路由算法解决多通道发送和用户粘性之间矛盾,既保证多通道发送又保证用户粘性。
给同一签名商户配置的一组通道,通道路由选择时,会根据通道权重选择,从而使签名商户可以在通道价格与通道质量间折中,优先选择便宜、通道发送到达率高的通道选择方案。
本申请还提供如下的实施例:
一种短信发送的通道选择装置,包括:
确定模块,用于根据目标号码确定待发送短信的逻辑队列序号,所述目标号码为接收所述待发送短信的手机号码;
存放模块,用于根据所述逻辑队列序号和预设的存储结构信息,将所述待发送短信放入指定的物理队列;
发送模块,用于根据多个发送通道与多个物理队列之间的对应关系,通过指定的发送通道将所述待发送短信取出并进行发送。
关于上述实施例中的装置,其中各个模块执行操作的具体步骤已经在有关该方法的实施例中进行了详细描述,此处不再详细阐述说明。
本申请还提供如下的实施例:
一种计算设备,所述计算设备包括:处理器和存储器;
所述存储器用于存储计算机程序指令;
所述计算设备运行时,所述处理器执行所述存储器中的计算机程序指令,以执行如上所述的任意一种方法的操作步骤。
可以理解的是,上述各实施例中相同或相似部分可以相互参考,在一些实施例中未详细说明的内容可以参见其他实施例中相同或相似的内容。
需要说明的是,在本申请的描述中,术语“第一”、“第二”等仅用于描述目的,而不能理解为指示或暗示相对重要性。此外,在本申请的描述中,除非另有说明,“多个”的含义是指至少两个。
流程图中或在此以其他方式描述的任何过程或方法描述可以被理解为,表示包括一个或更多个用于实现特定逻辑功能或过程的步骤的可执行指令的代码的模块、片段或部分,并且本申请的优选实施方式的范围包括另外的实现,其中可以不按所示出或讨论的顺序,包括根据所涉及的功能按基本同时的方式或按相反的顺序,来执行功能,这应被本申请的实施例所属技术领域的技术人员所理解。
应当理解,本申请的各部分可以用硬件、软件、固件或它们的组合来实现。在上述实施方式中,多个步骤或方法可以用存储在存储器中且由合适的指令执行系统执行的软件或固件来实现。例如,如果用硬件来实现,和在另一实施方式中一样,可用本领域公知的下列技术中的任一项或他们的组合来实现:具有用于对数据信号实现逻辑功能的逻辑门电路的离散逻辑电路,具有合适的组合逻辑门电路的专用集成电路,可编程门阵列(PGA),现场可编程门阵列(FPGA)等。
本技术领域的普通技术人员可以理解实现上述实施例方法携带的全部或部分步骤是可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,该程序在执行时,包括方法实施例的步骤之一或其组合。
此外,在本申请各个实施例中的各功能单元可以集成在一个处理模块中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。所述集成的模块如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。
上述提到的存储介质可以是只读存储器,磁盘或光盘等。
在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本申请的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不一定指的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任何的一个或多个实施例或示例中以合适的方式结合。
尽管上面已经示出和描述了本申请的实施例,可以理解的是,上述实施例是示例性的,不能理解为对本申请的限制,本领域的普通技术人员在本申请的范围内可以对上述实施例进行变化、修改、替换和变型。