有谁会开发微信模板消息推送队列的吗?

2018-03-02 09:20:52 +08:00
 TANKING
有谁会开发微信模板消息推送队列的吗?因为一次性推送到几千个用户,只能用消息队列,如果用 for 循环,遍历的方式,会造成 php 运行超时。
7413 次点击
所在节点    程序员
41 条回复
SourceMan
2018-03-02 09:32:28 +08:00
wccc
2018-03-02 09:44:36 +08:00
...有啥难的 简单点 一个线程从 redis 列表取数据 再推送就好了
liyaojian
2018-03-02 10:01:31 +08:00
送分题,典型的队列应用场景
chinafeng
2018-03-02 10:45:55 +08:00
为什么会使用 for 循环...
dangyuluo
2018-03-02 10:46:45 +08:00
beanstalkd,rabbitMQ,太多了
zonyitoo
2018-03-02 10:47:04 +08:00
居然想到的是用 for 循环…………………………醉
TANKING
2018-03-02 12:02:10 +08:00
谁有一些例子可以看看?
jswh
2018-03-02 12:10:59 +08:00
这种都用不到那么重的队列,几千个用户......。你的 php 超时是因为在 fpm 里超时吧。你把用户取到之后写到一个文本文件里面,然后在 cli 下跑就好了。如果量不多,手动跑跑也行,或者就写个 cron 定时检查有没有需要跑推送的文件,记得开始推送了对这个文件打个锁标记避免重复推送就好了。
odirus
2018-03-02 12:34:00 +08:00
那啥啥啥,小项目,完全可以就地取材,MySQL 也可以很好地实现消息队列的。。。反正我们小项目都用 MySQL 做消息队列了,多一个组件,多一份危险;大项目再上 MQ,保证 MQ 的高可用性需要花很多精力的。

假设数据表 tab_task 大致这样的:
seq_id, is_active, create_time, update_time

其中 is_active = 0 标示待消费的,is_active = 1 表示正在被处理,is_active = 2 标示已经处理好的。

--------------------------------------------------
正常消费线程,获取一个待处理任务(在一个事务中执行):

UPDATE tab_task SET `is_active` = 1 AND `seq_id` = LAST_INSERT_ID(`seq_id`)
WHERE AND `is_active` = 0
ORDER BY `seq_id` ASC LIMIT 1;

SELECT * FROM tab_task
WHERE ROW_COUNT() > 0 AND `seq_id` = LAST_INSERT_ID();

----------------------------------------------------

定期检查超时的任务,然后发送报警,获取一个超时的任务(假设超时时间为 5 分钟):

SELECT * FROM tab_task
WHERE is_active = 1 AND NOW() > DATE_ADD(`update_time`, INTERVAL 5 MINUTE)


--------------------------------------------------
odirus
2018-03-02 12:35:18 +08:00
只要面向接口编程,以后把 MySQL 队列替换成 MQ 队列就很方便
Enochyun
2018-03-02 12:42:08 +08:00
用 php 脚本跑啊
opengps
2018-03-02 13:30:26 +08:00
for 循环不是不可以,但是得用独立的线程,控制避免 cpu 连续争用
shuye00123
2018-03-02 13:42:02 +08:00
为什么要用队列啊,放线程池去运行就好了
qce7
2018-03-02 13:42:48 +08:00
cli 执行就行了
TANKING
2018-03-02 13:49:25 +08:00
@qce7 cli 执行就不会超时的吗?
zjsxwc
2018-03-02 13:50:14 +08:00
cli 执行怎么会超时
loveCoding
2018-03-02 13:51:08 +08:00
直接放 redis 吧 ,效率高,不占内存
alinwu05
2018-03-02 13:51:38 +08:00
这样推送会被微信取消消息模板功能的!!
jjww
2018-03-02 14:03:27 +08:00
@odirus #9
小项目用 Redis 的 Pub/Sub 或者 List 做消息队列更合适.
对比你的 MySQL 解决方案, 看起来是引入了第三方组件, 其实降低了开发复杂度, 并且稳定性以及效率上提高了不少.

消息的生产者和消费者是不同的进程, 在功能上是解耦的.另外建议对消息用 msgpack 处理一下, 生产者 pack 消费者 unpack.

项目大的话建议用 RabbitMQ 等更成熟的解决方案.
TANKING
2018-03-02 14:15:34 +08:00
经测试,用 cli 是可以,不会超时,但是我要做成一个网页版系统,只能用消息队列了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/434121

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX