关于定时发短信业务的讨论

关于定时发短信业务的讨论

事情的起因

需求:在每次线下活动的开始的前一天晚上七点给报名参加价值研习社的用户发一条通知短信用户记得准时参加活动。

备注:因为我们的业务并发不是很大,所以很多场景并没有考虑到并发情况下的一些问题,这个需求正好通过crontab执行,并且加上服务器的自动弹性伸缩,所以相当于模拟了一次并发的业务场景。

先简单介绍一下数据库的表结构:

这几个方案都依赖每天晚上七点执行一次corntab。

方案1

根据开讲时间查询活动表是否有满足条件的线下活动,如果有的话,再通过活动id关联到签到表过滤出send_sms字段为0的uid并关联用户表拿出手机号等信息。发送完成后再统一更新send_sms字段。

缺点:在并发业务场景下,可能会产生脏读的情况,造成发送多次短信的情况。

方案2

与方案1很相似,唯一的区别就是查询的时候开启事务用SELECT ... FOR UPDATE ,这种查询语句的区别就是在SELECT的时候把结果行上锁,从而就能避免脏读,然后再同一个事务中UPDATE send_sms字段,最后commit

缺点:由于发短信不是数据库操作,不可回滚。所以如果执行的过程中发生回滚,就会出现短信已经发出去了,但是数据库发生回滚,send_sms字段置为了0,这就产生了矛盾。而且如果是个耗时的任务可能会出现死锁的问题。

以下就是执行的逻辑

BEGIN;
SELECT ... FOR UPDATE;
UPDATE ... SET send_sms = 1;
COMMIT;

方案3

与方案2很相似,唯一的区别就是一条一条的取数据上锁,然后更新send_sms字段。

缺点:要写一个循环一直去查询满足条件但还未发送短信的用户。处理不好容易产生死循环以及死锁的问题。

方案4

这是我目前能想到的最佳方案,直接用SELECT语句选出所有满足条件的手机号码以及短信内容,放入Queue中,然后实现对Queue的处理。处理如下:先用SELECT ... FOR UPDATE 判断send_sms字段的值,如果为0,那就执行发短信,然后更新send_sms字段为1,最后COMMIT 。这样就可以避免多次执行发短信。

总结:对于这种对实时性要求没那么高的业务场景用Queue 还是非常便利的,让Queue 一条一条的处理,在复杂的系统中还起到了削峰和解耦的作用。大家在工作中有哪些对Queue的应用呢?欢迎留言,一起讨论!

大家对上面的这些方案有什么建议呢?欢迎留言讨论!

原文地址:https://www.cnblogs.com/techcoder/p/11327113.html

时间: 2024-11-07 12:06:42

关于定时发短信业务的讨论的相关文章

SpringBoot @Async 异步处理业务逻辑和发短信逻辑

有个业务场景,业务数据审核通过后需要给用户发短信,发短信过程比较耗时,可能需要几秒甚至十几秒,因此使用异步发短信 使用了注解@Async来实现: 1.SpringApplication启用注解@EnableAsync @SpringBootApplication @ImportResource(locations = { "classpath:/spring/spring-*.xml" }) @EnableTransactionManagement(proxyTargetClass=t

PHP通过串口发短信

随技术进步,短信收发领域按时间先后产生了三种模式:BLOCK MODE,基于AT指令的TEXT MODE,基于AT指令的PDU MODE.其中,TEXT MODE比较简单,多款诺基亚手机均支持此款模式.西门子的手机大多数只支持PDU MODE.PDU 模式是收发短信的一种方法,短信正文经过十六进制编码后被传送.目前,PDU已取代BLOCK MODE. SMS是由Etsi所制定的一个规范(GSM 03.40 和GSM 03.38).当使用7-bits编码时,它可以发送最多160个字符;但用8-bi

quartz-job实现实时或定时发送短信任务

存放调度器(Job 和 Trigger)信息的xml配置文件: 这是某个指定的要实现的定时任务: <!-- 每天给项目经理发送短信避免短信服务挂了 定时每天08:30执行--> <job> <name>SendToManagerJob</name> <job-class>com.xxx.cscns.sms.SendToManagerJob</job-class> </job> <trigger> <cro

西门子S7200 PLC发短信应用方案

西门子PLC发短信方案概述 为了实现无人值守,在设备发生故障时,通过短信或者拨号的方式,通知值班人员,在PLC控制系统中获得了广泛的应用.传统的实现方式一般采取通过PLC的通讯口外接短信猫的方式,通过PLC的自由通讯协议,控制PLC发出短信.此类方案缺陷在于: 1.程序复杂,需要熟悉PLC自由协议编程,AT指令集,如果需要发出中文短信,还需要UNICODE编码,非常麻烦,因此,使用短信猫的方式,一般只实现简单的报警. 2.可靠性差,普通短信猫很多并非为恶劣的工业环境设计,多采用国产模块或拆机TC

代码程序给老板发短信时间不对了!

原因 开发突然给我说,给老板发短信的时间不对了!慢了八个小时多点.由于涉及到内部信息,图就不发了. 当时突然到,顿时大悟!UTC问题.呵呵这个简单! 沟通结果: 1.和开发人员沟通了解.是在那一台服务器上的程序,到底写了什么造成这个问题! 2.询问具体什么时间发送,时间误差是多少! 排查思路: 1.通过代码内部程序,定时发信息(可以排除MySQL时间的问题) 2.八个小时差两分钟左右(UTC问题,可是差两分钟这是怎么回事?) 3.系统并不是自己装的,之前发生过UTC问题,系统时间和MySQL时间

【分享】如何通过组态王定时发送短信

我的一个用户在做一个测控项目,是在工控机上使用组态王软件,想在每天的固定时间把温度传感器的温度值作为短信内容发送到他的手机上,以下是具体方案流程: 其实很简单,发送短信就是用DTP_S09C组态软件专用短信模块发送一些简单的命令,通过组态王的专用短信驱动单元的操作即可实现短信收发. 我们通过操作短信驱动中的几个寄存器,写入要发送的内容,要发送的号码等等,就可以完成发短信的功能.需要了解具体方案或者工业其他通信方案的可以去西安达泰电子官网下载http://www.dataie.com/jszx_1

【直播!如何通过组态王定时发送短信】

一位用户在做一个测控项目,在工控机上使用组态王软件,想在每天的固定时间把温度传感器的温度值作为短信内容发送到他的手机上,问我有没有案例参考下. 其实很简单,发送短信就是用DTP_S09C组态软件专用短信模块发送一些简单的命令,通过组态王的专用短信驱动单元的操作即可实现短信收发. 我们通过操作短信驱动中的几个寄存器,写入要发送的内容,要发送的号码等等,就可以完成发短信的功能.详细步骤说明请联系西安达泰电子公司或者加QQ876963800在线索取. 定时发送短信主要是判断何时发送短信,这时候就要用到

松松短信业务正式上线

在经历了一个月开发,一个月内测,两个月公测之后,松松软文平台的"短信营销"功能模块正式上线.除了自用之外,所有的代理商(含黄金.钻石会员)均可免费使用该功能. 所有的代理商均可免费使用该功能模块,拓展新业务渠道.我们采用"先审后发"的原则,也就是您需要先提交"短信内容模板"又管理员审核之后并"给出报价". 目前我们的短信价格和大概在3分-5分/条之间,营销类短信低于行业水平,具体报价需看内容而定,发展的想法是以营销短信为主.短

Android 打电话,发短信,调用系统浏览器

打电话: Intent intent = new Intent(Intent.ACTION_DIAL); intent.setData(Uri.parse("tel:10086")); startActivity(intent); 发短信: SmsManager smsManager=SmsManager.getDefault();//取得短信管理器 /**发简单的文本信息 * destinationAddress: 目标地址,发给谁 * scAddress: 来源的地址,谁发的 *