我有一个应用程序,其中一个请求进入Django视图,需要通过socekt与Freeswitch进行通信。我希望套接字已打开,因为我需要先授权等等。并保持某种队列,所有视图都会用来将请求推送到此套接字并获得结果。
我在哪里可以初始化这种套接字/队列?我应该使用Celery和消息队列来解决这个问题吗?
答案 0 :(得分:1)
这取决于(我喜欢这么说......)但严重的是,要设计这样的架构,你需要分析很多因素,主要是因为你有2个问题:
如果您将有一个处理所有请求和零并发的进程 - 那么根本没有问题 - 您将保持一个套接字打开并在整个程序运行期间需要时重新打开。但这是不真实的情况。
如果只能打开一个套接字,则必须有一个请求队列。这意味着,您的所有django代码必须是异步的,不能有应用程序等待答案的选项,而是简单检查任务的状态。
Celery可以在这里使用,但它不是为了保持套接字打开而设计的,因为芹菜本身可能会产生几个工作进程 - 所以它们不能轻易地在它们之间共享套接字。使用线程,greenlet等可能会有所帮助,但仍然 - 这不是为了保持连接打开。
所以你会得到的是编写自己的守护进程,我建议把它写成一个管理命令,它可以管理这样的连接并从主应用程序接受数据。 在这种情况下,您必须实现一个队列,因此不需要芹菜。