多线程多队列问题

多线程多队列问题

单位要实现一个功能,客户端发起一个操作后,服务器要在之后的多个时间发通知到客户端(如1分钟后,10分钟后,20分钟后),当客户端较多时,可能存在同一秒要向很多个客户端发送通知,如何能保证同时发起操作的客户端都能在n秒后准时收到通知。
现在大致上有这么几个思路:

方法1). 保存要操作的数据到数据库

在数据库里记录要发起操作的时间,通过定时任务每秒轮询,发送通知对应客户端。
存在的问题是可能通知会有几秒的误差,但是暂时也可以接受

方法2). 将操作放入延时队列

发起操作后,记录要发送的信息到延时队列,多开些进程,时间到时发送通知到客户端

方法3). 使用多线程

发起操作后,打开一个线程开始倒计时,当时间到的时候发送通知到客户端

请问这三种方法是否可行,后期并发较多及业务要处理的逻辑更多的情况下,那种方式更能准时的向对应的客户端发送信息。
另外想问问有没有别的更好的实现。

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
laravel_peng
最佳答案
1. 类似的场景:

看到你这个问题,我首先想到了,微信支付和支付宝支付的回调请求。他们的逻辑就是,支付成功后,支付方的服务器会定时推送请求到,商户服务器上,时间频率为 1分钟、10分钟、30分钟的推送,直到推送请求返回 success 后不再推送。

2. 上面的三种方法那种好使 ?
  1. 方法一:定时任务 contab 这个肯定好使,最简单的方式。不过我觉得你铁定会用循环去挨个请求到客户端上,这样就耗时。如果能够将要发起操作的时间精确到秒的数据统一查出来,然后批量请求可以减少单次操作的耗时。 打个搬箱子的比喻:(一个人同时搬多个箱子)

  2. 方法二:队列这个也行。但是就单个队列来说,肯定是 one by one 的方式去一个一个的 pop 这个还是有点类似于循环请求。 不过队列好在可以,多开几个队列,比如 1分钟队列、10分钟的队列、和30分钟的队列这样子。打个搬箱子的比喻:(一个人同时搬一个箱子)

  3. 方法三:使用多线程。 这个针对 php 来说的话,用 swoole 的 task 任务,开启多个 work 进程,定时投放任务。其实这个也很快。打个搬箱子的比喻:(多个人同时搬多个箱子)但是还分(多个人中的每个人搬一个还是搬多个的情况)。

  4. 不过方法三如果也是批量发送请求的话,估计更快一些!!!!

3年前 评论
zed11111 (楼主) 3年前
laravel_peng (作者) 3年前
laravel_peng (作者) 3年前
zed11111 (楼主) 3年前
讨论数量: 7
laravel_peng
1. 类似的场景:

看到你这个问题,我首先想到了,微信支付和支付宝支付的回调请求。他们的逻辑就是,支付成功后,支付方的服务器会定时推送请求到,商户服务器上,时间频率为 1分钟、10分钟、30分钟的推送,直到推送请求返回 success 后不再推送。

2. 上面的三种方法那种好使 ?
  1. 方法一:定时任务 contab 这个肯定好使,最简单的方式。不过我觉得你铁定会用循环去挨个请求到客户端上,这样就耗时。如果能够将要发起操作的时间精确到秒的数据统一查出来,然后批量请求可以减少单次操作的耗时。 打个搬箱子的比喻:(一个人同时搬多个箱子)

  2. 方法二:队列这个也行。但是就单个队列来说,肯定是 one by one 的方式去一个一个的 pop 这个还是有点类似于循环请求。 不过队列好在可以,多开几个队列,比如 1分钟队列、10分钟的队列、和30分钟的队列这样子。打个搬箱子的比喻:(一个人同时搬一个箱子)

  3. 方法三:使用多线程。 这个针对 php 来说的话,用 swoole 的 task 任务,开启多个 work 进程,定时投放任务。其实这个也很快。打个搬箱子的比喻:(多个人同时搬多个箱子)但是还分(多个人中的每个人搬一个还是搬多个的情况)。

  4. 不过方法三如果也是批量发送请求的话,估计更快一些!!!!

3年前 评论
zed11111 (楼主) 3年前
laravel_peng (作者) 3年前
laravel_peng (作者) 3年前
zed11111 (楼主) 3年前

这个已经不是php能够解决的了,应该借助于外部的工具 libuv。nodejs 用他实现的异步处理。

搜索 timer 相关的函数。

3年前 评论

我觉得可以将任务放入数据库, 定时任务查询开始时间小于某一个时间点的任务拿出来放入延迟队列

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!