PA短信通道限额方案设计

本文介绍了在PA短信通道中设计限额方案的需求背景,强调了防止超额和余量过剩的重要性。通过预扣额度、分布式锁和Redis的使用,保证在高并发场景下的性能和数据库压力管理。设计中采用了lua脚本实现原子性操作,同时通过定时任务优化数据库交互并处理发送失败情况。
摘要由CSDN通过智能技术生成

PA短信通道限额方案设计

需求背景

用户在发送短信时,如果短信走的是PA短信通道,则要对其额度进行限制。额度不足时,成功充值后才可继续使用。

设计原则

  • 防止超额:对业务来说,超额可能意味着资损;对技术来说,超额意味着架构的失败。试想,短信限额10000条,但是却发出去了30000条,那么我们就会面临严重的客诉或资损;
  • 防止余量过剩:与超额相对的是余量过剩,其同样不可小觑。比如,10000条的短信仅有1000条发出去,额度明明还有却已经发不出去,活动未到达预期,前期准备和推广的资金投入都打了水票,而由系统设计缺陷造成的重复扣减 就会导致这种糟糕的情况发生;
  • 高性能:即高并发场景下既要精准限额又不能由于短信限额校验导致整个短信发送流程的qps骤降;
  • 减缓数据库压力:允许客户查看和统计短信额度消耗明细。正常操作是本批次短信发送成功后就存储数据到短信额度消耗明细表,但此操作在高并发或者百万级精选人群包场景下需要频繁的与数据库交互,这无疑会使数据库压力剧增。

流程设计

在这里插入图片描述

数据库设计

t_pa_sms_inventory (短信额度总量表)

列名数据类型描述默认值
idbigint自增主键
tenant_idvarchar租户ID
allocated_numbigint预扣短信条数
available_numbigint可用短信条数
total_numbigint总计短信条数
created_attimestamp创建时间CURRENT_TIMESTAMP
updated_attimestamp修改时间CURRENT_TIMESTAMP
is_deletedtinyint是否已删除。可用值:0(否)、1(是)0

t_pa_sms_quota_log(短信额度使用明细表)

列名数据类型描述默认值
idbigint自增主键
tenant_idvarchar租户ID
biz_idvarchar预扣短信条数
task_idvarchar可用短信条数
costed_numbigint计费短信条数
costed_datevarchar计费短信日期
created_attimestamp创建时间CURRENT_TIMESTAMP
updated_attimestamp修改时间CURRENT_TIMESTAMP
is_deletedtinyint是否已删除。可用值:0(否)、1(是)0

解决方案

既要快又要准

判断可用额度短信发送后扣除额度这两个操作不具备原子性,在高并发场景下可能存在超额问题。采用分布式锁可以完美解决,但是分布式锁会将整个链路串行化,影响短信发送流程的程序性能。

故采用预扣额度概念,将预扣额度+当前预扣额度>可用额度*可超额系数这个操作放到一个lua脚本里面保证原子性运行。

  • redis是单线程模型,天然串行化,会串行执行lua脚本,并不会产生高并发问题
  • redis虽然是单线程模型,但是其吞吐量可达百万级,故不会对短信发送流程的程序性能造成过大影响

降低数据库交互压力

当前批次短信正常发送结束后,将

  • 总可用额度扣除当前批次短信使用额度
  • 总预扣额度释放当前批次预扣额度
  • 采用滑动时间窗口存储短信额度使用明细

以上三个操作合并至一个lua脚本里面保证原子性。

启动定时任务,每五分钟从滑动时间窗口里面拉取数据落库至短信额度使用明细表中,并同步更新短信额度总量表。

注意事项

  1. 当前批次短信发送失败时需要从总预扣额度里面释放掉当前批次的预扣额度

  2. 若当前批次短信发送回执结果未消耗短信额度,需要从总预扣额度里面释放掉当前批次的预扣额度

  3. 可能存在下述这种临界点场景。可用重试+幂等校验方案解决,但是综合考虑到程序复杂性以及影响范围,此场景允许发生。

    • 任务1进来扣除了预扣额度程序正常运转,但是程序还未流转至任务1消耗可用额度
    • 其他任务过来时判断可用额度不足导致发送失败(此时是虚拟扣除,真实可用额度还未被消耗)
    • 任务1执行过程中出现异常并未真正消耗可用额度
  4. lua脚本的执行不支持事务回滚操作,执行过程中出现异常不方便定位和复原数据,综合考虑暂不处理

  • 22
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《火电工程限额设计参考造价指标》是一份指导火电工程设计参考造价的文件,该文件以火电工程的限额设计为基础,结合当前的市场价格情况,提供了一套可参考的造价指标。 首先,该文件的目的是为了统一火电工程设计中的造价标准,确保项目的造价在合理范围内,并提供给设计人员一个参考的依据。该文件主要包括火电工程的各项工程量和造价指标,如设备费、材料费、人工费、机械费等。这些指标的设定是根据火电工程的性质和规模来确定的,能够反映出不同类型和规模火电工程的成本特征。 其次,该文件还考虑了火电工程的地区差异和经济情况差异,为不同地区的火电工程提供了不同的参考造价指标。这样,设计人员可以根据具体情况对指标进行适当调整,以更好地反映当地的市场价格水平,使得项目的造价更加准确。 此外,该文件还提供了对于火电工程设计过程中可能出现的特殊情况的处理建议。例如,对于工程变更、不可预见的因素等情况,该文件提供了相应的误差修正系数,用于调整参考造价,保证项目实施过程中的经济性和可行性。 总的来说,《火电工程限额设计参考造价指标》是一份非常重要的文件,它为火电工程项目提供了一个统一的参考,同时也为设计人员在项目设计过程中提供了一定的灵活性和可操作性,确保火电工程的造价以及项目的经济效益得到有效控制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值