多开关、多业务线设计思考和总结

假设有这样一个业务需求,需要给用户新增短信、微信、app push 的开关。开关0表示关闭,1表示打开。这块如果是你,数据库表你会怎么设计呢?

一 每一个开关一个字段么?

你可能会说这个简单,短信开关用一个字段表示,微信开关用一个字段表示,app push 一个字段表示。如果只有这三个开关,那还好,假设这块来了新的需求说,

再需要给用户新增课前5分钟、课前10分钟开关。。。。,那研发和测试不得疯了。针对上面的问题,有更好的方案么?是有的,可以用一个字段实现多个开关。

二 一个字段如何实现多个开关?

你可能会说这个简单,短信开关打开为1、微信开关打开为2、app push打开为3,这样设计这样设计有问题么?是有的,比如说这个字段的值是3,

你如何判断到底是1+2,也就是短信打开、微信打开还是3,还是 app push打开呢。也就是说3这个字段有两种开关状态,不能唯一表示一种开关状态。

三 如何保证字段的每个取值代表开关的唯一性?

可以使用2的n次方来解决。比如说2的0次方是1,表示短信打开;2的1次方是2,表示微信打开;2的2次方是4,表示 app push 开关。

唯一性:从二进制来说,01表示1,10表示2,100表示4,从二进制这块能看到唯一性。已3为例,就唯一代表短信和微信同时打开状态。

扩展性:下次再来什么课前5分钟、课前10分钟。。。,以此类推,我们可以继续扩展成 8(1000),16(10000)。。。

这块业务上说,如果短信开关打开,需要给用户发送短信,否则不发。那这块我们就需要判断短信开关是否打开。

那这块开关枚举值就是:短信(1)、微信(2)、app push(4)、课前5分钟(8)、课前10分钟(16)。。。。

四 如何判断某一个开关是否打开呢?

可以将字段值与开关枚举值相与,如果说得到的结果是枚举值本身,说明开关打开;如果与的结果是0,说明开关关闭。什么意思呢,我们举例说明:

比如说字段值是7,表示短信、微信、app push 开关打开。

  • 7与1相与,也就是111与001相与得到的结果是1,说明短信开关打开。
  • 7与2相与,也就是111与010相与得到的结果是2,说明微信开关打开。
  • 7与4相与,也就是111与100相与得到的结果是4,说明 app push 打开。

比如说字段是4,表示 app push 开关打开。

  • 4与1相与,也就是100与001相与得到的结果是0,说明短信开关关闭。
  • 4与2相与,也就是100与010相与得到的结果是0,说明微信开关关闭。
  • 4与4相与,也就是100与100相与得到的结果是4,说明 app push 开关打开。

五 如何保证开关数据的正确性和健壮性?

假设我们这块有多个线程对短信开关进行打开操作,我们如何保证数据库最终是在当前值的基础上加1呢?

正确性:如果说并发量不高可以用乐观锁,所谓乐观锁根据版本进行更新。如果并发高,可以用分布式锁。

健壮性短信开关变更之前,一定要确认开关是否已经打开,如果是打开的就没必要打开了,也就没必要进行变更了。

 

多业务线也是类似的设计,比如我们有一个电话,如何知道这个电话在那些业务线注册呢?类似的,假设我们有 A、B、C三条业务线

也是可以定义 A 业务线为1, B 业务线为2,C 业务线为4,假设新来别的业务线,以此类推。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值