❓❓❓关于消息通知的一些疑问讨论
需求是:给公众号推送消息、小程序推送消息、数据库记录并在页面可以查询显示消息,未来会增加app消息推送
我的想法:
利用laravel自带的消息通知【https://learnku.com/docs/laravel/9.x/notifications/12234】,
根据业务分别创建通知【php artisan make:notification XXX】,举例:违规通知、奖励通知、聊天通知等等
每个通知类都有一个 via 方法,分别创建公众号消息通道、小程序消息通道、数据的通道,如果有别的端就继续增加通道
每个通知类里面都会初始化一个data,这个data的格式按公众号消息模板,其他通道接收到再转换
消息未读这些功能自带
我的顾虑:
1、消息通知发送【$user->notify(new InvoicePaid($invoice));】意味发送都要查询user模型出来,但有些业务专门查一下user再发送,感觉有点浪费🤔,例如:A给B点了个赞,就需要查询B的user模型再发送,不知道有没有不需要查询user模型发送的方式
2、如果同时给很多人发送?例如:A发了一个帖子,要推送给所有关注A的人,假设有1000人关注,那是要遍历发送吗?
考虑下把消息处理系统弄成常驻,这样的话可以处理数据在内存里常驻
说下主播发帖,粉丝得到消息的场景吧,可能相对贴合你的问题
主播发帖后,粉丝都要收到消息或者推送等
我觉得如果关注的人太多,如果 loop 及时发送的话不是一个很好的解决方案,或者说对于我来说 可能对关注量不是很清楚,如果有数量非常大的数据一下子需要处理,我可能在响应时间内处理不完,etc。。。
最典型的消息队列解耦业务场景,最典型的 事件 解耦场景。 但是 如果你使用 Laravel 框架,你会发现 事件和队列可以是一个东西
创建事件 PostPublishedEvent , 接受
$post, $user
作为事件结构体。伪代码
创建 Listener PushNoticeToFans 并实现
ShouldQueue
这里请自行参照文档,仅仅是将 listener 置于 queue 执行,不会占用前台用户响应时间。这个监听器的作用仅仅是用来调度任务,并不会执行发送的行为,这个事件的意义在于 帮你找到所有关注这个主播的用户,以及构建一条稳定的发送内容。
伪代码如下
创建一个 QueueJob 用来发送消息 至于你发送消息的流程你自己来吧。。
后面可以添加一个 systemd 来守护进程 或者是 supervisor,不要用定时任务就好了
systemd 样例