在Laravel中订阅Redis Pub/Sub的位置在哪里?

3
我在我的应用程序中使用Redis's Pub/Sub,目前效果很好。我能够从Laravel发送发布到一个不同的后端进程进行订阅,并最终将事件发布回Laravel。
对于用户而言,使用情况如下:
提交表单 -> 等待响应(几分钟)-> 继续交易
在后端方面,表单发布到路由上,然后到控制器,将其发布到第三方订阅频道(频道一),最终第三方会再次发布(频道二)
主要问题:我不知道订阅频道二并处理发布内容的适当位置。
理想情况下,我能以两种方式处理发布请求:
1.让用户知道他们的表单已被处理,并可以进入下一步(可能通过Vue组件属性更新) 2.将发布信息存储到我的数据库中。
在文档中,将其放在一个命令中,如果我在这里尝试使用它,它会像这样:
public function handle()
{
    Redis::subscribe('channel-two', function ($message) {
        // update the client so that the user moves on
        // send $message contents to the database
    });
}

但是这对我来说似乎并不理想,因为我希望这个频道能够24/7订阅,始终保持监听状态。即使它在一个命令中,我也很清楚如何最好地更新客户端。

在我的Laravel项目中,我应该在哪里进行订阅?有没有最佳实践来响应这些事件?

1个回答

3

Redis::subscribe 用于监听指定的频道,这个命令用在类似于上面的例子一样需要持续监听的场景下。

参考文档如下:

首先,我们将使用 subscribe 方法设置一个频道监听器。由于调用 subscribe 方法会启动一个长时间运行的进程,因此我们将把此方法调用放在 Artisan 命令中:

您需要像文档描述运行队列监听器一样,使用诸如 supervisor 或 pm2 等进程管理器来运行该命令。


那么您仍然建议将其放在命令中吗?我想这对于24/7运行很有效。您有什么办法可以使该事件更新我的客户端? - MintMelt
是的,我已经通过命令运行了类似服务。为了让客户端接收到事件,您需要运行一个服务器,将通知广播到订阅适当频道的客户端。Laravel Echo 是该框架提供的处理接收通知的工具,而像 laravel-echo-serverpusher 和最近的 laravel-websockets 等应用程序则处理广播。 - Brian Lee
顺便提一下,我最近在一个重要项目中集成了 laravel-websockets,并且对结果非常满意。它是专门为 Laravel 设计的用于替代 Pusher 的插件。我强烈建议您首先了解一下它。 - Brian Lee
这些不都是Redis的替代品吗?我觉得Redis的发布/订阅已经满足了我99%的需求,所以为了将发布传递到客户端,引入一个完全不同的库并不感觉合适。 - MintMelt
不,它们是用于客户端-服务器通信的WebSocket库。Redis仍然是系统的一个重要组成部分。 - Brian Lee
好的,非常感谢。我一定会尝试使用 laravel-websockets。请问还需要使用 Laravel Echo 吗?或者我可以直接通过我的 Pub/Sub 命令监听,然后使用 laravel-websockets 更新客户端吗? - MintMelt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接