【问题标题】:Servicestack.Redis Pub/Sub limitations with other nested Redis commandsServicestack.Redis Pub/Sub 对其他嵌套 Redis 命令的限制
【发布时间】:2014-07-06 05:12:51
【问题描述】:

我在使用 ServiceStack 和 Redis 方面拥有丰富的经验,但我对线程中的 ThreadPool 和 Pub/Sub 感到困惑,并且在消息回调中访问 Redis 存在明显的限制。我得到的实际错误表明我只能在“当前上下文”中调用“订阅”或“发布”。当我尝试从消息回调中执行另一个 Redis 操作时会发生这种情况。

我有一个必须连续运行的进程。在我的情况下,我不能只服务一次请求,而是必须让线程一直保持活动状态进行计算(并且从 REST API 路由控制这些线程是理想的)。数据必须定期进入流程,并且必须发布数据。该过程还必须从 Redis 存储和检索数据。我正在使用路由和服务来获取数据并将其存储在 Redis 中,因此这必须与“计算”过程异步进行。我认为 pub/sub 是将各个部分粘合在一起的答案,但到目前为止这似乎是不可能的。

这是我的代码当前的结构(出现上述错误的代码)。这是启动长期“计算”线程的路由的回调:

    public object Get(SystemCmd request)
    {
        object ctx = new object();
        TradingSystemCmd SystemCmd = new TradingSystemCmd(request, ctx);

        ThreadPool.QueueUserWorkItem(x =>
        {
            SystemCmd.signalEngine();
        });
        return (retVal);  // retVal defined elsewhere
    }

这里是 SystemCmd.signalEngine():

       public void signalEngine(){

        using (var subscription = Redis.CreateSubscription())
        {            
            subscription.OnSubscribe = channel =>
            {
            };

            subscription.OnUnSubscribe = channel =>
            {
            };

            subscription.OnMessage = (channel, msg) =>
            {

                    TC_CalcBar(channel, redisTrade);

            };


            subscription.SubscribeToChannels(dmx_key); //blocking
        }
    }

“TC_CalcBar”调用会在数据可用时对其进行处理。在此调用中调用 Redis 以进行常规数据库访问(和错误)。我可以做的是删除订阅并使用另一种方法来阻止 Redis 中可用的数据。但目前的方法似乎相当不错,直到它失败了。 :-)

我也不知道ThreadPool是否与错误有关。

【问题讨论】:

  • 我已经通过测试确认 Sub 回调仅限于 Pub / Sub 操作,至少在同一个 Redis 连接上。我有点惊讶这不是一个更大的话题,因为我从未见过任何关于它的帖子。很高兴知道您是否可以建立不同的 Redis 连接并以这种方式访问​​数据库?
  • 我知道这是一个旧线程,但是是的,您在评论中描述的是正确的方法;留下一个 RedisClient 专用于订阅,并在收到您的信号后使用另一个从 Redis 读取/写入。

标签: redis servicestack threadpool publish-subscribe


【解决方案1】:

根据 Redis 文档:

一旦客户端进入订阅状态,它不应该 发出任何其他命令,除了额外的 SUBSCRIBE、PSUBSCRIBE、 UNSUBSCRIBE 和 PUNSUBSCRIBE 命令。

来源:http://redis.io/commands/subscribe

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-09
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    • 2016-01-18
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多