Web 服务器中的 Django + Activemq 和长 运行 连接
Django + Activemq and long running connections in the Webserver
多年来我一直在使用 stomp.py 和 stompest 与 activemq 进行通信,效果很好,但这主要是使用独立的 python 守护进程。
我想使用网络服务器中的这两个库与后端进行通信,但我很难找到如何在不为每个请求创建新连接的情况下执行此操作。
在网络服务器中是否有安全处理 TCP 连接的标准方法?在其他语言中,该级别的某种全局对象将用于连接池。
HTTP 是一种同步协议。每个等待的客户端在等待响应时消耗服务器资源(CPU、内存、文件描述符)。这意味着网络服务器 必须 快速响应。响应请求时,HTTP Web 服务器不应 阻塞外部长运行 进程。
解决方案是异步处理请求。有两个主要选项:
使用轮询。
POST
将新任务推送到消息队列:
POST /api/generate_report
{
"report_id": 1337
}
GET
检查 MQ(或数据库)的结果:
GET /api/report?id=1337
{
"ready": false
}
GET /api/report?id=1337
{
"ready": true,
"report": "Lorem ipsum..."
}
Django生态系统中的异步任务通常使用Celery实现,但您可以直接使用任何MQ。
使用 WebSockets。
有用的链接:
- What are Long-Polling, Websockets, Server-Sent Events (SSE) and Comet?
- https://en.wikipedia.org/wiki/Push_technology
- https://www.reddit.com/r/django/comments/4kcitl/help_in_design_for_long_running_requests/
- https://realpython.com/asynchronous-tasks-with-django-and-celery/
- https://blog.heroku.com/in_deep_with_django_channels_the_future_of_real_time_apps_in_django
编辑:
这是一个伪代码示例,说明如何重用与 MQ 的连接:
projectName/appName/services.py
:
import stomp
def create_connection():
conn = stomp.Connection([('localhost', 9998)])
conn.start()
conn.connect(wait=True)
return conn
print('This code will be executed only once per thread')
activemq = create_connection()
projectName/appName/views.py
:
from django.http import HttpResponse
from .services import activemq
def index(request):
activemq.send(message='foo', destination='bar')
return HttpResponse('Success!')
多年来我一直在使用 stomp.py 和 stompest 与 activemq 进行通信,效果很好,但这主要是使用独立的 python 守护进程。
我想使用网络服务器中的这两个库与后端进行通信,但我很难找到如何在不为每个请求创建新连接的情况下执行此操作。
在网络服务器中是否有安全处理 TCP 连接的标准方法?在其他语言中,该级别的某种全局对象将用于连接池。
HTTP 是一种同步协议。每个等待的客户端在等待响应时消耗服务器资源(CPU、内存、文件描述符)。这意味着网络服务器 必须 快速响应。响应请求时,HTTP Web 服务器不应 阻塞外部长运行 进程。
解决方案是异步处理请求。有两个主要选项:
使用轮询。
POST
将新任务推送到消息队列:POST /api/generate_report { "report_id": 1337 }
GET
检查 MQ(或数据库)的结果:GET /api/report?id=1337 { "ready": false } GET /api/report?id=1337 { "ready": true, "report": "Lorem ipsum..." }
Django生态系统中的异步任务通常使用Celery实现,但您可以直接使用任何MQ。
使用 WebSockets。
有用的链接:
- What are Long-Polling, Websockets, Server-Sent Events (SSE) and Comet?
- https://en.wikipedia.org/wiki/Push_technology
- https://www.reddit.com/r/django/comments/4kcitl/help_in_design_for_long_running_requests/
- https://realpython.com/asynchronous-tasks-with-django-and-celery/
- https://blog.heroku.com/in_deep_with_django_channels_the_future_of_real_time_apps_in_django
编辑:
这是一个伪代码示例,说明如何重用与 MQ 的连接:
projectName/appName/services.py
:
import stomp
def create_connection():
conn = stomp.Connection([('localhost', 9998)])
conn.start()
conn.connect(wait=True)
return conn
print('This code will be executed only once per thread')
activemq = create_connection()
projectName/appName/views.py
:
from django.http import HttpResponse
from .services import activemq
def index(request):
activemq.send(message='foo', destination='bar')
return HttpResponse('Success!')