一个简单的django应用程序,无需任何服务就可以在所有服务器节点上运行精确的函数。
django-serviceless-distributor的Python项目详细描述
Django无服务分销商
django无服务分发服务器是一个库,可以帮助您在没有任何其他服务器的情况下运行确切的函数。
它是怎么工作的?
它只是一个decorator,它接受参数和关键字参数,对它们进行pickle并将它们发送到具有http请求的其他节点。
使用效率高吗?
答案取决于您选择的模式。如果设置了Distributor.bounce_mode = False
,则一个节点需要向所有节点发送数据,但是如果设置了Distributor.bounce_mode = True
(默认设置),则所有节点都将向下一个节点发送数据,以便所有节点只发出一个请求,而不是len(SERVICELESS_DISTRIBUTOR_NODES)
。
安全吗?
它是安全的,因为您将secret_密钥作为机密保存。库使用django.core.signing
对数据进行签名和签名,以确保通过服务器发送数据。但是始终建议配置服务器以限制连接到此终结点的IP。
快速启动
安装库
pip install django-serviceless-distributor
配置您的urls.py
....path("serviceless_distributor",include("django_serviceless_distributor.urls")),....
配置您的settings.py
# Nodes IPs (Do not use load balancer IP, we couldn't know# if all nodes affected if you use load balancer IP)SERVICELESS_DISTRIBUTOR_NODES=["http://10.0.0.0","http://10.0.0.1",....]# Headers to use while sending data# (This can be used to change "Host" to pass ALLOWED_HOSTS restriction)SERVICELESS_DISTRIBUTOR_HEADERS={}
注册要分发的函数
fromserviceless_distributorimportDistributor@Distributor.register_function()defsum_arguments(*args):returnsum(args)# Or lets suppose you want to distribute an imported functionfromsome_moduleimportsome_functionsome_function=Distributor.register_function()(some_function)
(非)常见问题
如何为不同的功能设置不同的节点集?
special_nodes=["http://10.0.0.0","http://10.0.0.1"]@Distributor.register_function(nodes=special_nodes)defsum_arguments(*args):returnsum(args)# Orfromsome_moduleimportsome_functionDistributor.register_function(nodes=special_nodes)(some_function)
我能换条路吗?
是的,您可以更改
Distributor.path
,但也不要忘记根据您所做的更改更改urls.py
。图书馆同时发出多少个请求?
默认为10,但可以通过设置
Distributor.simultaneous_requests
进行更改。attention同时请求意味着将注册的函数分发给其他节点。如果在一行中运行注册函数x次,服务器将发送x次请求。它不会为每个注册的函数运行创建x线程。它堵塞了吗?
no,它使用
concurrent.futures.ThreadPoolExecutor
创建线程并返回已注册函数的输出。为什么我要使用这个而不是其他库?
唯一的原因可能是省钱这就是我创造这个的原因。对我来说,与其他库相比,这不是一个好的解决方案,但至少在没有任何其他服务器的情况下我能做到最好。