sogou / workflow

C++ Parallel Computing and Asynchronous Networking Framework
Apache License 2.0
13.07k stars 2.41k forks source link

关于redis sub/pub问题 #1588

Closed sgfcz closed 1 month ago

sgfcz commented 3 months ago

关于redis我可以进行task的挂起,等待redis服务器或者其他reids task进行publish的时候收到数据吗

Barenboim commented 3 months ago

你好。我们的任务支持watch_timeout,你可以先试一下能不能解决。

task->set_watch_timeout(100000);   // 第一个回复包最多等100秒。

不过,依然是一来一回的逻辑。如果是一个请求,多个回复,需要扩展一下。

sgfcz commented 3 months ago

你好。我们的任务支持watch_timeout,你可以先试一下能不能解决。

task->set_watch_timeout(100000);   // 第一个回复包最多等100秒。

不过,依然是一来一回的逻辑。如果是一个请求,多个回复,需要扩展一下。

可能是我没太说清楚,a task执行redis sub指令的时候,redis服务器就会返回一个告诉你sub成功的resp,这个时候a task就没了,那这个时候redis服务器主动resp的时候他就没链接去resp了

Barenboim commented 3 months ago

你好。我们的任务支持watch_timeout,你可以先试一下能不能解决。

task->set_watch_timeout(100000);   // 第一个回复包最多等100秒。

不过,依然是一来一回的逻辑。如果是一个请求,多个回复,需要扩展一下。

可能是我没太说清楚,a task执行redis sub指令的时候,redis服务器就会返回一个告诉你sub成功的resp,这个时候a task就没了,那这个时候redis服务器主动resp的时候他就没链接去resp了

明白。之前我们这边没有人使用这个功能,所以我理解错了redis订阅的模式。 这个需求我们接了,打算给redis client加上这个功能。还需要做一些设计工作。

sgfcz commented 3 months ago

关于redis我可以进行task的挂起,等待redis服务器或者其他reids task进行publish的时候收到数据吗

我现在使用了redis++的库,发现了更多细节就是,在启动过后,链接不能断的同时,还得写个死循环去不断的找服务器获取通道里面的最新数据

Barenboim commented 3 months ago

关于redis我可以进行task的挂起,等待redis服务器或者其他reids task进行publish的时候收到数据吗

我现在使用了redis++的库,发现了更多细节就是,在启动过后,链接不能断的同时,还得写个死循环去不断的找服务器获取通道里面的最新数据

死循环里,需要发请求吗?还是只是看看有没有数据被推过来?

sgfcz commented 3 months ago

关于redis我可以进行task的挂起,等待redis服务器或者其他reids task进行publish的时候收到数据吗

我现在使用了redis++的库,发现了更多细节就是,在启动过后,链接不能断的同时,还得写个死循环去不断的找服务器获取通道里面的最新数据

死循环里,需要发请求吗?还是只是看看有没有数据被推过来?

要做一个叫做consume得操作,类似于一个请求吧,然后redis服务器才会把数据给你,但是你的连接不能断,因为每个连接,服务器都会记录下来,你消费得时候,服务器才知道是给你

sgfcz commented 3 months ago

但是这个consume具体背后操作了什么,这几天一直在整业务代码,没时间去探究

Barenboim commented 3 months ago

没事,我们看了文档,还比较简单。

sgfcz commented 3 months ago

没事,我们看了文档,还比较简单。

关于这个我还有个问题想请教下,关于单独开线程,不用std::thread,用wffuture有具体例子吗 因为比如这个一直consume得这个死循环我就是在另一个线程用的,我今天下午突然想起来你们不建议这样,代码是: std::shared_ptr thread = std::make_shared(runfuction, this);

void this::runfuncation() { while (flag) { redis++.consume(); sleep(10); } }

Barenboim commented 3 months ago

你自己开线程没有什么问题啊。如果你自己的异步任务要和workflow的任务流结合,可以用WFCounterTask。你看一下计数器相关的文档。

Barenboim commented 3 months ago

Sub/pub的功能我们还在开发中,希望做得自然一点,需要绕一大圈。

sgfcz commented 3 months ago

WFCounterTask

好的

Barenboim commented 2 months ago

@sgfcz https://github.com/sogou/workflow/pull/1608

Barenboim commented 1 month ago

可以看一下这个文档和示例代码:https://github.com/sogou/workflow/blob/master/docs/tutorial-18-redis_subscriber.md

sgfcz commented 1 month ago

懂了,找时间试一试