嗨啵 2021-08-15 00:05 采纳率: 0%
浏览 54

分布式系统群发短信问题

数据库中用户信息表现有10万多条用户信息,每条数据都有手机号。现要进行短信群发,使用5台应用服务器一起工作群发短信。
这5台应用服务器是从同一台数据库服务器中的同一张表取用户数据,有哪些办法可以保证这5台应用服务器每一次取的数据不一样?

  • 写回答

3条回答 默认 最新

  • 关注

    简单一点,redis初始化一个任务队列把所以待发送用户塞进去然后依据redis单线程特性消费
    复杂一点参考分布式定时任务,生成待发送资源然后尝试lock,lock成功就消费后把这条资源记录删了

    评论
  • 一只三黄鸡 2021-08-16 10:01
    关注

    把想法简单化,哪有这么多的问题
    给不同服务器进行编号,如0,1,2,3,4
    如果你数据库的id刚好是自增的,那就取模,(id % 5 ) = 结果

    这样id = 1 结果就是 1,id = 2 结果就是2, id = 3 结果就是3 , id =4 结果就是 4, id =5结果就是 0
    这样id = 6 结果就是 1,id = 7 结果就是2, id = 8 结果就是3 , id =9 结果就是 4, 10 =5结果就是 0

    根据结果去多少,就使用哪台编号的服务器发送即可

    评论
  • Winson.J 2021-08-16 10:54
    关注

    用户信息表中加个处理状态字段:值为“00-待发送”,“01-发送中”,“02-发送成功”,“03-发送失败”:
    每个服务器,取“00-待发送”的数据,发送前先修改状态为“01-发送中”;更新条件为 update table set 状态=“01” where id = xxx and 状态=“00”,返回更新条数为“1”的服务器,继续执行发送消息代码。返回更新条数为“0”的服务器停止处理。我觉得在原来的表中应该就有处理状态字段,改起来就很方便,不需要用到redis,mq之类的东西,增加复杂度。

    评论

报告相同问题?

问题事件

  • 修改了问题 8月15日
  • 修改了问题 8月15日
  • 创建了问题 8月15日

悬赏问题

  • ¥30 电脑画面同步投屏,通过同wifi的方式投屏方法,接收投屏端不需要安装第三方软件,
  • ¥15 有偿拼接大疆精灵4RGB影像
  • ¥15 Arduino实现音频混响
  • ¥15 cuda.jit加速报错
  • ¥15 Octave 安装工具箱出错 Only Win32 target is supported!
  • ¥15 docker save的不能在另一台设备运行
  • ¥15 Unity Animation Rigging使用问题
  • ¥15 mbedtls握手返回-7200
  • ¥30 c++ http服务器
  • ¥15 express连接mssql,每条额外附加了语句