【问题标题】:Not Receiving Message When Publishing using redis in laravel api在 laravel api 中使用 redis 发布时未收到消息
【发布时间】:2020-06-21 05:53:03
【问题描述】:

我使用 laravel api 作为后端,vue 作为前端。 这些是独立项目。当我点击像

这样在 redis 连接后发布的 api 时
$redis = Redis::connection();

$redis->publish('new_message_sent',json_encode($request->all()));

它什么也不做。事实上,当我点击 api(使用邮递员)并返回 $redis 对象时,它返回给我一个空对象。

这里是订阅的节点服务器代码

io.on("connection", function(socket) {
   console.log("Client Connecteddddd");
   var redisClient = redis.createClient();
   redisClient.subscribe("new_message_sent");


   redisClient.on("new_message_sent", function(channel, message) {
       message = JSON.parse(message);
       console.log(message);    
   });

   redisClient.on("disconnect", function() {
       redisClient.quit();
   });
});

【问题讨论】:

    标签: node.js laravel redis publish-subscribe


    【解决方案1】:

    您的订阅代码是什么样的?

    使用 Redis 的 pub/sub 接收端应如下所示:

      Redis::subscribe(['your-channel'], function ($message) {
                echo $message;
            });
    

    这将是一个长期运行的过程。这将运行并回显发布到“您的频道”的任何内容,直到有东西中断它。

    如果您希望将信息发送到最终用户的浏览器,您将需要一个额外的步骤,例如 websocket。

    pub/sub 的性质意味着它永远不会知道在 subscribe() 发生之前发送的消息,只会知道在它运行时发生的消息。

    对于发布,您不需要先解决连接问题。

    Redis::publish('new_message_sent', json_encode($request->all()));
    

    https://laravel.com/docs/master/redis

    【讨论】:

    • 感谢您的回复。我已经用我的订阅代码更新了这个问题。我正在使用节点服务器订阅
    • 所以你没有看到 console.log(message);按预期记录消息?你看到console.log("Client Connecteddddd");日志?由于您有两个不同的技术堆栈,中间有 redis,因此可能值得设置某种 redis 客户端来检查 pub/sub 通道。这将帮助您了解错误是在发布数据还是在订阅频道时出错。
    • 没有。我没有看到这两个控制台但是在我的组件(在 vuejs 中)里面的 connect() 函数(在 socket:{} 里面),我看到一个控制台是 console.log("Socket connected");跨度>
    • 如果我在发布后返回 $redis (in api),它会显示一个空对象。你知道吗?我的意思是它应该显示一些东西而不是空的。我说的对吗?
    • 我在上面的代码中看到您将 Redis::connection() 解析为一个变量并尝试针对该变量调用 publish()。您可能只需要 Redis::publish()。我已经编辑了我的答案以包括这个。这有助于推动它前进吗?
    【解决方案2】:

    我偶然发现了类似的情况,我希望我的 Redis 客户端会收到来自 Laravel 的 Redis Facade 的已发布消息,但它没有。

    我希望Redis::publish('foo', 'bar')redis-cli 中运行SUBSCRIBE foo 时会被选中。

    redis-cli 中运行MONITOR 后,我注意到发布的频道名称与我预期的不同 - {app-name}_database_foo

    这是在redis.options.prefix 键中的database.php 中配置的,默认情况下为env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),,知道这一点/更改这一点会有所帮助。

    【讨论】:

    • 谢谢你。这帮助我理解了为什么 nodejs 中的同一个 redis chanel 没有接收到频道事件
    • 我希望我早点看到这个。非常感谢
    猜你喜欢
    • 2020-01-03
    • 1970-01-01
    • 2021-10-20
    • 2020-12-14
    • 2018-02-26
    • 2019-07-14
    • 2017-08-17
    • 2019-04-20
    • 1970-01-01
    相关资源
    最近更新 更多