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