ABTestingGateway 的基于分流策略的动态更新来实现动态调度的。
当开发者需要结合自身需求添加新的分流方式时,首先需要为其指定分流策略divPolicy,然后开发分流模块divModule和响应的信息提取模块uesrInfoModule。
下面我们以一个小例子来说明添加新分流方式的方法,我们的新需求是按照请求url的arg参数中的city字段分流。
###为新的分流方式制定分流策略
ABTestingGateway的分流策略有固定格式:
```bash
{
"divtype":"arg_city",
"divdata":[
{"city":"BJ", "upstream":"beta1"},
{"city":"SH", "upstream":"beta2"},
{"city":"TJ", "upstream":"beta1"},
{"city":"CQ", "upstream":"beta3"}]
}
```
分流策略的divtype在下一步是分流模块名的关键部分。
分流策略的divdata是策略内容,由于是按照city字段分流,这种kv形式的策略,在数据库层面可以采用redis的hash实现,在缓存层可以采用ngx_lua的sharedDict实现。
###开发分流模块divModule
ABTestingGateway的分流模块都在**/lib/abtesting/diversion/**文件夹中,其下的每个lua文件是一个分流模块,比如iprange分流方式的分流模块就是**lib/abtesting/diversion/iprange.lua**,而我们的arg_city分流方式根据divtype就是**lib/abtesting/diversion/arg_city.lua**。
分流模块主要有两个功能,一是分流策略的管理功能,包括检查策略合法、添加策略set、读取策略get;二是分流功能getUpstream,这个接口得到用户请求对应的upstream。
arg_city.lua是一个典型Lua Module实现:
```lua
local modulename = "abtestingDiversionArgCity"
local _M = {}
local mt = { __index = _M }
_M._VERSION = "0.0.1"
_M.new = function(self, database, policyLib)
self.database = database
self.policyLib = policyLib
return setmetatable(self, mt)
e